blob: 808483ebd7bf439ebe1a7f382f594ad87e7daf3f [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Hai Shi5dd21f52020-04-21 00:49:13 +080013
Victor Stinner5c75f372019-04-17 23:02:26 +020014#undef Py_BUILD_CORE_MODULE
Hai Shi5dd21f52020-04-21 00:49:13 +080015/* Always enable assertions */
16#undef NDEBUG
Victor Stinner5c75f372019-04-17 23:02:26 +020017
Neal Norwitz8866e0a2007-10-27 04:01:17 +000018#define PY_SSIZE_T_CLEAN
19
Tim Peters9ea17ac2001-02-02 05:57:15 +000020#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000021#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020022#include "marshal.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020023#include "structmember.h" // PyMemberDef
Victor Stinnera1c249c2018-11-01 03:15:58 +010024#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020025#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000026
Victor Stinner95e9cef2015-03-28 01:26:47 +010027#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020028# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010029#endif
30
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020031#ifdef HAVE_SYS_WAIT_H
32#include <sys/wait.h> /* For W_STOPCODE */
33#endif
34
Victor Stinner5ed69952018-11-06 15:59:52 +010035#ifdef Py_BUILD_CORE
36# error "_testcapi must test the public Python C API, not CPython internal C API"
37#endif
38
Eddie Elizondoff023ed2019-09-11 05:17:13 -040039static struct PyModuleDef _testcapimodule;
40
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000042
Tim Peters91621db2001-06-12 20:10:01 +000043/* Raise TestError with test_name + ": " + msg, and return NULL. */
44
45static PyObject *
46raiseTestError(const char* test_name, const char* msg)
47{
Victor Stinner6ced7c42011-03-21 18:15:42 +010048 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000050}
51
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000052/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000053
54 The ones derived from autoconf on the UNIX-like OSes can be relied
55 upon (in the absence of sloppy cross-compiling), but the Windows
56 platforms have these hardcoded. Better safe than sorry.
57*/
58static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000059sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000061{
Victor Stinner499dfcf2011-03-21 13:26:24 +010062 PyErr_Format(TestError,
63 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000066}
67
68static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053069test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000070{
Tim Peters9ea17ac2001-02-02 05:57:15 +000071#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (FATNAME != sizeof(TYPE)) \
73 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 CHECK_SIZEOF(SIZEOF_SHORT, short);
76 CHECK_SIZEOF(SIZEOF_INT, int);
77 CHECK_SIZEOF(SIZEOF_LONG, long);
78 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
79 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070080 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000081
82#undef CHECK_SIZEOF
83
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020084 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000085}
86
Tim Peters5c4d5bf2001-02-12 22:13:26 +000087static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053088test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010089{
Ned Deilye37a1942015-03-05 15:47:10 -080090#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020091#pragma GCC diagnostic push
92#pragma GCC diagnostic ignored "-Wtype-limits"
93#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010094#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010095 if (EXPECTED != sizeof(TYPE)) { \
96 PyErr_Format(TestError, \
97 "sizeof(%s) = %u instead of %u", \
98 #TYPE, sizeof(TYPE), EXPECTED); \
99 return (PyObject*)NULL; \
100 }
Victor Stinnerf866f972013-10-29 19:59:31 +0100101#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
102#define CHECK_SIGNNESS(TYPE, SIGNED) \
103 if (IS_SIGNED(TYPE) != SIGNED) { \
104 PyErr_Format(TestError, \
105 "%s signness is, instead of %i", \
106 #TYPE, IS_SIGNED(TYPE), SIGNED); \
107 return (PyObject*)NULL; \
108 }
Victor Stinner01076552013-10-29 19:39:52 +0100109
110 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(Py_UCS1, 1);
112 CHECK_SIZEOF(Py_UCS2, 2);
113 CHECK_SIZEOF(Py_UCS4, 4);
114 CHECK_SIGNNESS(Py_UCS1, 0);
115 CHECK_SIGNNESS(Py_UCS2, 0);
116 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700117 CHECK_SIZEOF(int32_t, 4);
118 CHECK_SIGNNESS(int32_t, 1);
119 CHECK_SIZEOF(uint32_t, 4);
120 CHECK_SIGNNESS(uint32_t, 0);
121 CHECK_SIZEOF(int64_t, 8);
122 CHECK_SIGNNESS(int64_t, 1);
123 CHECK_SIZEOF(uint64_t, 8);
124 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100125
126 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100127 CHECK_SIZEOF(size_t, sizeof(void *));
128 CHECK_SIGNNESS(size_t, 0);
129 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
130 CHECK_SIGNNESS(Py_ssize_t, 1);
131
Benjamin Petersonca470632016-09-06 13:47:26 -0700132 CHECK_SIZEOF(uintptr_t, sizeof(void *));
133 CHECK_SIGNNESS(uintptr_t, 0);
134 CHECK_SIZEOF(intptr_t, sizeof(void *));
135 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100136
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200137 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100138
Victor Stinnerf866f972013-10-29 19:59:31 +0100139#undef IS_SIGNED
140#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100141#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800142#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200143#pragma GCC diagnostic pop
144#endif
Victor Stinner01076552013-10-29 19:39:52 +0100145}
146
147
148static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530149test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 PyObject* list;
152 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000155#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 list = PyList_New(NLIST);
157 if (list == (PyObject*)NULL)
158 return (PyObject*)NULL;
159 /* list = range(NLIST) */
160 for (i = 0; i < NLIST; ++i) {
161 PyObject* anint = PyLong_FromLong(i);
162 if (anint == (PyObject*)NULL) {
163 Py_DECREF(list);
164 return (PyObject*)NULL;
165 }
166 PyList_SET_ITEM(list, i, anint);
167 }
168 /* list.reverse(), via PyList_Reverse() */
169 i = PyList_Reverse(list); /* should not blow up! */
170 if (i != 0) {
171 Py_DECREF(list);
172 return (PyObject*)NULL;
173 }
174 /* Check that list == range(29, -1, -1) now */
175 for (i = 0; i < NLIST; ++i) {
176 PyObject* anint = PyList_GET_ITEM(list, i);
177 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
178 PyErr_SetString(TestError,
179 "test_list_api: reverse screwed up");
180 Py_DECREF(list);
181 return (PyObject*)NULL;
182 }
183 }
184 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000185#undef NLIST
186
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000188}
189
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000190static int
191test_dict_inner(int count)
192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 Py_ssize_t pos = 0, iterations = 0;
194 int i;
195 PyObject *dict = PyDict_New();
196 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 if (dict == NULL)
199 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 for (i = 0; i < count; i++) {
202 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200203 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200204 return -1;
205 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200206 if (PyDict_SetItem(dict, v, v) < 0) {
207 Py_DECREF(v);
208 return -1;
209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 Py_DECREF(v);
211 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 while (PyDict_Next(dict, &pos, &k, &v)) {
214 PyObject *o;
215 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 i = PyLong_AS_LONG(v) + 1;
218 o = PyLong_FromLong(i);
219 if (o == NULL)
220 return -1;
221 if (PyDict_SetItem(dict, k, o) < 0) {
222 Py_DECREF(o);
223 return -1;
224 }
225 Py_DECREF(o);
226 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 if (iterations != count) {
231 PyErr_SetString(
232 TestError,
233 "test_dict_iteration: dict iteration went wrong ");
234 return -1;
235 } else {
236 return 0;
237 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238}
239
240static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530241test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 for (i = 0; i < 200; i++) {
246 if (test_dict_inner(i) < 0) {
247 return NULL;
248 }
249 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000250
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200251 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000252}
253
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200254static PyObject*
255dict_getitem_knownhash(PyObject *self, PyObject *args)
256{
257 PyObject *mp, *key, *result;
258 Py_ssize_t hash;
259
260 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
261 &mp, &key, &hash)) {
262 return NULL;
263 }
264
265 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
266 if (result == NULL && !PyErr_Occurred()) {
267 _PyErr_SetKeyError(key);
268 return NULL;
269 }
270
271 Py_XINCREF(result);
272 return result;
273}
Tim Peters91621db2001-06-12 20:10:01 +0000274
Victor Stinner3d3f2642016-12-15 17:21:23 +0100275static PyObject*
276dict_hassplittable(PyObject *self, PyObject *arg)
277{
278 if (!PyDict_Check(arg)) {
279 PyErr_Format(PyExc_TypeError,
280 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100281 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100282 return NULL;
283 }
284
285 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
286}
287
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000288/* Issue #4701: Check that PyObject_Hash implicitly calls
289 * PyType_Ready if it hasn't already been called
290 */
291static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 PyVarObject_HEAD_INIT(NULL, 0)
293 "hashinheritancetester", /* Name of this type */
294 sizeof(PyObject), /* Basic object size */
295 0, /* Item size for varobject */
296 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200297 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 0, /* tp_getattr */
299 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200300 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 0, /* tp_repr */
302 0, /* tp_as_number */
303 0, /* tp_as_sequence */
304 0, /* tp_as_mapping */
305 0, /* tp_hash */
306 0, /* tp_call */
307 0, /* tp_str */
308 PyObject_GenericGetAttr, /* tp_getattro */
309 0, /* tp_setattro */
310 0, /* tp_as_buffer */
311 Py_TPFLAGS_DEFAULT, /* tp_flags */
312 0, /* tp_doc */
313 0, /* tp_traverse */
314 0, /* tp_clear */
315 0, /* tp_richcompare */
316 0, /* tp_weaklistoffset */
317 0, /* tp_iter */
318 0, /* tp_iternext */
319 0, /* tp_methods */
320 0, /* tp_members */
321 0, /* tp_getset */
322 0, /* tp_base */
323 0, /* tp_dict */
324 0, /* tp_descr_get */
325 0, /* tp_descr_set */
326 0, /* tp_dictoffset */
327 0, /* tp_init */
328 0, /* tp_alloc */
329 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000330};
331
332static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530333test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 PyTypeObject *type;
336 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000337 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (type->tp_dict != NULL)
342 /* The type has already been initialized. This probably means
343 -R is being used. */
344 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000345
346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 obj = PyObject_New(PyObject, type);
348 if (obj == NULL) {
349 PyErr_Clear();
350 PyErr_SetString(
351 TestError,
352 "test_lazy_hash_inheritance: failed to create object");
353 return NULL;
354 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 if (type->tp_dict != NULL) {
357 PyErr_SetString(
358 TestError,
359 "test_lazy_hash_inheritance: type initialised too soon");
360 Py_DECREF(obj);
361 return NULL;
362 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 hash = PyObject_Hash(obj);
365 if ((hash == -1) && PyErr_Occurred()) {
366 PyErr_Clear();
367 PyErr_SetString(
368 TestError,
369 "test_lazy_hash_inheritance: could not hash object");
370 Py_DECREF(obj);
371 return NULL;
372 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 if (type->tp_dict == NULL) {
375 PyErr_SetString(
376 TestError,
377 "test_lazy_hash_inheritance: type not initialised by hash()");
378 Py_DECREF(obj);
379 return NULL;
380 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (type->tp_hash != PyType_Type.tp_hash) {
383 PyErr_SetString(
384 TestError,
385 "test_lazy_hash_inheritance: unexpected hash function");
386 Py_DECREF(obj);
387 return NULL;
388 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000393}
394
395
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700396/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000397 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000398
399 Note that the meat of the test is contained in testcapi_long.h.
400 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700401 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000402 dependence on type names makes it impossible to use a parameterized
403 function. A giant macro would be even worse than this. A C++ template
404 would be perfect.
405
406 The "report an error" functions are deliberately not part of the #include
407 file: if the test fails, you can set a breakpoint in the appropriate
408 error function directly, and crawl back from there in the debugger.
409*/
410
411#define UNBIND(X) Py_DECREF(X); (X) = NULL
412
413static PyObject *
414raise_test_long_error(const char* msg)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000417}
418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419#define TESTNAME test_long_api_inner
420#define TYPENAME long
421#define F_S_TO_PY PyLong_FromLong
422#define F_PY_TO_S PyLong_AsLong
423#define F_U_TO_PY PyLong_FromUnsignedLong
424#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000425
426#include "testcapi_long.h"
427
428static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530429test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000432}
433
434#undef TESTNAME
435#undef TYPENAME
436#undef F_S_TO_PY
437#undef F_PY_TO_S
438#undef F_U_TO_PY
439#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000440
Tim Peters91621db2001-06-12 20:10:01 +0000441static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000442raise_test_longlong_error(const char* msg)
443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000445}
446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700448#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449#define F_S_TO_PY PyLong_FromLongLong
450#define F_PY_TO_S PyLong_AsLongLong
451#define F_U_TO_PY PyLong_FromUnsignedLongLong
452#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000453
454#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000455
456static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000457test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000460}
461
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000462#undef TESTNAME
463#undef TYPENAME
464#undef F_S_TO_PY
465#undef F_PY_TO_S
466#undef F_U_TO_PY
467#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000468
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000469/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
470 is tested by test_long_api_inner. This test will concentrate on proper
471 handling of overflow.
472*/
473
474static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530475test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 PyObject *num, *one, *temp;
478 long value;
479 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 /* Test that overflow is set properly for a large value. */
482 /* num is a number larger than LONG_MAX even on 64-bit platforms */
483 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
484 if (num == NULL)
485 return NULL;
486 overflow = 1234;
487 value = PyLong_AsLongAndOverflow(num, &overflow);
488 Py_DECREF(num);
489 if (value == -1 && PyErr_Occurred())
490 return NULL;
491 if (value != -1)
492 return raiseTestError("test_long_and_overflow",
493 "return value was not set to -1");
494 if (overflow != 1)
495 return raiseTestError("test_long_and_overflow",
496 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* Same again, with num = LONG_MAX + 1 */
499 num = PyLong_FromLong(LONG_MAX);
500 if (num == NULL)
501 return NULL;
502 one = PyLong_FromLong(1L);
503 if (one == NULL) {
504 Py_DECREF(num);
505 return NULL;
506 }
507 temp = PyNumber_Add(num, one);
508 Py_DECREF(one);
509 Py_DECREF(num);
510 num = temp;
511 if (num == NULL)
512 return NULL;
513 overflow = 0;
514 value = PyLong_AsLongAndOverflow(num, &overflow);
515 Py_DECREF(num);
516 if (value == -1 && PyErr_Occurred())
517 return NULL;
518 if (value != -1)
519 return raiseTestError("test_long_and_overflow",
520 "return value was not set to -1");
521 if (overflow != 1)
522 return raiseTestError("test_long_and_overflow",
523 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* Test that overflow is set properly for a large negative value. */
526 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
527 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
528 if (num == NULL)
529 return NULL;
530 overflow = 1234;
531 value = PyLong_AsLongAndOverflow(num, &overflow);
532 Py_DECREF(num);
533 if (value == -1 && PyErr_Occurred())
534 return NULL;
535 if (value != -1)
536 return raiseTestError("test_long_and_overflow",
537 "return value was not set to -1");
538 if (overflow != -1)
539 return raiseTestError("test_long_and_overflow",
540 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Same again, with num = LONG_MIN - 1 */
543 num = PyLong_FromLong(LONG_MIN);
544 if (num == NULL)
545 return NULL;
546 one = PyLong_FromLong(1L);
547 if (one == NULL) {
548 Py_DECREF(num);
549 return NULL;
550 }
551 temp = PyNumber_Subtract(num, one);
552 Py_DECREF(one);
553 Py_DECREF(num);
554 num = temp;
555 if (num == NULL)
556 return NULL;
557 overflow = 0;
558 value = PyLong_AsLongAndOverflow(num, &overflow);
559 Py_DECREF(num);
560 if (value == -1 && PyErr_Occurred())
561 return NULL;
562 if (value != -1)
563 return raiseTestError("test_long_and_overflow",
564 "return value was not set to -1");
565 if (overflow != -1)
566 return raiseTestError("test_long_and_overflow",
567 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* Test that overflow is cleared properly for small values. */
570 num = PyLong_FromString("FF", NULL, 16);
571 if (num == NULL)
572 return NULL;
573 overflow = 1234;
574 value = PyLong_AsLongAndOverflow(num, &overflow);
575 Py_DECREF(num);
576 if (value == -1 && PyErr_Occurred())
577 return NULL;
578 if (value != 0xFF)
579 return raiseTestError("test_long_and_overflow",
580 "expected return value 0xFF");
581 if (overflow != 0)
582 return raiseTestError("test_long_and_overflow",
583 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 num = PyLong_FromString("-FF", NULL, 16);
586 if (num == NULL)
587 return NULL;
588 overflow = 0;
589 value = PyLong_AsLongAndOverflow(num, &overflow);
590 Py_DECREF(num);
591 if (value == -1 && PyErr_Occurred())
592 return NULL;
593 if (value != -0xFF)
594 return raiseTestError("test_long_and_overflow",
595 "expected return value 0xFF");
596 if (overflow != 0)
597 return raiseTestError("test_long_and_overflow",
598 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 num = PyLong_FromLong(LONG_MAX);
601 if (num == NULL)
602 return NULL;
603 overflow = 1234;
604 value = PyLong_AsLongAndOverflow(num, &overflow);
605 Py_DECREF(num);
606 if (value == -1 && PyErr_Occurred())
607 return NULL;
608 if (value != LONG_MAX)
609 return raiseTestError("test_long_and_overflow",
610 "expected return value LONG_MAX");
611 if (overflow != 0)
612 return raiseTestError("test_long_and_overflow",
613 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 num = PyLong_FromLong(LONG_MIN);
616 if (num == NULL)
617 return NULL;
618 overflow = 0;
619 value = PyLong_AsLongAndOverflow(num, &overflow);
620 Py_DECREF(num);
621 if (value == -1 && PyErr_Occurred())
622 return NULL;
623 if (value != LONG_MIN)
624 return raiseTestError("test_long_and_overflow",
625 "expected return value LONG_MIN");
626 if (overflow != 0)
627 return raiseTestError("test_long_and_overflow",
628 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000629
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200630 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000631}
632
Mark Dickinson93f562c2010-01-30 10:30:15 +0000633/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700634 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000635 concentrate on proper handling of overflow.
636*/
637
638static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530639test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700642 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500646 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
648 if (num == NULL)
649 return NULL;
650 overflow = 1234;
651 value = PyLong_AsLongLongAndOverflow(num, &overflow);
652 Py_DECREF(num);
653 if (value == -1 && PyErr_Occurred())
654 return NULL;
655 if (value != -1)
656 return raiseTestError("test_long_long_and_overflow",
657 "return value was not set to -1");
658 if (overflow != 1)
659 return raiseTestError("test_long_long_and_overflow",
660 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000661
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500662 /* Same again, with num = LLONG_MAX + 1 */
663 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 if (num == NULL)
665 return NULL;
666 one = PyLong_FromLong(1L);
667 if (one == NULL) {
668 Py_DECREF(num);
669 return NULL;
670 }
671 temp = PyNumber_Add(num, one);
672 Py_DECREF(one);
673 Py_DECREF(num);
674 num = temp;
675 if (num == NULL)
676 return NULL;
677 overflow = 0;
678 value = PyLong_AsLongLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != -1)
683 return raiseTestError("test_long_long_and_overflow",
684 "return value was not set to -1");
685 if (overflow != 1)
686 return raiseTestError("test_long_long_and_overflow",
687 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500690 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
692 if (num == NULL)
693 return NULL;
694 overflow = 1234;
695 value = PyLong_AsLongLongAndOverflow(num, &overflow);
696 Py_DECREF(num);
697 if (value == -1 && PyErr_Occurred())
698 return NULL;
699 if (value != -1)
700 return raiseTestError("test_long_long_and_overflow",
701 "return value was not set to -1");
702 if (overflow != -1)
703 return raiseTestError("test_long_long_and_overflow",
704 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000705
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500706 /* Same again, with num = LLONG_MIN - 1 */
707 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 if (num == NULL)
709 return NULL;
710 one = PyLong_FromLong(1L);
711 if (one == NULL) {
712 Py_DECREF(num);
713 return NULL;
714 }
715 temp = PyNumber_Subtract(num, one);
716 Py_DECREF(one);
717 Py_DECREF(num);
718 num = temp;
719 if (num == NULL)
720 return NULL;
721 overflow = 0;
722 value = PyLong_AsLongLongAndOverflow(num, &overflow);
723 Py_DECREF(num);
724 if (value == -1 && PyErr_Occurred())
725 return NULL;
726 if (value != -1)
727 return raiseTestError("test_long_long_and_overflow",
728 "return value was not set to -1");
729 if (overflow != -1)
730 return raiseTestError("test_long_long_and_overflow",
731 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 /* Test that overflow is cleared properly for small values. */
734 num = PyLong_FromString("FF", NULL, 16);
735 if (num == NULL)
736 return NULL;
737 overflow = 1234;
738 value = PyLong_AsLongLongAndOverflow(num, &overflow);
739 Py_DECREF(num);
740 if (value == -1 && PyErr_Occurred())
741 return NULL;
742 if (value != 0xFF)
743 return raiseTestError("test_long_long_and_overflow",
744 "expected return value 0xFF");
745 if (overflow != 0)
746 return raiseTestError("test_long_long_and_overflow",
747 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 num = PyLong_FromString("-FF", NULL, 16);
750 if (num == NULL)
751 return NULL;
752 overflow = 0;
753 value = PyLong_AsLongLongAndOverflow(num, &overflow);
754 Py_DECREF(num);
755 if (value == -1 && PyErr_Occurred())
756 return NULL;
757 if (value != -0xFF)
758 return raiseTestError("test_long_long_and_overflow",
759 "expected return value 0xFF");
760 if (overflow != 0)
761 return raiseTestError("test_long_long_and_overflow",
762 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500764 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 if (num == NULL)
766 return NULL;
767 overflow = 1234;
768 value = PyLong_AsLongLongAndOverflow(num, &overflow);
769 Py_DECREF(num);
770 if (value == -1 && PyErr_Occurred())
771 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500772 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500774 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 if (overflow != 0)
776 return raiseTestError("test_long_long_and_overflow",
777 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500779 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 if (num == NULL)
781 return NULL;
782 overflow = 0;
783 value = PyLong_AsLongLongAndOverflow(num, &overflow);
784 Py_DECREF(num);
785 if (value == -1 && PyErr_Occurred())
786 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500787 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500789 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (overflow != 0)
791 return raiseTestError("test_long_long_and_overflow",
792 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000793
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200794 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000795}
796
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200797/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
798 non-integer arguments are handled correctly. It should be extended to
799 test overflow handling.
800 */
801
802static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530803test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200804{
805 size_t out_u;
806 Py_ssize_t out_s;
807
808 Py_INCREF(Py_None);
809
810 out_u = PyLong_AsSize_t(Py_None);
811 if (out_u != (size_t)-1 || !PyErr_Occurred())
812 return raiseTestError("test_long_as_size_t",
813 "PyLong_AsSize_t(None) didn't complain");
814 if (!PyErr_ExceptionMatches(PyExc_TypeError))
815 return raiseTestError("test_long_as_size_t",
816 "PyLong_AsSize_t(None) raised "
817 "something other than TypeError");
818 PyErr_Clear();
819
820 out_s = PyLong_AsSsize_t(Py_None);
821 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
822 return raiseTestError("test_long_as_size_t",
823 "PyLong_AsSsize_t(None) didn't complain");
824 if (!PyErr_ExceptionMatches(PyExc_TypeError))
825 return raiseTestError("test_long_as_size_t",
826 "PyLong_AsSsize_t(None) raised "
827 "something other than TypeError");
828 PyErr_Clear();
829
830 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
831 return Py_None;
832}
833
Zackery Spytzdc247652019-06-06 14:39:23 -0600834static PyObject *
835test_long_as_unsigned_long_long_mask(PyObject *self,
836 PyObject *Py_UNUSED(ignored))
837{
838 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
839
840 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
841 return raiseTestError("test_long_as_unsigned_long_long_mask",
842 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
843 "complain");
844 }
845 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
846 return raiseTestError("test_long_as_unsigned_long_long_mask",
847 "PyLong_AsUnsignedLongLongMask(NULL) raised "
848 "something other than SystemError");
849 }
850 PyErr_Clear();
851 Py_RETURN_NONE;
852}
853
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200854/* Test the PyLong_AsDouble API. At present this just tests that
855 non-integer arguments are handled correctly.
856 */
857
858static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530859test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200860{
861 double out;
862
863 Py_INCREF(Py_None);
864
865 out = PyLong_AsDouble(Py_None);
866 if (out != -1.0 || !PyErr_Occurred())
867 return raiseTestError("test_long_as_double",
868 "PyLong_AsDouble(None) didn't complain");
869 if (!PyErr_ExceptionMatches(PyExc_TypeError))
870 return raiseTestError("test_long_as_double",
871 "PyLong_AsDouble(None) raised "
872 "something other than TypeError");
873 PyErr_Clear();
874
875 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
876 return Py_None;
877}
878
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700879/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000880 for both long and int arguments. The test may leak a little memory if
881 it fails.
882*/
883static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530884test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700887 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 tuple = PyTuple_New(1);
890 if (tuple == NULL)
891 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 num = PyLong_FromLong(42);
894 if (num == NULL)
895 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300900 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 if (value != 42)
904 return raiseTestError("test_L_code",
905 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_DECREF(num);
908 num = PyLong_FromLong(42);
909 if (num == NULL)
910 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300915 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300917 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 if (value != 42)
919 return raiseTestError("test_L_code",
920 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200923 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000924}
925
Serhiy Storchakace412872016-05-08 23:36:44 +0300926static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300927return_none(void *unused)
928{
929 Py_RETURN_NONE;
930}
931
932static PyObject *
933raise_error(void *unused)
934{
935 PyErr_SetNone(PyExc_ValueError);
936 return NULL;
937}
938
939static int
940test_buildvalue_N_error(const char *fmt)
941{
942 PyObject *arg, *res;
943
944 arg = PyList_New(0);
945 if (arg == NULL) {
946 return -1;
947 }
948
949 Py_INCREF(arg);
950 res = Py_BuildValue(fmt, return_none, NULL, arg);
951 if (res == NULL) {
952 return -1;
953 }
954 Py_DECREF(res);
955 if (Py_REFCNT(arg) != 1) {
956 PyErr_Format(TestError, "test_buildvalue_N: "
957 "arg was not decrefed in successful "
958 "Py_BuildValue(\"%s\")", fmt);
959 return -1;
960 }
961
962 Py_INCREF(arg);
963 res = Py_BuildValue(fmt, raise_error, NULL, arg);
964 if (res != NULL || !PyErr_Occurred()) {
965 PyErr_Format(TestError, "test_buildvalue_N: "
966 "Py_BuildValue(\"%s\") didn't complain", fmt);
967 return -1;
968 }
969 PyErr_Clear();
970 if (Py_REFCNT(arg) != 1) {
971 PyErr_Format(TestError, "test_buildvalue_N: "
972 "arg was not decrefed in failed "
973 "Py_BuildValue(\"%s\")", fmt);
974 return -1;
975 }
976 Py_DECREF(arg);
977 return 0;
978}
979
980static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200981test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300982{
983 PyObject *arg, *res;
984
985 arg = PyList_New(0);
986 if (arg == NULL) {
987 return NULL;
988 }
989 Py_INCREF(arg);
990 res = Py_BuildValue("N", arg);
991 if (res == NULL) {
992 return NULL;
993 }
994 if (res != arg) {
995 return raiseTestError("test_buildvalue_N",
996 "Py_BuildValue(\"N\") returned wrong result");
997 }
998 if (Py_REFCNT(arg) != 2) {
999 return raiseTestError("test_buildvalue_N",
1000 "arg was not decrefed in Py_BuildValue(\"N\")");
1001 }
1002 Py_DECREF(res);
1003 Py_DECREF(arg);
1004
1005 if (test_buildvalue_N_error("O&N") < 0)
1006 return NULL;
1007 if (test_buildvalue_N_error("(O&N)") < 0)
1008 return NULL;
1009 if (test_buildvalue_N_error("[O&N]") < 0)
1010 return NULL;
1011 if (test_buildvalue_N_error("{O&N}") < 0)
1012 return NULL;
1013 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1014 return NULL;
1015
1016 Py_RETURN_NONE;
1017}
1018
1019
1020static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001021get_args(PyObject *self, PyObject *args)
1022{
1023 if (args == NULL) {
1024 args = Py_None;
1025 }
1026 Py_INCREF(args);
1027 return args;
1028}
1029
1030static PyObject *
1031get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1032{
1033 if (kwargs == NULL) {
1034 kwargs = Py_None;
1035 }
1036 Py_INCREF(kwargs);
1037 return kwargs;
1038}
1039
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040/* Test tuple argument processing */
1041static PyObject *
1042getargs_tuple(PyObject *self, PyObject *args)
1043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 int a, b, c;
1045 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1046 return NULL;
1047 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001048}
1049
Christian Heimes380f7f22008-02-28 11:19:05 +00001050/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001051static PyObject *
1052getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001055 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1059 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1060 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1061 return NULL;
1062 return Py_BuildValue("iiiiiiiiii",
1063 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1064 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001065}
1066
Larry Hastings83a9f482012-03-20 20:06:16 +00001067/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1068static PyObject *
1069getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1070{
1071 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1072 int required = -1;
1073 int optional = -1;
1074 int keyword_only = -1;
1075
1076 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1077 &required, &optional, &keyword_only))
1078 return NULL;
1079 return Py_BuildValue("iii", required, optional, keyword_only);
1080}
1081
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001082/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1083static PyObject *
1084getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1085{
1086 static char *keywords[] = {"", "", "keyword", NULL};
1087 int required = -1;
1088 int optional = -1;
1089 int keyword = -1;
1090
1091 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1092 &required, &optional, &keyword))
1093 return NULL;
1094 return Py_BuildValue("iii", required, optional, keyword);
1095}
1096
Thomas Heller3457e4b2003-04-24 16:14:27 +00001097/* Functions to call PyArg_ParseTuple with integer format codes,
1098 and return the result.
1099*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001100static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001101getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 unsigned char value;
1104 if (!PyArg_ParseTuple(args, "b", &value))
1105 return NULL;
1106 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001107}
1108
Thomas Heller3457e4b2003-04-24 16:14:27 +00001109static PyObject *
1110getargs_B(PyObject *self, PyObject *args)
1111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 unsigned char value;
1113 if (!PyArg_ParseTuple(args, "B", &value))
1114 return NULL;
1115 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001116}
1117
1118static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001119getargs_h(PyObject *self, PyObject *args)
1120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 short value;
1122 if (!PyArg_ParseTuple(args, "h", &value))
1123 return NULL;
1124 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001125}
1126
1127static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001128getargs_H(PyObject *self, PyObject *args)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 unsigned short value;
1131 if (!PyArg_ParseTuple(args, "H", &value))
1132 return NULL;
1133 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001134}
1135
1136static PyObject *
1137getargs_I(PyObject *self, PyObject *args)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 unsigned int value;
1140 if (!PyArg_ParseTuple(args, "I", &value))
1141 return NULL;
1142 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001143}
1144
1145static PyObject *
1146getargs_k(PyObject *self, PyObject *args)
1147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 unsigned long value;
1149 if (!PyArg_ParseTuple(args, "k", &value))
1150 return NULL;
1151 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001152}
1153
1154static PyObject *
1155getargs_i(PyObject *self, PyObject *args)
1156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 int value;
1158 if (!PyArg_ParseTuple(args, "i", &value))
1159 return NULL;
1160 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001161}
1162
Thomas Hellera4ea6032003-04-17 18:55:45 +00001163static PyObject *
1164getargs_l(PyObject *self, PyObject *args)
1165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 long value;
1167 if (!PyArg_ParseTuple(args, "l", &value))
1168 return NULL;
1169 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001170}
1171
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001172static PyObject *
1173getargs_n(PyObject *self, PyObject *args)
1174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 Py_ssize_t value;
1176 if (!PyArg_ParseTuple(args, "n", &value))
1177 return NULL;
1178 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001179}
1180
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001181static PyObject *
1182getargs_p(PyObject *self, PyObject *args)
1183{
1184 int value;
1185 if (!PyArg_ParseTuple(args, "p", &value))
1186 return NULL;
1187 return PyLong_FromLong(value);
1188}
1189
Thomas Hellera4ea6032003-04-17 18:55:45 +00001190static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001191getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001193 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 if (!PyArg_ParseTuple(args, "L", &value))
1195 return NULL;
1196 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197}
1198
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001200getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001201{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001202 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 if (!PyArg_ParseTuple(args, "K", &value))
1204 return NULL;
1205 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001207
1208/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001209 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001210static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301211test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 PyObject *tuple, *num;
1214 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 tuple = PyTuple_New(1);
1217 if (tuple == NULL)
1218 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 /* a number larger than ULONG_MAX even on 64-bit platforms */
1221 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1222 if (num == NULL)
1223 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 value = PyLong_AsUnsignedLongMask(num);
1226 if (value != ULONG_MAX)
1227 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001228 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001233 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 if (value != ULONG_MAX)
1237 return raiseTestError("test_k_code",
1238 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 Py_DECREF(num);
1241 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1242 if (num == NULL)
1243 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 value = PyLong_AsUnsignedLongMask(num);
1246 if (value != (unsigned long)-0x42)
1247 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001248 "PyLong_AsUnsignedLongMask() returned wrong "
1249 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001254 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 if (value != (unsigned long)-0x42)
1258 return raiseTestError("test_k_code",
1259 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001262 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001263}
1264
Victor Stinner06e49dd2010-06-13 18:21:50 +00001265static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001266getargs_f(PyObject *self, PyObject *args)
1267{
1268 float f;
1269 if (!PyArg_ParseTuple(args, "f", &f))
1270 return NULL;
1271 return PyFloat_FromDouble(f);
1272}
1273
1274static PyObject *
1275getargs_d(PyObject *self, PyObject *args)
1276{
1277 double d;
1278 if (!PyArg_ParseTuple(args, "d", &d))
1279 return NULL;
1280 return PyFloat_FromDouble(d);
1281}
1282
1283static PyObject *
1284getargs_D(PyObject *self, PyObject *args)
1285{
1286 Py_complex cval;
1287 if (!PyArg_ParseTuple(args, "D", &cval))
1288 return NULL;
1289 return PyComplex_FromCComplex(cval);
1290}
1291
1292static PyObject *
1293getargs_S(PyObject *self, PyObject *args)
1294{
1295 PyObject *obj;
1296 if (!PyArg_ParseTuple(args, "S", &obj))
1297 return NULL;
1298 Py_INCREF(obj);
1299 return obj;
1300}
1301
1302static PyObject *
1303getargs_Y(PyObject *self, PyObject *args)
1304{
1305 PyObject *obj;
1306 if (!PyArg_ParseTuple(args, "Y", &obj))
1307 return NULL;
1308 Py_INCREF(obj);
1309 return obj;
1310}
1311
1312static PyObject *
1313getargs_U(PyObject *self, PyObject *args)
1314{
1315 PyObject *obj;
1316 if (!PyArg_ParseTuple(args, "U", &obj))
1317 return NULL;
1318 Py_INCREF(obj);
1319 return obj;
1320}
1321
1322static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001323getargs_c(PyObject *self, PyObject *args)
1324{
1325 char c;
1326 if (!PyArg_ParseTuple(args, "c", &c))
1327 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001328 return PyLong_FromLong((unsigned char)c);
1329}
1330
1331static PyObject *
1332getargs_C(PyObject *self, PyObject *args)
1333{
1334 int c;
1335 if (!PyArg_ParseTuple(args, "C", &c))
1336 return NULL;
1337 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001338}
1339
1340static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001341getargs_s(PyObject *self, PyObject *args)
1342{
1343 char *str;
1344 if (!PyArg_ParseTuple(args, "s", &str))
1345 return NULL;
1346 return PyBytes_FromString(str);
1347}
1348
1349static PyObject *
1350getargs_s_star(PyObject *self, PyObject *args)
1351{
1352 Py_buffer buffer;
1353 PyObject *bytes;
1354 if (!PyArg_ParseTuple(args, "s*", &buffer))
1355 return NULL;
1356 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1357 PyBuffer_Release(&buffer);
1358 return bytes;
1359}
1360
1361static PyObject *
1362getargs_s_hash(PyObject *self, PyObject *args)
1363{
1364 char *str;
1365 Py_ssize_t size;
1366 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1367 return NULL;
1368 return PyBytes_FromStringAndSize(str, size);
1369}
1370
1371static PyObject *
1372getargs_z(PyObject *self, PyObject *args)
1373{
1374 char *str;
1375 if (!PyArg_ParseTuple(args, "z", &str))
1376 return NULL;
1377 if (str != NULL)
1378 return PyBytes_FromString(str);
1379 else
1380 Py_RETURN_NONE;
1381}
1382
1383static PyObject *
1384getargs_z_star(PyObject *self, PyObject *args)
1385{
1386 Py_buffer buffer;
1387 PyObject *bytes;
1388 if (!PyArg_ParseTuple(args, "z*", &buffer))
1389 return NULL;
1390 if (buffer.buf != NULL)
1391 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1392 else {
1393 Py_INCREF(Py_None);
1394 bytes = Py_None;
1395 }
1396 PyBuffer_Release(&buffer);
1397 return bytes;
1398}
1399
1400static PyObject *
1401getargs_z_hash(PyObject *self, PyObject *args)
1402{
1403 char *str;
1404 Py_ssize_t size;
1405 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1406 return NULL;
1407 if (str != NULL)
1408 return PyBytes_FromStringAndSize(str, size);
1409 else
1410 Py_RETURN_NONE;
1411}
1412
1413static PyObject *
1414getargs_y(PyObject *self, PyObject *args)
1415{
1416 char *str;
1417 if (!PyArg_ParseTuple(args, "y", &str))
1418 return NULL;
1419 return PyBytes_FromString(str);
1420}
1421
1422static PyObject *
1423getargs_y_star(PyObject *self, PyObject *args)
1424{
1425 Py_buffer buffer;
1426 PyObject *bytes;
1427 if (!PyArg_ParseTuple(args, "y*", &buffer))
1428 return NULL;
1429 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1430 PyBuffer_Release(&buffer);
1431 return bytes;
1432}
1433
1434static PyObject *
1435getargs_y_hash(PyObject *self, PyObject *args)
1436{
1437 char *str;
1438 Py_ssize_t size;
1439 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1440 return NULL;
1441 return PyBytes_FromStringAndSize(str, size);
1442}
1443
1444static PyObject *
1445getargs_u(PyObject *self, PyObject *args)
1446{
1447 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001448 if (!PyArg_ParseTuple(args, "u", &str))
1449 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001450 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001451}
1452
1453static PyObject *
1454getargs_u_hash(PyObject *self, PyObject *args)
1455{
1456 Py_UNICODE *str;
1457 Py_ssize_t size;
1458 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1459 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001460 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001461}
1462
1463static PyObject *
1464getargs_Z(PyObject *self, PyObject *args)
1465{
1466 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001467 if (!PyArg_ParseTuple(args, "Z", &str))
1468 return NULL;
1469 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001470 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001471 } else
1472 Py_RETURN_NONE;
1473}
1474
1475static PyObject *
1476getargs_Z_hash(PyObject *self, PyObject *args)
1477{
1478 Py_UNICODE *str;
1479 Py_ssize_t size;
1480 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1481 return NULL;
1482 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001483 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001484 else
1485 Py_RETURN_NONE;
1486}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001487
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001488static PyObject *
1489getargs_es(PyObject *self, PyObject *args)
1490{
1491 PyObject *arg, *result;
1492 const char *encoding = NULL;
1493 char *str;
1494
1495 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1496 return NULL;
1497 if (!PyArg_Parse(arg, "es", encoding, &str))
1498 return NULL;
1499 result = PyBytes_FromString(str);
1500 PyMem_Free(str);
1501 return result;
1502}
1503
1504static PyObject *
1505getargs_et(PyObject *self, PyObject *args)
1506{
1507 PyObject *arg, *result;
1508 const char *encoding = NULL;
1509 char *str;
1510
1511 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1512 return NULL;
1513 if (!PyArg_Parse(arg, "et", encoding, &str))
1514 return NULL;
1515 result = PyBytes_FromString(str);
1516 PyMem_Free(str);
1517 return result;
1518}
1519
1520static PyObject *
1521getargs_es_hash(PyObject *self, PyObject *args)
1522{
1523 PyObject *arg, *result;
1524 const char *encoding = NULL;
1525 PyByteArrayObject *buffer = NULL;
1526 char *str = NULL;
1527 Py_ssize_t size;
1528
1529 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1530 return NULL;
1531 if (buffer != NULL) {
1532 str = PyByteArray_AS_STRING(buffer);
1533 size = PyByteArray_GET_SIZE(buffer);
1534 }
1535 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1536 return NULL;
1537 result = PyBytes_FromStringAndSize(str, size);
1538 if (buffer == NULL)
1539 PyMem_Free(str);
1540 return result;
1541}
1542
1543static PyObject *
1544getargs_et_hash(PyObject *self, PyObject *args)
1545{
1546 PyObject *arg, *result;
1547 const char *encoding = NULL;
1548 PyByteArrayObject *buffer = NULL;
1549 char *str = NULL;
1550 Py_ssize_t size;
1551
1552 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1553 return NULL;
1554 if (buffer != NULL) {
1555 str = PyByteArray_AS_STRING(buffer);
1556 size = PyByteArray_GET_SIZE(buffer);
1557 }
1558 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1559 return NULL;
1560 result = PyBytes_FromStringAndSize(str, size);
1561 if (buffer == NULL)
1562 PyMem_Free(str);
1563 return result;
1564}
1565
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566/* Test the s and z codes for PyArg_ParseTuple.
1567*/
1568static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301569test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001570{
1571 /* Unicode strings should be accepted */
1572 PyObject *tuple, *obj;
1573 char *value;
1574
1575 tuple = PyTuple_New(1);
1576 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001578
1579 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001581 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001583
1584 PyTuple_SET_ITEM(tuple, 0, obj);
1585
1586 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001588 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001589 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1590 return NULL;
1591 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001592
Oren Milmanba7d7362017-08-29 11:58:27 +03001593 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1594 return NULL;
1595 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001596
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001597 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001598 Py_RETURN_NONE;
1599}
1600
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001601static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001602parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001603{
Larry Hastings8f904da2012-06-22 03:56:29 -07001604 PyObject *sub_args;
1605 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001606 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001607 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001608
Larry Hastings8f904da2012-06-22 03:56:29 -07001609 Py_ssize_t i, size;
1610 char *keywords[8 + 1]; /* space for NULL at end */
1611 PyObject *o;
1612 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001613
Larry Hastings8f904da2012-06-22 03:56:29 -07001614 int result;
1615 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001616
Larry Hastings22701e82012-08-08 14:52:22 -07001617 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001618
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001619 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001620 &sub_args, &sub_kwargs,
1621 &sub_format, &sub_keywords))
1622 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001623
Larry Hastings8f904da2012-06-22 03:56:29 -07001624 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1627 return NULL;
1628 }
1629
1630 memset(buffers, 0, sizeof(buffers));
1631 memset(converted, 0, sizeof(converted));
1632 memset(keywords, 0, sizeof(keywords));
1633
1634 size = PySequence_Fast_GET_SIZE(sub_keywords);
1635 if (size > 8) {
1636 PyErr_SetString(PyExc_ValueError,
1637 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1638 goto exit;
1639 }
1640
1641 for (i = 0; i < size; i++) {
1642 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1643 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1644 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001645 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001646 goto exit;
1647 }
1648 keywords[i] = PyBytes_AS_STRING(converted[i]);
1649 }
1650
1651 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1652 sub_format, keywords,
1653 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1654 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1655
1656 if (result) {
1657 return_value = Py_None;
1658 Py_INCREF(Py_None);
1659 }
1660
1661exit:
1662 size = sizeof(converted) / sizeof(converted[0]);
1663 for (i = 0; i < size; i++) {
1664 Py_XDECREF(converted[i]);
1665 }
1666 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001667}
1668
Benjamin Peterson92035012008-12-27 16:00:54 +00001669static volatile int x;
1670
Inada Naoki2c4928d2020-06-17 20:09:44 +09001671/* Ignore use of deprecated APIs */
1672_Py_COMP_DIAG_PUSH
1673_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1674
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001675/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1676 of an error.
1677*/
1678static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301679test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 PyObject *tuple, *obj;
1682 Py_UNICODE *value;
1683 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1686 /* Just use the macro and check that it compiles */
1687 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 tuple = PyTuple_New(1);
1690 if (tuple == NULL)
1691 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 obj = PyUnicode_Decode("test", strlen("test"),
1694 "ascii", NULL);
1695 if (obj == NULL)
1696 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001701 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001703 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (value != PyUnicode_AS_UNICODE(obj))
1705 return raiseTestError("test_u_code",
1706 "u code returned wrong value for u'test'");
1707 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001708 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001710 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (value != PyUnicode_AS_UNICODE(obj) ||
1712 len != PyUnicode_GET_SIZE(obj))
1713 return raiseTestError("test_u_code",
1714 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001717 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001718}
1719
Guido van Rossumfb67be22007-08-29 18:38:11 +00001720/* Test Z and Z# codes for PyArg_ParseTuple */
1721static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301722test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001725 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 tuple = PyTuple_New(2);
1729 if (tuple == NULL)
1730 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 obj = PyUnicode_FromString("test");
1733 PyTuple_SET_ITEM(tuple, 0, obj);
1734 Py_INCREF(Py_None);
1735 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 /* swap values on purpose */
1738 value1 = NULL;
1739 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001742 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001744 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 if (value1 != PyUnicode_AS_UNICODE(obj))
1746 return raiseTestError("test_Z_code",
1747 "Z code returned wrong value for 'test'");
1748 if (value2 != NULL)
1749 return raiseTestError("test_Z_code",
1750 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 value1 = NULL;
1753 value2 = PyUnicode_AS_UNICODE(obj);
1754 len1 = -1;
1755 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001758 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1759 &value2, &len2))
1760 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1764 len1 != PyUnicode_GET_SIZE(obj))
1765 return raiseTestError("test_Z_code",
1766 "Z# code returned wrong values for 'test'");
1767 if (value2 != NULL ||
1768 len2 != 0)
1769 return raiseTestError("test_Z_code",
1770 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 Py_DECREF(tuple);
1773 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001774}
1775
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301777test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001778{
1779#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1781 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001782 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001783#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1785 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1790 if (wide == NULL)
1791 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1794 if (utf8 == NULL) {
1795 Py_DECREF(wide);
1796 return NULL;
1797 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001798
Victor Stinner8ef18872011-11-21 02:06:57 +01001799 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 Py_DECREF(wide);
1801 Py_DECREF(utf8);
1802 return raiseTestError("test_widechar",
1803 "wide string and utf8 string "
1804 "have different length");
1805 }
1806 if (PyUnicode_Compare(wide, utf8)) {
1807 Py_DECREF(wide);
1808 Py_DECREF(utf8);
1809 if (PyErr_Occurred())
1810 return NULL;
1811 return raiseTestError("test_widechar",
1812 "wide string and utf8 string "
1813 "are different");
1814 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 Py_DECREF(wide);
1817 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001818
1819#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1820 wide = PyUnicode_FromWideChar(invalid, 1);
1821 if (wide == NULL)
1822 PyErr_Clear();
1823 else
1824 return raiseTestError("test_widechar",
1825 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1826
1827 wide = PyUnicode_FromUnicode(invalid, 1);
1828 if (wide == NULL)
1829 PyErr_Clear();
1830 else
1831 return raiseTestError("test_widechar",
1832 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001833
1834 wide = PyUnicode_FromUnicode(NULL, 1);
1835 if (wide == NULL)
1836 return NULL;
1837 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001838 if (_PyUnicode_Ready(wide) < 0) {
1839 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001840 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001841 }
1842 else {
1843 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001844 return raiseTestError("test_widechar",
1845 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001846 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001847#endif
1848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001850}
Inada Naoki2c4928d2020-06-17 20:09:44 +09001851_Py_COMP_DIAG_POP
Mark Dickinson081dfee2009-03-18 14:47:41 +00001852
1853static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001854unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001855{
1856 PyObject *unicode, *result;
1857 Py_ssize_t buflen, size;
1858 wchar_t *buffer;
1859
1860 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1861 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001862 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001863 if (buffer == NULL)
1864 return PyErr_NoMemory();
1865
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001866 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001867 if (size == -1) {
1868 PyMem_Free(buffer);
1869 return NULL;
1870 }
1871
1872 if (size < buflen)
1873 buflen = size + 1;
1874 else
1875 buflen = size;
1876 result = PyUnicode_FromWideChar(buffer, buflen);
1877 PyMem_Free(buffer);
1878 if (result == NULL)
1879 return NULL;
1880
1881 return Py_BuildValue("(Nn)", result, size);
1882}
1883
1884static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001885unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001886{
1887 PyObject *unicode, *result;
1888 Py_ssize_t size;
1889 wchar_t *buffer;
1890
1891 if (!PyArg_ParseTuple(args, "U", &unicode))
1892 return NULL;
1893
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001894 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001895 if (buffer == NULL)
1896 return NULL;
1897
1898 result = PyUnicode_FromWideChar(buffer, size + 1);
1899 PyMem_Free(buffer);
1900 if (result == NULL)
1901 return NULL;
1902 return Py_BuildValue("(Nn)", result, size);
1903}
1904
1905static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001906unicode_asucs4(PyObject *self, PyObject *args)
1907{
1908 PyObject *unicode, *result;
1909 Py_UCS4 *buffer;
1910 int copy_null;
1911 Py_ssize_t str_len, buf_len;
1912
1913 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1914 return NULL;
1915 }
1916
1917 buf_len = str_len + 1;
1918 buffer = PyMem_NEW(Py_UCS4, buf_len);
1919 if (buffer == NULL) {
1920 return PyErr_NoMemory();
1921 }
1922 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1923 buffer[str_len] = 0xffffU;
1924
1925 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1926 PyMem_FREE(buffer);
1927 return NULL;
1928 }
1929
1930 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1931 PyMem_FREE(buffer);
1932 return result;
1933}
1934
1935static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001936unicode_asutf8(PyObject *self, PyObject *args)
1937{
1938 PyObject *unicode;
1939 const char *buffer;
1940
1941 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1942 return NULL;
1943 }
1944
1945 buffer = PyUnicode_AsUTF8(unicode);
1946 if (buffer == NULL) {
1947 return NULL;
1948 }
1949
1950 return PyBytes_FromString(buffer);
1951}
1952
1953static PyObject *
1954unicode_asutf8andsize(PyObject *self, PyObject *args)
1955{
1956 PyObject *unicode, *result;
1957 const char *buffer;
1958 Py_ssize_t utf8_len;
1959
1960 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1961 return NULL;
1962 }
1963
Victor Stinneraca8c402019-09-30 21:14:26 +02001964 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05001965 if (buffer == NULL) {
1966 return NULL;
1967 }
1968
1969 result = PyBytes_FromString(buffer);
1970 if (result == NULL) {
1971 return NULL;
1972 }
1973
1974 return Py_BuildValue("(Nn)", result, utf8_len);
1975}
1976
1977static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001978unicode_findchar(PyObject *self, PyObject *args)
1979{
1980 PyObject *str;
1981 int direction;
1982 unsigned int ch;
1983 Py_ssize_t result;
1984 Py_ssize_t start, end;
1985
1986 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1987 &start, &end, &direction)) {
1988 return NULL;
1989 }
1990
1991 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1992 if (result == -2)
1993 return NULL;
1994 else
1995 return PyLong_FromSsize_t(result);
1996}
1997
1998static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001999unicode_copycharacters(PyObject *self, PyObject *args)
2000{
2001 PyObject *from, *to, *to_copy;
2002 Py_ssize_t from_start, to_start, how_many, copied;
2003
2004 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2005 &from, &from_start, &how_many)) {
2006 return NULL;
2007 }
2008
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002009 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2010 PyUnicode_MAX_CHAR_VALUE(to)))) {
2011 return NULL;
2012 }
2013 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2014 Py_DECREF(to_copy);
2015 return NULL;
2016 }
2017
2018 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2019 from_start, how_many)) < 0) {
2020 Py_DECREF(to_copy);
2021 return NULL;
2022 }
2023
2024 return Py_BuildValue("(Nn)", to_copy, copied);
2025}
2026
2027static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002028unicode_encodedecimal(PyObject *self, PyObject *args)
2029{
2030 Py_UNICODE *unicode;
2031 Py_ssize_t length;
2032 char *errors = NULL;
2033 PyObject *decimal;
2034 Py_ssize_t decimal_length, new_length;
2035 int res;
2036
2037 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2038 return NULL;
2039
2040 decimal_length = length * 7; /* len('&#8364;') */
2041 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2042 if (decimal == NULL)
2043 return NULL;
2044
2045 res = PyUnicode_EncodeDecimal(unicode, length,
2046 PyBytes_AS_STRING(decimal),
2047 errors);
2048 if (res < 0) {
2049 Py_DECREF(decimal);
2050 return NULL;
2051 }
2052
2053 new_length = strlen(PyBytes_AS_STRING(decimal));
2054 assert(new_length <= decimal_length);
2055 res = _PyBytes_Resize(&decimal, new_length);
2056 if (res < 0)
2057 return NULL;
2058
2059 return decimal;
2060}
2061
2062static PyObject *
2063unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2064{
2065 Py_UNICODE *unicode;
2066 Py_ssize_t length;
2067 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2068 return NULL;
2069 return PyUnicode_TransformDecimalToASCII(unicode, length);
2070}
2071
Inada Naoki2c4928d2020-06-17 20:09:44 +09002072/* Ignore use of deprecated APIs */
2073_Py_COMP_DIAG_PUSH
2074_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2075
Victor Stinner42bf7752011-11-21 22:52:58 +01002076static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002077unicode_legacy_string(PyObject *self, PyObject *args)
2078{
2079 Py_UNICODE *data;
2080 Py_ssize_t len;
2081 PyObject *u;
2082
2083 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2084 return NULL;
2085
2086 u = PyUnicode_FromUnicode(NULL, len);
2087 if (u == NULL)
2088 return NULL;
2089
2090 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2091
2092 if (len > 0) { /* The empty string is always ready. */
2093 assert(!PyUnicode_IS_READY(u));
2094 }
2095
2096 return u;
2097}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002098_Py_COMP_DIAG_POP
Stefan Krahe6996ed2012-11-02 14:44:20 +01002099
2100static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002101getargs_w_star(PyObject *self, PyObject *args)
2102{
2103 Py_buffer buffer;
2104 PyObject *result;
2105 char *str;
2106
2107 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2108 return NULL;
2109
2110 if (2 <= buffer.len) {
2111 str = buffer.buf;
2112 str[0] = '[';
2113 str[buffer.len-1] = ']';
2114 }
2115
2116 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2117 PyBuffer_Release(&buffer);
2118 return result;
2119}
2120
2121
2122static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302123test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* Test that formats can begin with '|'. See issue #4720. */
2126 PyObject *tuple, *dict = NULL;
2127 static char *kwlist[] = {NULL};
2128 int result;
2129 tuple = PyTuple_New(0);
2130 if (!tuple)
2131 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002132 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002134 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 dict = PyDict_New();
2136 if (!dict)
2137 goto done;
2138 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002139 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 Py_DECREF(tuple);
2141 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002142 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 else {
2146 Py_RETURN_NONE;
2147 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002148}
2149
2150static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002151codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 const char *encoding, *errors = NULL;
2154 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2155 &encoding, &errors))
2156 return NULL;
2157 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002158}
2159
Thomas Wouters477c8d52006-05-27 19:21:47 +00002160static PyObject *
2161codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 const char *encoding, *errors = NULL;
2164 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2165 &encoding, &errors))
2166 return NULL;
2167 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002168}
2169
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002170
Tim Peters5b8132f2003-01-31 15:52:05 +00002171/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002172static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302173test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 struct triple {
2176 long input;
2177 size_t nbits;
2178 int sign;
2179 } testcases[] = {{0, 0, 0},
2180 {1L, 1, 1},
2181 {-1L, 1, -1},
2182 {2L, 2, 1},
2183 {-2L, 2, -1},
2184 {3L, 2, 1},
2185 {-3L, 2, -1},
2186 {4L, 3, 1},
2187 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002188 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 {-0x7fffL, 15, -1},
2190 {0xffffL, 16, 1},
2191 {-0xffffL, 16, -1},
2192 {0xfffffffL, 28, 1},
2193 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002194 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002195
Victor Stinner63941882011-09-29 00:42:28 +02002196 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002197 size_t nbits;
2198 int sign;
2199 PyObject *plong;
2200
2201 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002202 if (plong == NULL)
2203 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002204 nbits = _PyLong_NumBits(plong);
2205 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 Py_DECREF(plong);
2208 if (nbits != testcases[i].nbits)
2209 return raiseTestError("test_long_numbits",
2210 "wrong result for _PyLong_NumBits");
2211 if (sign != testcases[i].sign)
2212 return raiseTestError("test_long_numbits",
2213 "wrong result for _PyLong_Sign");
2214 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002215 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002216}
2217
Thomas Heller519a0422007-11-15 20:48:54 +00002218/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002219
2220static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302221test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2224 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2225 Py_XDECREF(o1);
2226 Py_XDECREF(o2);
2227 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002228}
2229
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002230static PyObject *
2231raise_exception(PyObject *self, PyObject *args)
2232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 PyObject *exc;
2234 PyObject *exc_args, *v;
2235 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2238 &exc, &num_args))
2239 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 exc_args = PyTuple_New(num_args);
2242 if (exc_args == NULL)
2243 return NULL;
2244 for (i = 0; i < num_args; ++i) {
2245 v = PyLong_FromLong(i);
2246 if (v == NULL) {
2247 Py_DECREF(exc_args);
2248 return NULL;
2249 }
2250 PyTuple_SET_ITEM(exc_args, i, v);
2251 }
2252 PyErr_SetObject(exc, exc_args);
2253 Py_DECREF(exc_args);
2254 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002255}
Tim Peters91621db2001-06-12 20:10:01 +00002256
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002257static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002258set_errno(PyObject *self, PyObject *args)
2259{
2260 int new_errno;
2261
2262 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2263 return NULL;
2264
2265 errno = new_errno;
2266 Py_RETURN_NONE;
2267}
2268
2269static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002270test_set_exc_info(PyObject *self, PyObject *args)
2271{
2272 PyObject *orig_exc;
2273 PyObject *new_type, *new_value, *new_tb;
2274 PyObject *type, *value, *tb;
2275 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2276 &new_type, &new_value, &new_tb))
2277 return NULL;
2278
2279 PyErr_GetExcInfo(&type, &value, &tb);
2280
2281 Py_INCREF(new_type);
2282 Py_INCREF(new_value);
2283 Py_INCREF(new_tb);
2284 PyErr_SetExcInfo(new_type, new_value, new_tb);
2285
2286 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2287 Py_XDECREF(type);
2288 Py_XDECREF(value);
2289 Py_XDECREF(tb);
2290 return orig_exc;
2291}
Benjamin Peterson16323982010-02-03 01:13:41 +00002292
2293static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002294
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002295static PyObject *
2296test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (PyDateTimeAPI) {
2298 if (test_run_counter) {
2299 /* Probably regrtest.py -R */
2300 Py_RETURN_NONE;
2301 }
2302 else {
2303 PyErr_SetString(PyExc_AssertionError,
2304 "PyDateTime_CAPI somehow initialized");
2305 return NULL;
2306 }
2307 }
2308 test_run_counter++;
2309 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 if (PyDateTimeAPI)
2312 Py_RETURN_NONE;
2313 else
2314 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002315}
2316
Paul Ganssle04af5b12018-01-24 17:29:30 -05002317/* Functions exposing the C API type checking for testing */
2318#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2319 PyObject *obj; \
2320 int exact = 0; \
2321 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2322 return NULL; \
2323 } \
2324 int rv = exact?exact_method(obj):check_method(obj); \
2325 if (rv) { \
2326 Py_RETURN_TRUE; \
2327 } else { \
2328 Py_RETURN_FALSE; \
2329 }
2330
2331static PyObject *
2332datetime_check_date(PyObject *self, PyObject *args) {
2333 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2334}
2335
2336static PyObject *
2337datetime_check_time(PyObject *self, PyObject *args) {
2338 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2339}
2340
2341static PyObject *
2342datetime_check_datetime(PyObject *self, PyObject *args) {
2343 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2344}
2345
2346static PyObject *
2347datetime_check_delta(PyObject *self, PyObject *args) {
2348 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2349}
2350
2351static PyObject *
2352datetime_check_tzinfo(PyObject *self, PyObject *args) {
2353 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2354}
2355
2356
2357/* Makes three variations on timezone representing UTC-5:
2358 1. timezone with offset and name from PyDateTimeAPI
2359 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2360 3. timezone with offset (no name) from PyTimeZone_FromOffset
2361*/
2362static PyObject *
2363make_timezones_capi(PyObject *self, PyObject *args) {
2364 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2365 PyObject *name = PyUnicode_FromString("EST");
2366
2367 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2368 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2369 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2370
2371 Py_DecRef(offset);
2372 Py_DecRef(name);
2373
2374 PyObject *rv = PyTuple_New(3);
2375
2376 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2377 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2378 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2379
2380 return rv;
2381}
2382
2383static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002384get_timezones_offset_zero(PyObject *self, PyObject *args) {
2385 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2386 PyObject *name = PyUnicode_FromString("");
2387
2388 // These two should return the UTC singleton
2389 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2390 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2391
2392 // This one will return +00:00 zone, but not the UTC singleton
2393 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2394
2395 Py_DecRef(offset);
2396 Py_DecRef(name);
2397
2398 PyObject *rv = PyTuple_New(3);
2399 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2400 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2401 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2402
2403 return rv;
2404}
2405
2406static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002407get_timezone_utc_capi(PyObject* self, PyObject *args) {
2408 int macro = 0;
2409 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2410 return NULL;
2411 }
2412 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002413 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002414 return PyDateTime_TimeZone_UTC;
2415 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002416 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002417 return PyDateTimeAPI->TimeZone_UTC;
2418 }
2419}
2420
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002421static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002422get_date_fromdate(PyObject *self, PyObject *args)
2423{
2424 PyObject *rv = NULL;
2425 int macro;
2426 int year, month, day;
2427
2428 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2429 return NULL;
2430 }
2431
2432 if (macro) {
2433 rv = PyDate_FromDate(year, month, day);
2434 }
2435 else {
2436 rv = PyDateTimeAPI->Date_FromDate(
2437 year, month, day,
2438 PyDateTimeAPI->DateType);
2439 }
2440 return rv;
2441}
2442
2443static PyObject *
2444get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2445{
2446 PyObject *rv = NULL;
2447 int macro;
2448 int year, month, day;
2449 int hour, minute, second, microsecond;
2450
2451 if (!PyArg_ParseTuple(args, "piiiiiii",
2452 &macro,
2453 &year, &month, &day,
2454 &hour, &minute, &second, &microsecond)) {
2455 return NULL;
2456 }
2457
2458 if (macro) {
2459 rv = PyDateTime_FromDateAndTime(
2460 year, month, day,
2461 hour, minute, second, microsecond);
2462 }
2463 else {
2464 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2465 year, month, day,
2466 hour, minute, second, microsecond,
2467 Py_None,
2468 PyDateTimeAPI->DateTimeType);
2469 }
2470 return rv;
2471}
2472
2473static PyObject *
2474get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2475{
2476 PyObject *rv = NULL;
2477 int macro;
2478 int year, month, day;
2479 int hour, minute, second, microsecond, fold;
2480
2481 if (!PyArg_ParseTuple(args, "piiiiiiii",
2482 &macro,
2483 &year, &month, &day,
2484 &hour, &minute, &second, &microsecond,
2485 &fold)) {
2486 return NULL;
2487 }
2488
2489 if (macro) {
2490 rv = PyDateTime_FromDateAndTimeAndFold(
2491 year, month, day,
2492 hour, minute, second, microsecond,
2493 fold);
2494 }
2495 else {
2496 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2497 year, month, day,
2498 hour, minute, second, microsecond,
2499 Py_None,
2500 fold,
2501 PyDateTimeAPI->DateTimeType);
2502 }
2503 return rv;
2504}
2505
2506static PyObject *
2507get_time_fromtime(PyObject *self, PyObject *args)
2508{
2509 PyObject *rv = NULL;
2510 int macro;
2511 int hour, minute, second, microsecond;
2512
2513 if (!PyArg_ParseTuple(args, "piiii",
2514 &macro,
2515 &hour, &minute, &second, &microsecond)) {
2516 return NULL;
2517 }
2518
2519 if (macro) {
2520 rv = PyTime_FromTime(hour, minute, second, microsecond);
2521 }
2522 else {
2523 rv = PyDateTimeAPI->Time_FromTime(
2524 hour, minute, second, microsecond,
2525 Py_None,
2526 PyDateTimeAPI->TimeType);
2527 }
2528 return rv;
2529}
2530
2531static PyObject *
2532get_time_fromtimeandfold(PyObject *self, PyObject *args)
2533{
2534 PyObject *rv = NULL;
2535 int macro;
2536 int hour, minute, second, microsecond, fold;
2537
2538 if (!PyArg_ParseTuple(args, "piiiii",
2539 &macro,
2540 &hour, &minute, &second, &microsecond,
2541 &fold)) {
2542 return NULL;
2543 }
2544
2545 if (macro) {
2546 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2547 }
2548 else {
2549 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2550 hour, minute, second, microsecond,
2551 Py_None,
2552 fold,
2553 PyDateTimeAPI->TimeType);
2554 }
2555 return rv;
2556}
2557
2558static PyObject *
2559get_delta_fromdsu(PyObject *self, PyObject *args)
2560{
2561 PyObject *rv = NULL;
2562 int macro;
2563 int days, seconds, microseconds;
2564
2565 if (!PyArg_ParseTuple(args, "piii",
2566 &macro,
2567 &days, &seconds, &microseconds)) {
2568 return NULL;
2569 }
2570
2571 if (macro) {
2572 rv = PyDelta_FromDSU(days, seconds, microseconds);
2573 }
2574 else {
2575 rv = PyDateTimeAPI->Delta_FromDelta(
2576 days, seconds, microseconds, 1,
2577 PyDateTimeAPI->DeltaType);
2578 }
2579
2580 return rv;
2581}
2582
2583static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002584get_date_fromtimestamp(PyObject* self, PyObject *args)
2585{
2586 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2587 int macro = 0;
2588
2589 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2590 return NULL;
2591 }
2592
2593 // Construct the argument tuple
2594 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2595 return NULL;
2596 }
2597
2598 // Pass along to the API function
2599 if (macro) {
2600 rv = PyDate_FromTimestamp(tsargs);
2601 }
2602 else {
2603 rv = PyDateTimeAPI->Date_FromTimestamp(
2604 (PyObject *)PyDateTimeAPI->DateType, tsargs
2605 );
2606 }
2607
2608 Py_DECREF(tsargs);
2609 return rv;
2610}
2611
2612static PyObject *
2613get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2614{
2615 int macro = 0;
2616 int usetz = 0;
2617 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2618 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2619 return NULL;
2620 }
2621
2622 // Construct the argument tuple
2623 if (usetz) {
2624 tsargs = PyTuple_Pack(2, ts, tzinfo);
2625 }
2626 else {
2627 tsargs = PyTuple_Pack(1, ts);
2628 }
2629
2630 if (tsargs == NULL) {
2631 return NULL;
2632 }
2633
2634 // Pass along to the API function
2635 if (macro) {
2636 rv = PyDateTime_FromTimestamp(tsargs);
2637 }
2638 else {
2639 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2640 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2641 );
2642 }
2643
2644 Py_DECREF(tsargs);
2645 return rv;
2646}
2647
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002648static PyObject *
2649test_PyDateTime_GET(PyObject *self, PyObject *obj)
2650{
2651 int year, month, day;
2652
2653 year = PyDateTime_GET_YEAR(obj);
2654 month = PyDateTime_GET_MONTH(obj);
2655 day = PyDateTime_GET_DAY(obj);
2656
2657 return Py_BuildValue("(lll)", year, month, day);
2658}
2659
2660static PyObject *
2661test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2662{
2663 int hour, minute, second, microsecond;
2664
2665 hour = PyDateTime_DATE_GET_HOUR(obj);
2666 minute = PyDateTime_DATE_GET_MINUTE(obj);
2667 second = PyDateTime_DATE_GET_SECOND(obj);
2668 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2669
2670 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2671}
2672
2673static PyObject *
2674test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2675{
2676 int hour, minute, second, microsecond;
2677
2678 hour = PyDateTime_TIME_GET_HOUR(obj);
2679 minute = PyDateTime_TIME_GET_MINUTE(obj);
2680 second = PyDateTime_TIME_GET_SECOND(obj);
2681 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
2682
2683 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2684}
2685
2686static PyObject *
2687test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2688{
2689 int days, seconds, microseconds;
2690
2691 days = PyDateTime_DELTA_GET_DAYS(obj);
2692 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2693 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2694
2695 return Py_BuildValue("(lll)", days, seconds, microseconds);
2696}
Benjamin Peterson16323982010-02-03 01:13:41 +00002697
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002698/* test_thread_state spawns a thread of its own, and that thread releases
2699 * `thread_done` when it's finished. The driver code has to know when the
2700 * thread finishes, because the thread uses a PyObject (the callable) that
2701 * may go away when the driver finishes. The former lack of this explicit
2702 * synchronization caused rare segfaults, so rare that they were seen only
2703 * on a Mac buildbot (although they were possible on any box).
2704 */
2705static PyThread_type_lock thread_done = NULL;
2706
Benjamin Petersona786b022008-08-25 21:05:21 +00002707static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002708_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 PyObject *rc;
2711 int success;
2712 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002713 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 success = (rc != NULL);
2715 Py_XDECREF(rc);
2716 PyGILState_Release(s);
2717 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002718}
2719
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002720/* Same thing, but releases `thread_done` when it returns. This variant
2721 * should be called only from threads spawned by test_thread_state().
2722 */
2723static void
2724_make_call_from_thread(void *callable)
2725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 _make_call(callable);
2727 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002728}
2729
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002730static PyObject *
2731test_thread_state(PyObject *self, PyObject *args)
2732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 PyObject *fn;
2734 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2737 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 if (!PyCallable_Check(fn)) {
2740 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002741 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 return NULL;
2743 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 thread_done = PyThread_allocate_lock();
2746 if (thread_done == NULL)
2747 return PyErr_NoMemory();
2748 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 /* Start a new thread with our callback. */
2751 PyThread_start_new_thread(_make_call_from_thread, fn);
2752 /* Make the callback with the thread lock held by this thread */
2753 success &= _make_call(fn);
2754 /* Do it all again, but this time with the thread-lock released */
2755 Py_BEGIN_ALLOW_THREADS
2756 success &= _make_call(fn);
2757 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2758 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 /* And once more with and without a thread
2761 XXX - should use a lock and work out exactly what we are trying
2762 to test <wink>
2763 */
2764 Py_BEGIN_ALLOW_THREADS
2765 PyThread_start_new_thread(_make_call_from_thread, fn);
2766 success &= _make_call(fn);
2767 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2768 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 /* Release lock we acquired above. This is required on HP-UX. */
2771 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 PyThread_free_lock(thread_done);
2774 if (!success)
2775 return NULL;
2776 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002777}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002778
2779/* test Py_AddPendingCalls using threads */
2780static int _pending_callback(void *arg)
2781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 /* we assume the argument is callable object to which we own a reference */
2783 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002784 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 Py_DECREF(callable);
2786 Py_XDECREF(r);
2787 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002788}
2789
2790/* The following requests n callbacks to _pending_callback. It can be
2791 * run from any python thread.
2792 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002793static PyObject *
2794pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 PyObject *callable;
2797 int r;
2798 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2799 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 /* create the reference for the callbackwhile we hold the lock */
2802 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 Py_BEGIN_ALLOW_THREADS
2805 r = Py_AddPendingCall(&_pending_callback, callable);
2806 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 if (r<0) {
2809 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002810 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002812 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002813}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002814
Neal Norwitzb0d26332007-08-25 00:49:05 +00002815/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002816static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002817test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 PyObject *result;
2820 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002821
Alexander Belopolskye239d232010-12-08 23:31:48 +00002822#define CHECK_1_FORMAT(FORMAT, TYPE) \
2823 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2824 if (result == NULL) \
2825 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002826 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002827 msg = FORMAT " failed at 1"; \
2828 goto Fail; \
2829 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 CHECK_1_FORMAT("%d", int);
2833 CHECK_1_FORMAT("%ld", long);
2834 /* The z width modifier was added in Python 2.5. */
2835 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 /* The u type code was added in Python 2.5. */
2838 CHECK_1_FORMAT("%u", unsigned int);
2839 CHECK_1_FORMAT("%lu", unsigned long);
2840 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002843 CHECK_1_FORMAT("%llu", unsigned long long);
2844 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847
2848 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 Py_XDECREF(result);
2850 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851
2852#undef CHECK_1_FORMAT
2853}
2854
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002855
2856static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302857test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2859 int result;
2860 if (py_s == NULL)
2861 return NULL;
2862 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2863 Py_DECREF(py_s);
2864 if (!result) {
2865 PyErr_SetString(TestError, "Python string ending in NULL "
2866 "should not compare equal to c string.");
2867 return NULL;
2868 }
2869 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002870}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002871
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002872/* This is here to provide a docstring for test_descr. */
2873static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302874test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002877}
2878
Mark Dickinson725bfd82009-05-03 20:33:40 +00002879/* Test PyOS_string_to_double. */
2880static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302881test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002883 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885#define CHECK_STRING(STR, expected) \
2886 result = PyOS_string_to_double(STR, NULL, NULL); \
2887 if (result == -1.0 && PyErr_Occurred()) \
2888 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002889 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 msg = "conversion of " STR " to float failed"; \
2891 goto fail; \
2892 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894#define CHECK_INVALID(STR) \
2895 result = PyOS_string_to_double(STR, NULL, NULL); \
2896 if (result == -1.0 && PyErr_Occurred()) { \
2897 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2898 PyErr_Clear(); \
2899 else \
2900 return NULL; \
2901 } \
2902 else { \
2903 msg = "conversion of " STR " didn't raise ValueError"; \
2904 goto fail; \
2905 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 CHECK_STRING("0.1", 0.1);
2908 CHECK_STRING("1.234", 1.234);
2909 CHECK_STRING("-1.35", -1.35);
2910 CHECK_STRING(".1e01", 1.0);
2911 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 CHECK_INVALID(" 0.1");
2914 CHECK_INVALID("\t\n-3");
2915 CHECK_INVALID(".123 ");
2916 CHECK_INVALID("3\n");
2917 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002920 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002922#undef CHECK_STRING
2923#undef CHECK_INVALID
2924}
2925
2926
Benjamin Petersonb173f782009-05-05 22:31:58 +00002927/* Coverage testing of capsule objects. */
2928
2929static const char *capsule_name = "capsule name";
2930static char *capsule_pointer = "capsule pointer";
2931static char *capsule_context = "capsule context";
2932static const char *capsule_error = NULL;
2933static int
2934capsule_destructor_call_count = 0;
2935
2936static void
2937capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 capsule_destructor_call_count++;
2939 if (PyCapsule_GetContext(o) != capsule_context) {
2940 capsule_error = "context did not match in destructor!";
2941 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2942 capsule_error = "destructor did not match in destructor! (woah!)";
2943 } else if (PyCapsule_GetName(o) != capsule_name) {
2944 capsule_error = "name did not match in destructor!";
2945 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2946 capsule_error = "pointer did not match in destructor!";
2947 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002948}
2949
2950typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 char *name;
2952 char *module;
2953 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002954} known_capsule;
2955
2956static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002957test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 PyObject *object;
2960 const char *error = NULL;
2961 void *pointer;
2962 void *pointer2;
2963 known_capsule known_capsules[] = {
2964 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2965 KNOWN_CAPSULE("_socket", "CAPI"),
2966 KNOWN_CAPSULE("_curses", "_C_API"),
2967 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2968 { NULL, NULL },
2969 };
2970 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002971
2972#define FAIL(x) { error = (x); goto exit; }
2973
2974#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 if (capsule_error) { \
2976 FAIL(capsule_error); \
2977 } \
2978 else if (!capsule_destructor_call_count) { \
2979 FAIL("destructor not called!"); \
2980 } \
2981 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2984 PyCapsule_SetContext(object, capsule_context);
2985 capsule_destructor(object);
2986 CHECK_DESTRUCTOR;
2987 Py_DECREF(object);
2988 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 object = PyCapsule_New(known, "ignored", NULL);
2991 PyCapsule_SetPointer(object, capsule_pointer);
2992 PyCapsule_SetName(object, capsule_name);
2993 PyCapsule_SetDestructor(object, capsule_destructor);
2994 PyCapsule_SetContext(object, capsule_context);
2995 capsule_destructor(object);
2996 CHECK_DESTRUCTOR;
2997 /* intentionally access using the wrong name */
2998 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2999 if (!PyErr_Occurred()) {
3000 FAIL("PyCapsule_GetPointer should have failed but did not!");
3001 }
3002 PyErr_Clear();
3003 if (pointer2) {
3004 if (pointer2 == capsule_pointer) {
3005 FAIL("PyCapsule_GetPointer should not have"
3006 " returned the internal pointer!");
3007 } else {
3008 FAIL("PyCapsule_GetPointer should have "
3009 "returned NULL pointer but did not!");
3010 }
3011 }
3012 PyCapsule_SetDestructor(object, NULL);
3013 Py_DECREF(object);
3014 if (capsule_destructor_call_count) {
3015 FAIL("destructor called when it should not have been!");
3016 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 for (known = &known_capsules[0]; known->module != NULL; known++) {
3019 /* yeah, ordinarily I wouldn't do this either,
3020 but it's fine for this test harness.
3021 */
3022 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003023#undef FAIL
3024#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 { \
3026 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3027 x, known->module, known->attribute); \
3028 error = buffer; \
3029 goto exit; \
3030 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 PyObject *module = PyImport_ImportModule(known->module);
3033 if (module) {
3034 pointer = PyCapsule_Import(known->name, 0);
3035 if (!pointer) {
3036 Py_DECREF(module);
3037 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3038 }
3039 object = PyObject_GetAttrString(module, known->attribute);
3040 if (!object) {
3041 Py_DECREF(module);
3042 return NULL;
3043 }
3044 pointer2 = PyCapsule_GetPointer(object,
3045 "weebles wobble but they don't fall down");
3046 if (!PyErr_Occurred()) {
3047 Py_DECREF(object);
3048 Py_DECREF(module);
3049 FAIL("PyCapsule_GetPointer should have failed but did not!");
3050 }
3051 PyErr_Clear();
3052 if (pointer2) {
3053 Py_DECREF(module);
3054 Py_DECREF(object);
3055 if (pointer2 == pointer) {
3056 FAIL("PyCapsule_GetPointer should not have"
3057 " returned its internal pointer!");
3058 } else {
3059 FAIL("PyCapsule_GetPointer should have"
3060 " returned NULL pointer but did not!");
3061 }
3062 }
3063 Py_DECREF(object);
3064 Py_DECREF(module);
3065 }
3066 else
3067 PyErr_Clear();
3068 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003069
3070 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 if (error) {
3072 return raiseTestError("test_capsule", error);
3073 }
3074 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003075#undef FAIL
3076}
3077
Guido van Rossumddefaf32007-01-14 03:31:43 +00003078#ifdef HAVE_GETTIMEOFDAY
3079/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003080static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 e->tv_sec -= s->tv_sec;
3083 e->tv_usec -= s->tv_usec;
3084 if (e->tv_usec < 0) {
3085 e->tv_sec -=1;
3086 e->tv_usec += 1000000;
3087 }
3088 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003089}
3090
3091static PyObject *
3092profile_int(PyObject *self, PyObject* args)
3093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 int i, k;
3095 struct timeval start, stop;
3096 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 /* Test 1: Allocate and immediately deallocate
3099 many small integers */
3100 gettimeofday(&start, NULL);
3101 for(k=0; k < 20000; k++)
3102 for(i=0; i < 1000; i++) {
3103 single = PyLong_FromLong(i);
3104 Py_DECREF(single);
3105 }
3106 gettimeofday(&stop, NULL);
3107 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 /* Test 2: Allocate and immediately deallocate
3110 many large integers */
3111 gettimeofday(&start, NULL);
3112 for(k=0; k < 20000; k++)
3113 for(i=0; i < 1000; i++) {
3114 single = PyLong_FromLong(i+1000000);
3115 Py_DECREF(single);
3116 }
3117 gettimeofday(&stop, NULL);
3118 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 /* Test 3: Allocate a few integers, then release
3121 them all simultaneously. */
3122 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003123 if (multiple == NULL)
3124 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 gettimeofday(&start, NULL);
3126 for(k=0; k < 20000; k++) {
3127 for(i=0; i < 1000; i++) {
3128 multiple[i] = PyLong_FromLong(i+1000000);
3129 }
3130 for(i=0; i < 1000; i++) {
3131 Py_DECREF(multiple[i]);
3132 }
3133 }
3134 gettimeofday(&stop, NULL);
3135 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003136 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 /* Test 4: Allocate many integers, then release
3139 them all simultaneously. */
3140 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003141 if (multiple == NULL)
3142 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 gettimeofday(&start, NULL);
3144 for(k=0; k < 20; k++) {
3145 for(i=0; i < 1000000; i++) {
3146 multiple[i] = PyLong_FromLong(i+1000000);
3147 }
3148 for(i=0; i < 1000000; i++) {
3149 Py_DECREF(multiple[i]);
3150 }
3151 }
3152 gettimeofday(&stop, NULL);
3153 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003154 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 /* Test 5: Allocate many integers < 32000 */
3157 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003158 if (multiple == NULL)
3159 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 gettimeofday(&start, NULL);
3161 for(k=0; k < 10; k++) {
3162 for(i=0; i < 1000000; i++) {
3163 multiple[i] = PyLong_FromLong(i+1000);
3164 }
3165 for(i=0; i < 1000000; i++) {
3166 Py_DECREF(multiple[i]);
3167 }
3168 }
3169 gettimeofday(&stop, NULL);
3170 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003171 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 /* Test 6: Perform small int addition */
3174 op1 = PyLong_FromLong(1);
3175 gettimeofday(&start, NULL);
3176 for(i=0; i < 10000000; i++) {
3177 result = PyNumber_Add(op1, op1);
3178 Py_DECREF(result);
3179 }
3180 gettimeofday(&stop, NULL);
3181 Py_DECREF(op1);
3182 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 /* Test 7: Perform medium int addition */
3185 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003186 if (op1 == NULL)
3187 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 gettimeofday(&start, NULL);
3189 for(i=0; i < 10000000; i++) {
3190 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003191 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 }
3193 gettimeofday(&stop, NULL);
3194 Py_DECREF(op1);
3195 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003196
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003197 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003198}
3199#endif
3200
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003201/* To test the format of tracebacks as printed out. */
3202static PyObject *
3203traceback_print(PyObject *self, PyObject *args)
3204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 PyObject *file;
3206 PyObject *traceback;
3207 int result;
3208
3209 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3210 &traceback, &file))
3211 return NULL;
3212
3213 result = PyTraceBack_Print(traceback, file);
3214 if (result < 0)
3215 return NULL;
3216 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003217}
3218
Benjamin Petersone6528212008-07-15 15:32:09 +00003219/* To test the format of exceptions as printed out. */
3220static PyObject *
3221exception_print(PyObject *self, PyObject *args)
3222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 PyObject *value;
3224 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 if (!PyArg_ParseTuple(args, "O:exception_print",
3227 &value))
3228 return NULL;
3229 if (!PyExceptionInstance_Check(value)) {
3230 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3231 return NULL;
3232 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 tb = PyException_GetTraceback(value);
3235 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3236 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003239}
3240
3241
3242
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003243
3244/* reliably raise a MemoryError */
3245static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303246raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 PyErr_NoMemory();
3249 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003250}
3251
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003252/* Issue 6012 */
3253static PyObject *str1, *str2;
3254static int
3255failing_converter(PyObject *obj, void *arg)
3256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 /* Clone str1, then let the conversion fail. */
3258 assert(str1);
3259 str2 = str1;
3260 Py_INCREF(str2);
3261 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003262}
3263static PyObject*
3264argparsing(PyObject *o, PyObject *args)
3265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 PyObject *res;
3267 str1 = str2 = NULL;
3268 if (!PyArg_ParseTuple(args, "O&O&",
3269 PyUnicode_FSConverter, &str1,
3270 failing_converter, &str2)) {
3271 if (!str2)
3272 /* argument converter not called? */
3273 return NULL;
3274 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003275 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 Py_DECREF(str2);
3277 PyErr_Clear();
3278 return res;
3279 }
3280 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003281}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003282
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003283/* To test that the result of PyCode_NewEmpty has the right members. */
3284static PyObject *
3285code_newempty(PyObject *self, PyObject *args)
3286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 const char *filename;
3288 const char *funcname;
3289 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3292 &filename, &funcname, &firstlineno))
3293 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003296}
3297
Georg Brandl1e28a272009-12-28 08:41:01 +00003298/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3299 Run via Lib/test/test_exceptions.py */
3300static PyObject *
3301make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 const char *name;
3304 const char *doc = NULL;
3305 PyObject *base = NULL;
3306 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3311 "s|sOO:make_exception_with_doc", kwlist,
3312 &name, &doc, &base, &dict))
3313 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003316}
3317
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003318static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303319make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003320{
3321 Py_buffer info;
3322 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3323 return NULL;
3324 return PyMemoryView_FromBuffer(&info);
3325}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003326
Stefan Krah7213fcc2015-02-01 16:19:23 +01003327static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003328test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003329{
3330 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3331 int init[5] = {0, 1, 2, 3, 4};
3332 Py_ssize_t itemsize = sizeof(int);
3333 Py_ssize_t shape = 5;
3334 Py_ssize_t strides = 2 * itemsize;
3335 Py_buffer view = {
3336 data,
3337 NULL,
3338 5 * itemsize,
3339 itemsize,
3340 1,
3341 1,
3342 NULL,
3343 &shape,
3344 &strides,
3345 NULL,
3346 NULL
3347 };
3348 int *ptr;
3349 int i;
3350
3351 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3352 ptr = view.buf;
3353 for (i = 0; i < 5; i++) {
3354 if (ptr[2*i] != i) {
3355 PyErr_SetString(TestError,
3356 "test_from_contiguous: incorrect result");
3357 return NULL;
3358 }
3359 }
3360
3361 view.buf = &data[8];
3362 view.strides[0] = -2 * itemsize;
3363
3364 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3365 ptr = view.buf;
3366 for (i = 0; i < 5; i++) {
3367 if (*(ptr-2*i) != i) {
3368 PyErr_SetString(TestError,
3369 "test_from_contiguous: incorrect result");
3370 return NULL;
3371 }
3372 }
3373
3374 Py_RETURN_NONE;
3375}
Stefan Krah650c1e82015-02-03 21:43:23 +01003376
Stefan Kraha7559c02015-02-03 22:27:21 +01003377#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003378extern PyTypeObject _PyBytesIOBuffer_Type;
3379
Stefan Krah5178d912015-02-03 16:57:21 +01003380static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003381test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003382{
Stefan Krah650c1e82015-02-03 21:43:23 +01003383 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003384 PyObject *b;
3385 char *dummy[1];
3386 int ret, match;
3387
Stefan Krah650c1e82015-02-03 21:43:23 +01003388 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003389 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3390 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3391 PyErr_Clear();
3392 if (ret != -1 || match == 0)
3393 goto error;
3394
Stefan Krah650c1e82015-02-03 21:43:23 +01003395 /* bytesiobuf_getbuffer() */
3396 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003397 if (b == NULL) {
3398 return NULL;
3399 }
3400
3401 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3402 Py_DECREF(b);
3403 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3404 PyErr_Clear();
3405 if (ret != -1 || match == 0)
3406 goto error;
3407
3408 Py_RETURN_NONE;
3409
3410error:
3411 PyErr_SetString(TestError,
3412 "test_pep3118_obsolete_write_locks: failure");
3413 return NULL;
3414}
Stefan Kraha7559c02015-02-03 22:27:21 +01003415#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003416
Stefan Krah650c1e82015-02-03 21:43:23 +01003417/* This tests functions that historically supported write locks. It is
3418 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3419 is entitled to segfault in that case. */
3420static PyObject *
3421getbuffer_with_null_view(PyObject* self, PyObject *obj)
3422{
3423 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3424 return NULL;
3425
3426 Py_RETURN_NONE;
3427}
3428
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003429/* PyBuffer_SizeFromFormat() */
3430static PyObject *
3431test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3432{
3433 const char *format;
3434 Py_ssize_t result;
3435
3436 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3437 &format)) {
3438 return NULL;
3439 }
3440
3441 result = PyBuffer_SizeFromFormat(format);
3442 if (result == -1) {
3443 return NULL;
3444 }
3445
3446 return PyLong_FromSsize_t(result);
3447}
3448
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003449/* Test that the fatal error from not having a current thread doesn't
3450 cause an infinite loop. Run via Lib/test/test_capi.py */
3451static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303452crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003453{
3454 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003455 /* Using PyThreadState_Get() directly allows the test to pass in
3456 !pydebug mode. However, the test only actually tests anything
3457 in pydebug mode, since that's where the infinite loop was in
3458 the first place. */
3459 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003460 Py_END_ALLOW_THREADS
3461 return NULL;
3462}
3463
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003464/* To run some code in a sub-interpreter. */
3465static PyObject *
3466run_in_subinterp(PyObject *self, PyObject *args)
3467{
3468 const char *code;
3469 int r;
3470 PyThreadState *substate, *mainstate;
3471
3472 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3473 &code))
3474 return NULL;
3475
3476 mainstate = PyThreadState_Get();
3477
3478 PyThreadState_Swap(NULL);
3479
3480 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003481 if (substate == NULL) {
3482 /* Since no new thread state was created, there is no exception to
3483 propagate; raise a fresh one after swapping in the old thread
3484 state. */
3485 PyThreadState_Swap(mainstate);
3486 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3487 return NULL;
3488 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003489 r = PyRun_SimpleString(code);
3490 Py_EndInterpreter(substate);
3491
3492 PyThreadState_Swap(mainstate);
3493
3494 return PyLong_FromLong(r);
3495}
3496
Victor Stinner3c1b3792014-02-17 00:02:43 +01003497static int
3498check_time_rounding(int round)
3499{
Victor Stinner74474232015-09-02 01:43:56 +02003500 if (round != _PyTime_ROUND_FLOOR
3501 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003502 && round != _PyTime_ROUND_HALF_EVEN
3503 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003504 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3505 return -1;
3506 }
3507 return 0;
3508}
3509
Victor Stinner5d272cc2012-03-13 13:35:55 +01003510static PyObject *
3511test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3512{
3513 PyObject *obj;
3514 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003515 int round;
3516 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003517 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003518 if (check_time_rounding(round) < 0)
3519 return NULL;
3520 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003521 return NULL;
3522 return _PyLong_FromTime_t(sec);
3523}
3524
3525static PyObject *
3526test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3527{
3528 PyObject *obj;
3529 time_t sec;
3530 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003531 int round;
3532 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003533 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003534 if (check_time_rounding(round) < 0)
3535 return NULL;
3536 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003537 return NULL;
3538 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3539}
3540
Victor Stinner643cd682012-03-02 22:54:03 +01003541static PyObject *
3542test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3543{
3544 PyObject *obj;
3545 time_t sec;
3546 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003547 int round;
3548 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003549 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003550 if (check_time_rounding(round) < 0)
3551 return NULL;
3552 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003553 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003554 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003555}
3556
Antoine Pitrou796564c2013-07-30 19:59:21 +02003557static void
3558slot_tp_del(PyObject *self)
3559{
3560 _Py_IDENTIFIER(__tp_del__);
3561 PyObject *del, *res;
3562 PyObject *error_type, *error_value, *error_traceback;
3563
3564 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003565 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003566 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003567
3568 /* Save the current exception, if any. */
3569 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3570
3571 /* Execute __del__ method, if any. */
3572 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3573 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003574 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003575 if (res == NULL)
3576 PyErr_WriteUnraisable(del);
3577 else
3578 Py_DECREF(res);
3579 Py_DECREF(del);
3580 }
3581
3582 /* Restore the saved exception. */
3583 PyErr_Restore(error_type, error_value, error_traceback);
3584
3585 /* Undo the temporary resurrection; can't use DECREF here, it would
3586 * cause a recursive call.
3587 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003588 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003589 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3590 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003591 /* this is the normal path out */
3592 return;
3593 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003594
3595 /* __del__ resurrected it! Make it look like the original Py_DECREF
3596 * never happened.
3597 */
3598 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003599 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003600 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003601 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003602 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003603 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003604 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3605 _Py_RefTotal, so we need to undo that. */
3606#ifdef Py_REF_DEBUG
3607 _Py_RefTotal--;
3608#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003609}
3610
3611static PyObject *
3612with_tp_del(PyObject *self, PyObject *args)
3613{
3614 PyObject *obj;
3615 PyTypeObject *tp;
3616
3617 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3618 return NULL;
3619 tp = (PyTypeObject *) obj;
3620 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3621 PyErr_Format(PyExc_TypeError,
3622 "heap type expected, got %R", obj);
3623 return NULL;
3624 }
3625 tp->tp_del = slot_tp_del;
3626 Py_INCREF(obj);
3627 return obj;
3628}
3629
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003630static PyMethodDef ml;
3631
3632static PyObject *
3633create_cfunction(PyObject *self, PyObject *args)
3634{
3635 return PyCFunction_NewEx(&ml, self, NULL);
3636}
3637
3638static PyMethodDef ml = {
3639 "create_cfunction",
3640 create_cfunction,
3641 METH_NOARGS,
3642 NULL
3643};
3644
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003645static PyObject *
3646_test_incref(PyObject *ob)
3647{
3648 Py_INCREF(ob);
3649 return ob;
3650}
3651
3652static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303653test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003654{
3655 PyObject *obj = PyLong_FromLong(0);
3656 Py_XINCREF(_test_incref(obj));
3657 Py_DECREF(obj);
3658 Py_DECREF(obj);
3659 Py_DECREF(obj);
3660 Py_RETURN_NONE;
3661}
3662
3663static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303664test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003665{
3666 PyObject *obj = PyLong_FromLong(0);
3667 Py_INCREF(_test_incref(obj));
3668 Py_DECREF(obj);
3669 Py_DECREF(obj);
3670 Py_DECREF(obj);
3671 Py_RETURN_NONE;
3672}
3673
3674static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303675test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003676{
3677 Py_XDECREF(PyLong_FromLong(0));
3678 Py_RETURN_NONE;
3679}
3680
3681static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303682test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003683{
3684 Py_DECREF(PyLong_FromLong(0));
3685 Py_RETURN_NONE;
3686}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003687
Victor Stinner0507bf52013-07-07 02:05:46 +02003688static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003689test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3690 PyObject *Py_UNUSED(args))
3691{
3692 PyStructSequence_Desc descr;
3693 PyStructSequence_Field descr_fields[3];
3694
3695 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3696 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3697 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3698
3699 descr.name = "_testcapi.test_descr";
3700 descr.doc = "This is used to test for memory leaks in NewType";
3701 descr.fields = descr_fields;
3702 descr.n_in_sequence = 1;
3703
3704 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3705 assert(structseq_type != NULL);
3706 assert(PyType_Check(structseq_type));
3707 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3708 Py_DECREF(structseq_type);
3709
3710 Py_RETURN_NONE;
3711}
3712
3713static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303714test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003715{
3716 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003717 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003718 Py_DecRef(obj);
3719 Py_DecRef(obj);
3720 Py_RETURN_NONE;
3721}
3722
3723static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303724test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003725{
3726 void *ptr;
3727
Victor Stinnerdb067af2014-05-02 22:31:14 +02003728 ptr = PyMem_RawMalloc(0);
3729 if (ptr == NULL) {
3730 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3731 return NULL;
3732 }
3733 PyMem_RawFree(ptr);
3734
3735 ptr = PyMem_RawCalloc(0, 0);
3736 if (ptr == NULL) {
3737 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3738 return NULL;
3739 }
3740 PyMem_RawFree(ptr);
3741
Victor Stinner0507bf52013-07-07 02:05:46 +02003742 ptr = PyMem_Malloc(0);
3743 if (ptr == NULL) {
3744 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3745 return NULL;
3746 }
3747 PyMem_Free(ptr);
3748
Victor Stinnerdb067af2014-05-02 22:31:14 +02003749 ptr = PyMem_Calloc(0, 0);
3750 if (ptr == NULL) {
3751 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3752 return NULL;
3753 }
3754 PyMem_Free(ptr);
3755
Victor Stinner0507bf52013-07-07 02:05:46 +02003756 ptr = PyObject_Malloc(0);
3757 if (ptr == NULL) {
3758 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3759 return NULL;
3760 }
3761 PyObject_Free(ptr);
3762
Victor Stinnerdb067af2014-05-02 22:31:14 +02003763 ptr = PyObject_Calloc(0, 0);
3764 if (ptr == NULL) {
3765 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3766 return NULL;
3767 }
3768 PyObject_Free(ptr);
3769
Victor Stinner0507bf52013-07-07 02:05:46 +02003770 Py_RETURN_NONE;
3771}
3772
3773typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003774 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003775
3776 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003777 size_t calloc_nelem;
3778 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003779 void *realloc_ptr;
3780 size_t realloc_new_size;
3781 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003782 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003783} alloc_hook_t;
3784
Victor Stinner9ed83c42017-10-31 12:18:10 -07003785static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003786{
3787 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003788 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003789 hook->malloc_size = size;
3790 return hook->alloc.malloc(hook->alloc.ctx, size);
3791}
3792
Victor Stinner9ed83c42017-10-31 12:18:10 -07003793static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003794{
3795 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003796 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003797 hook->calloc_nelem = nelem;
3798 hook->calloc_elsize = elsize;
3799 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3800}
3801
Victor Stinner9ed83c42017-10-31 12:18:10 -07003802static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003803{
3804 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003805 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003806 hook->realloc_ptr = ptr;
3807 hook->realloc_new_size = new_size;
3808 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3809}
3810
Victor Stinner9ed83c42017-10-31 12:18:10 -07003811static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003812{
3813 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003814 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003815 hook->free_ptr = ptr;
3816 hook->alloc.free(hook->alloc.ctx, ptr);
3817}
3818
3819static PyObject *
3820test_setallocators(PyMemAllocatorDomain domain)
3821{
3822 PyObject *res = NULL;
3823 const char *error_msg;
3824 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003825 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003826 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003827 void *ptr, *ptr2;
3828
Victor Stinnerdb067af2014-05-02 22:31:14 +02003829 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003830
3831 alloc.ctx = &hook;
3832 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003833 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003834 alloc.realloc = &hook_realloc;
3835 alloc.free = &hook_free;
3836 PyMem_GetAllocator(domain, &hook.alloc);
3837 PyMem_SetAllocator(domain, &alloc);
3838
Victor Stinner9ed83c42017-10-31 12:18:10 -07003839 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003840 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003841 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003842 switch(domain)
3843 {
3844 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3845 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3846 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3847 default: ptr = NULL; break;
3848 }
3849
Victor Stinner9ed83c42017-10-31 12:18:10 -07003850#define CHECK_CTX(FUNC) \
3851 if (hook.ctx != &hook) { \
3852 error_msg = FUNC " wrong context"; \
3853 goto fail; \
3854 } \
3855 hook.ctx = NULL; /* reset for next check */
3856
Victor Stinner0507bf52013-07-07 02:05:46 +02003857 if (ptr == NULL) {
3858 error_msg = "malloc failed";
3859 goto fail;
3860 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003861 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003862 if (hook.malloc_size != size) {
3863 error_msg = "malloc invalid size";
3864 goto fail;
3865 }
3866
3867 size2 = 200;
3868 switch(domain)
3869 {
3870 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3871 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3872 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003873 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003874 }
3875
3876 if (ptr2 == NULL) {
3877 error_msg = "realloc failed";
3878 goto fail;
3879 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003880 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003881 if (hook.realloc_ptr != ptr
3882 || hook.realloc_new_size != size2) {
3883 error_msg = "realloc invalid parameters";
3884 goto fail;
3885 }
3886
3887 switch(domain)
3888 {
3889 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3890 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3891 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3892 }
3893
Victor Stinner9ed83c42017-10-31 12:18:10 -07003894 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003895 if (hook.free_ptr != ptr2) {
3896 error_msg = "free invalid pointer";
3897 goto fail;
3898 }
3899
Victor Stinner9ed83c42017-10-31 12:18:10 -07003900 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003901 nelem = 2;
3902 elsize = 5;
3903 switch(domain)
3904 {
3905 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3906 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3907 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3908 default: ptr = NULL; break;
3909 }
3910
3911 if (ptr == NULL) {
3912 error_msg = "calloc failed";
3913 goto fail;
3914 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003915 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003916 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3917 error_msg = "calloc invalid nelem or elsize";
3918 goto fail;
3919 }
3920
Victor Stinner9ed83c42017-10-31 12:18:10 -07003921 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003922 switch(domain)
3923 {
3924 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3925 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3926 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3927 }
3928
Victor Stinner9ed83c42017-10-31 12:18:10 -07003929 CHECK_CTX("calloc free");
3930 if (hook.free_ptr != ptr) {
3931 error_msg = "calloc free invalid pointer";
3932 goto fail;
3933 }
3934
Victor Stinner0507bf52013-07-07 02:05:46 +02003935 Py_INCREF(Py_None);
3936 res = Py_None;
3937 goto finally;
3938
3939fail:
3940 PyErr_SetString(PyExc_RuntimeError, error_msg);
3941
3942finally:
3943 PyMem_SetAllocator(domain, &hook.alloc);
3944 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003945
3946#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003947}
3948
3949static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303950test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003951{
3952 return test_setallocators(PYMEM_DOMAIN_RAW);
3953}
3954
3955static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303956test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003957{
3958 return test_setallocators(PYMEM_DOMAIN_MEM);
3959}
3960
3961static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303962test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003963{
3964 return test_setallocators(PYMEM_DOMAIN_OBJ);
3965}
3966
xdegaye85f64302017-07-01 14:14:45 +02003967/* Most part of the following code is inherited from the pyfailmalloc project
3968 * written by Victor Stinner. */
3969static struct {
3970 int installed;
3971 PyMemAllocatorEx raw;
3972 PyMemAllocatorEx mem;
3973 PyMemAllocatorEx obj;
3974} FmHook;
3975
3976static struct {
3977 int start;
3978 int stop;
3979 Py_ssize_t count;
3980} FmData;
3981
3982static int
3983fm_nomemory(void)
3984{
3985 FmData.count++;
3986 if (FmData.count > FmData.start &&
3987 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3988 return 1;
3989 }
3990 return 0;
3991}
3992
3993static void *
3994hook_fmalloc(void *ctx, size_t size)
3995{
3996 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3997 if (fm_nomemory()) {
3998 return NULL;
3999 }
4000 return alloc->malloc(alloc->ctx, size);
4001}
4002
4003static void *
4004hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4005{
4006 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4007 if (fm_nomemory()) {
4008 return NULL;
4009 }
4010 return alloc->calloc(alloc->ctx, nelem, elsize);
4011}
4012
4013static void *
4014hook_frealloc(void *ctx, void *ptr, size_t new_size)
4015{
4016 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4017 if (fm_nomemory()) {
4018 return NULL;
4019 }
4020 return alloc->realloc(alloc->ctx, ptr, new_size);
4021}
4022
4023static void
4024hook_ffree(void *ctx, void *ptr)
4025{
4026 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4027 alloc->free(alloc->ctx, ptr);
4028}
4029
4030static void
4031fm_setup_hooks(void)
4032{
4033 PyMemAllocatorEx alloc;
4034
4035 if (FmHook.installed) {
4036 return;
4037 }
4038 FmHook.installed = 1;
4039
4040 alloc.malloc = hook_fmalloc;
4041 alloc.calloc = hook_fcalloc;
4042 alloc.realloc = hook_frealloc;
4043 alloc.free = hook_ffree;
4044 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4045 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4046 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4047
4048 alloc.ctx = &FmHook.raw;
4049 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4050
4051 alloc.ctx = &FmHook.mem;
4052 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4053
4054 alloc.ctx = &FmHook.obj;
4055 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4056}
4057
4058static void
4059fm_remove_hooks(void)
4060{
4061 if (FmHook.installed) {
4062 FmHook.installed = 0;
4063 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4064 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4065 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4066 }
4067}
4068
4069static PyObject*
4070set_nomemory(PyObject *self, PyObject *args)
4071{
4072 /* Memory allocation fails after 'start' allocation requests, and until
4073 * 'stop' allocation requests except when 'stop' is negative or equal
4074 * to 0 (default) in which case allocation failures never stop. */
4075 FmData.count = 0;
4076 FmData.stop = 0;
4077 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4078 return NULL;
4079 }
4080 fm_setup_hooks();
4081 Py_RETURN_NONE;
4082}
4083
4084static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304085remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004086{
4087 fm_remove_hooks();
4088 Py_RETURN_NONE;
4089}
4090
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004091PyDoc_STRVAR(docstring_empty,
4092""
4093);
4094
4095PyDoc_STRVAR(docstring_no_signature,
4096"This docstring has no signature."
4097);
4098
4099PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004100"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004101"\n"
4102"This docstring has an invalid signature."
4103);
4104
Larry Hastings2623c8c2014-02-08 22:15:29 -08004105PyDoc_STRVAR(docstring_with_invalid_signature2,
4106"docstring_with_invalid_signature2($module, /, boo)\n"
4107"\n"
4108"--\n"
4109"\n"
4110"This docstring also has an invalid signature."
4111);
4112
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004113PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004114"docstring_with_signature($module, /, sig)\n"
4115"--\n"
4116"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004117"This docstring has a valid signature."
4118);
4119
Zachary Ware8ef887c2015-04-13 18:22:35 -05004120PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4121"docstring_with_signature_but_no_doc($module, /, sig)\n"
4122"--\n"
4123"\n"
4124);
4125
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004126PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004127"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4128"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004129"\n"
4130"\n"
4131"This docstring has a valid signature and some extra newlines."
4132);
4133
Larry Hastings16c51912014-01-07 11:53:01 -08004134PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004135"docstring_with_signature_with_defaults(module, s='avocado',\n"
4136" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4137" local=the_number_three, sys=sys.maxsize,\n"
4138" exp=sys.maxsize - 1)\n"
4139"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004140"\n"
4141"\n"
4142"\n"
4143"This docstring has a valid signature with parameters,\n"
4144"and the parameters take defaults of varying types."
4145);
4146
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004147typedef struct {
4148 PyThread_type_lock start_event;
4149 PyThread_type_lock exit_event;
4150 PyObject *callback;
4151} test_c_thread_t;
4152
4153static void
4154temporary_c_thread(void *data)
4155{
4156 test_c_thread_t *test_c_thread = data;
4157 PyGILState_STATE state;
4158 PyObject *res;
4159
4160 PyThread_release_lock(test_c_thread->start_event);
4161
4162 /* Allocate a Python thread state for this thread */
4163 state = PyGILState_Ensure();
4164
Victor Stinner3466bde2016-09-05 18:16:01 -07004165 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004166 Py_CLEAR(test_c_thread->callback);
4167
4168 if (res == NULL) {
4169 PyErr_Print();
4170 }
4171 else {
4172 Py_DECREF(res);
4173 }
4174
4175 /* Destroy the Python thread state for this thread */
4176 PyGILState_Release(state);
4177
4178 PyThread_release_lock(test_c_thread->exit_event);
4179
4180 PyThread_exit_thread();
4181}
4182
4183static PyObject *
4184call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4185{
4186 PyObject *res = NULL;
4187 test_c_thread_t test_c_thread;
4188 long thread;
4189
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004190 test_c_thread.start_event = PyThread_allocate_lock();
4191 test_c_thread.exit_event = PyThread_allocate_lock();
4192 test_c_thread.callback = NULL;
4193 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4194 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4195 goto exit;
4196 }
4197
4198 Py_INCREF(callback);
4199 test_c_thread.callback = callback;
4200
4201 PyThread_acquire_lock(test_c_thread.start_event, 1);
4202 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4203
4204 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4205 if (thread == -1) {
4206 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4207 PyThread_release_lock(test_c_thread.start_event);
4208 PyThread_release_lock(test_c_thread.exit_event);
4209 goto exit;
4210 }
4211
4212 PyThread_acquire_lock(test_c_thread.start_event, 1);
4213 PyThread_release_lock(test_c_thread.start_event);
4214
4215 Py_BEGIN_ALLOW_THREADS
4216 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4217 PyThread_release_lock(test_c_thread.exit_event);
4218 Py_END_ALLOW_THREADS
4219
4220 Py_INCREF(Py_None);
4221 res = Py_None;
4222
4223exit:
4224 Py_CLEAR(test_c_thread.callback);
4225 if (test_c_thread.start_event)
4226 PyThread_free_lock(test_c_thread.start_event);
4227 if (test_c_thread.exit_event)
4228 PyThread_free_lock(test_c_thread.exit_event);
4229 return res;
4230}
Victor Stinner13105102013-12-13 02:17:29 +01004231
Serhiy Storchakab5181342015-02-06 08:58:56 +02004232/* marshal */
4233
4234static PyObject*
4235pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4236{
4237 long value;
4238 char *filename;
4239 int version;
4240 FILE *fp;
4241
4242 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4243 &value, &filename, &version))
4244 return NULL;
4245
4246 fp = fopen(filename, "wb");
4247 if (fp == NULL) {
4248 PyErr_SetFromErrno(PyExc_OSError);
4249 return NULL;
4250 }
4251
4252 PyMarshal_WriteLongToFile(value, fp, version);
4253
4254 fclose(fp);
4255 if (PyErr_Occurred())
4256 return NULL;
4257 Py_RETURN_NONE;
4258}
4259
4260static PyObject*
4261pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4262{
4263 PyObject *obj;
4264 char *filename;
4265 int version;
4266 FILE *fp;
4267
4268 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4269 &obj, &filename, &version))
4270 return NULL;
4271
4272 fp = fopen(filename, "wb");
4273 if (fp == NULL) {
4274 PyErr_SetFromErrno(PyExc_OSError);
4275 return NULL;
4276 }
4277
4278 PyMarshal_WriteObjectToFile(obj, fp, version);
4279
4280 fclose(fp);
4281 if (PyErr_Occurred())
4282 return NULL;
4283 Py_RETURN_NONE;
4284}
4285
4286static PyObject*
4287pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4288{
4289 int value;
4290 long pos;
4291 char *filename;
4292 FILE *fp;
4293
4294 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4295 return NULL;
4296
4297 fp = fopen(filename, "rb");
4298 if (fp == NULL) {
4299 PyErr_SetFromErrno(PyExc_OSError);
4300 return NULL;
4301 }
4302
4303 value = PyMarshal_ReadShortFromFile(fp);
4304 pos = ftell(fp);
4305
4306 fclose(fp);
4307 if (PyErr_Occurred())
4308 return NULL;
4309 return Py_BuildValue("il", value, pos);
4310}
4311
4312static PyObject*
4313pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4314{
4315 long value, pos;
4316 char *filename;
4317 FILE *fp;
4318
4319 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4320 return NULL;
4321
4322 fp = fopen(filename, "rb");
4323 if (fp == NULL) {
4324 PyErr_SetFromErrno(PyExc_OSError);
4325 return NULL;
4326 }
4327
4328 value = PyMarshal_ReadLongFromFile(fp);
4329 pos = ftell(fp);
4330
4331 fclose(fp);
4332 if (PyErr_Occurred())
4333 return NULL;
4334 return Py_BuildValue("ll", value, pos);
4335}
4336
4337static PyObject*
4338pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4339{
4340 PyObject *obj;
4341 long pos;
4342 char *filename;
4343 FILE *fp;
4344
4345 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4346 return NULL;
4347
4348 fp = fopen(filename, "rb");
4349 if (fp == NULL) {
4350 PyErr_SetFromErrno(PyExc_OSError);
4351 return NULL;
4352 }
4353
4354 obj = PyMarshal_ReadLastObjectFromFile(fp);
4355 pos = ftell(fp);
4356
4357 fclose(fp);
4358 return Py_BuildValue("Nl", obj, pos);
4359}
4360
4361static PyObject*
4362pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4363{
4364 PyObject *obj;
4365 long pos;
4366 char *filename;
4367 FILE *fp;
4368
4369 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4370 return NULL;
4371
4372 fp = fopen(filename, "rb");
4373 if (fp == NULL) {
4374 PyErr_SetFromErrno(PyExc_OSError);
4375 return NULL;
4376 }
4377
4378 obj = PyMarshal_ReadObjectFromFile(fp);
4379 pos = ftell(fp);
4380
4381 fclose(fp);
4382 return Py_BuildValue("Nl", obj, pos);
4383}
4384
Victor Stinnerefde1462015-03-21 15:04:43 +01004385static PyObject*
4386return_null_without_error(PyObject *self, PyObject *args)
4387{
4388 /* invalid call: return NULL without setting an error,
4389 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4390 PyErr_Clear();
4391 return NULL;
4392}
4393
4394static PyObject*
4395return_result_with_error(PyObject *self, PyObject *args)
4396{
4397 /* invalid call: return a result with an error set,
4398 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4399 PyErr_SetNone(PyExc_ValueError);
4400 Py_RETURN_NONE;
4401}
4402
Victor Stinner992c43f2015-03-27 17:12:45 +01004403static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004404test_pytime_fromseconds(PyObject *self, PyObject *args)
4405{
4406 int seconds;
4407 _PyTime_t ts;
4408
4409 if (!PyArg_ParseTuple(args, "i", &seconds))
4410 return NULL;
4411 ts = _PyTime_FromSeconds(seconds);
4412 return _PyTime_AsNanosecondsObject(ts);
4413}
4414
4415static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004416test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4417{
4418 PyObject *obj;
4419 int round;
4420 _PyTime_t ts;
4421
4422 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4423 return NULL;
4424 if (check_time_rounding(round) < 0)
4425 return NULL;
4426 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4427 return NULL;
4428 return _PyTime_AsNanosecondsObject(ts);
4429}
4430
Victor Stinner4bfb4602015-03-27 22:27:24 +01004431static PyObject *
4432test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4433{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004434 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004435 _PyTime_t ts;
4436 double d;
4437
Victor Stinnerc29b5852017-11-02 07:28:27 -07004438 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004439 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004440 }
4441 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4442 return NULL;
4443 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004444 d = _PyTime_AsSecondsDouble(ts);
4445 return PyFloat_FromDouble(d);
4446}
4447
Victor Stinner95e9cef2015-03-28 01:26:47 +01004448static PyObject *
4449test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4450{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004451 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004452 int round;
4453 _PyTime_t t;
4454 struct timeval tv;
4455 PyObject *seconds;
4456
Victor Stinnerc29b5852017-11-02 07:28:27 -07004457 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004458 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004459 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004460 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004461 }
4462 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004463 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004464 }
4465 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4466 return NULL;
4467 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004468
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004469 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004470 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004471 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004472 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004473 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4474}
4475
Victor Stinner34dc0f42015-03-27 18:19:03 +01004476#ifdef HAVE_CLOCK_GETTIME
4477static PyObject *
4478test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4479{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004480 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004481 _PyTime_t t;
4482 struct timespec ts;
4483
Victor Stinnerc29b5852017-11-02 07:28:27 -07004484 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004485 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004486 }
4487 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004488 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004489 }
4490 if (_PyTime_AsTimespec(t, &ts) == -1) {
4491 return NULL;
4492 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004493 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4494}
4495#endif
4496
Victor Stinner62d1c702015-04-01 17:47:07 +02004497static PyObject *
4498test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4499{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004500 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004501 int round;
4502 _PyTime_t t, ms;
4503
Victor Stinnerc29b5852017-11-02 07:28:27 -07004504 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004505 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004506 }
4507 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004508 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004509 }
4510 if (check_time_rounding(round) < 0) {
4511 return NULL;
4512 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004513 ms = _PyTime_AsMilliseconds(t, round);
4514 /* This conversion rely on the fact that _PyTime_t is a number of
4515 nanoseconds */
4516 return _PyTime_AsNanosecondsObject(ms);
4517}
4518
4519static PyObject *
4520test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4521{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004522 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004523 int round;
4524 _PyTime_t t, ms;
4525
Victor Stinnerc29b5852017-11-02 07:28:27 -07004526 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004527 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004528 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004529 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004530 }
4531 if (check_time_rounding(round) < 0) {
4532 return NULL;
4533 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004534 ms = _PyTime_AsMicroseconds(t, round);
4535 /* This conversion rely on the fact that _PyTime_t is a number of
4536 nanoseconds */
4537 return _PyTime_AsNanosecondsObject(ms);
4538}
4539
Victor Stinner50856d52015-10-13 00:11:21 +02004540static PyObject*
Victor Stinner34be8072016-03-14 12:04:26 +01004541pymem_buffer_overflow(PyObject *self, PyObject *args)
4542{
4543 char *buffer;
4544
4545 /* Deliberate buffer overflow to check that PyMem_Free() detects
4546 the overflow when debug hooks are installed. */
4547 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004548 if (buffer == NULL) {
4549 PyErr_NoMemory();
4550 return NULL;
4551 }
Victor Stinner34be8072016-03-14 12:04:26 +01004552 buffer[16] = 'x';
4553 PyMem_Free(buffer);
4554
4555 Py_RETURN_NONE;
4556}
4557
4558static PyObject*
4559pymem_api_misuse(PyObject *self, PyObject *args)
4560{
4561 char *buffer;
4562
4563 /* Deliberate misusage of Python allocators:
4564 allococate with PyMem but release with PyMem_Raw. */
4565 buffer = PyMem_Malloc(16);
4566 PyMem_RawFree(buffer);
4567
4568 Py_RETURN_NONE;
4569}
4570
Victor Stinnerc4aec362016-03-14 22:26:53 +01004571static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004572pymem_malloc_without_gil(PyObject *self, PyObject *args)
4573{
4574 char *buffer;
4575
4576 /* Deliberate bug to test debug hooks on Python memory allocators:
4577 call PyMem_Malloc() without holding the GIL */
4578 Py_BEGIN_ALLOW_THREADS
4579 buffer = PyMem_Malloc(10);
4580 Py_END_ALLOW_THREADS
4581
4582 PyMem_Free(buffer);
4583
4584 Py_RETURN_NONE;
4585}
4586
Victor Stinner5d39e042017-11-29 17:20:38 +01004587
4588static PyObject*
4589test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4590{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004591 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004592 if (name == NULL) {
4593 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4594 return NULL;
4595 }
4596 return PyUnicode_FromString(name);
4597}
4598
4599
Victor Stinnerad524372016-03-16 12:12:53 +01004600static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004601test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004602{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004603 if (!_PyObject_IsFreed(op)) {
4604 return raiseTestError(test_name, "object is not seen as freed");
4605 }
4606 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004607}
4608
4609
4610static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004611check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4612{
4613 PyObject *op = NULL;
4614 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4615}
4616
4617
4618static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004619check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004620{
4621 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4622 if (op == NULL) {
4623 return NULL;
4624 }
4625 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004626 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004627 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004628 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004629}
4630
4631
4632static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004633check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004634{
4635 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4636 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4637 if (op == NULL) {
4638 return NULL;
4639 }
4640 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004641 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004642 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004643 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004644 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004645}
4646
4647
4648static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004649check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004650{
4651 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4652 if (op == NULL) {
4653 return NULL;
4654 }
4655 Py_TYPE(op)->tp_dealloc(op);
4656 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004657 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004658 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004659 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004660}
4661
4662
4663static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004664pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4665{
4666 char *buffer;
4667
Victor Stinnerad524372016-03-16 12:12:53 +01004668 /* Deliberate bug to test debug hooks on Python memory allocators:
4669 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004670 Py_BEGIN_ALLOW_THREADS
4671 buffer = PyObject_Malloc(10);
4672 Py_END_ALLOW_THREADS
4673
4674 PyObject_Free(buffer);
4675
4676 Py_RETURN_NONE;
4677}
4678
Victor Stinner10b73e12016-03-22 13:39:05 +01004679static PyObject *
4680tracemalloc_track(PyObject *self, PyObject *args)
4681{
4682 unsigned int domain;
4683 PyObject *ptr_obj;
4684 void *ptr;
4685 Py_ssize_t size;
4686 int release_gil = 0;
4687 int res;
4688
4689 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4690 return NULL;
4691 ptr = PyLong_AsVoidPtr(ptr_obj);
4692 if (PyErr_Occurred())
4693 return NULL;
4694
4695 if (release_gil) {
4696 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004697 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004698 Py_END_ALLOW_THREADS
4699 }
4700 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004701 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004702 }
4703
4704 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004705 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004706 return NULL;
4707 }
4708
4709 Py_RETURN_NONE;
4710}
4711
4712static PyObject *
4713tracemalloc_untrack(PyObject *self, PyObject *args)
4714{
4715 unsigned int domain;
4716 PyObject *ptr_obj;
4717 void *ptr;
4718 int res;
4719
4720 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4721 return NULL;
4722 ptr = PyLong_AsVoidPtr(ptr_obj);
4723 if (PyErr_Occurred())
4724 return NULL;
4725
Victor Stinner5ea4c062017-06-20 17:46:36 +02004726 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004727 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004728 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004729 return NULL;
4730 }
4731
4732 Py_RETURN_NONE;
4733}
4734
4735static PyObject *
4736tracemalloc_get_traceback(PyObject *self, PyObject *args)
4737{
4738 unsigned int domain;
4739 PyObject *ptr_obj;
4740 void *ptr;
4741
4742 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4743 return NULL;
4744 ptr = PyLong_AsVoidPtr(ptr_obj);
4745 if (PyErr_Occurred())
4746 return NULL;
4747
Benjamin Petersonca470632016-09-06 13:47:26 -07004748 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004749}
4750
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004751static PyObject *
4752dict_get_version(PyObject *self, PyObject *args)
4753{
4754 PyDictObject *dict;
4755 uint64_t version;
4756
4757 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4758 return NULL;
4759
4760 version = dict->ma_version_tag;
4761
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004762 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4763 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004764}
4765
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004766
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004767static PyObject *
4768raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4769{
4770 PyGenObject *gen;
4771
4772 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4773 return NULL;
4774
4775 /* This is used in a test to check what happens if a signal arrives just
4776 as we're in the process of entering a yield from chain (see
4777 bpo-30039).
4778
4779 Needs to be done in C, because:
4780 - we don't have a Python wrapper for raise()
4781 - we need to make sure that the Python-level signal handler doesn't run
4782 *before* we enter the generator frame, which is impossible in Python
4783 because we check for signals before every bytecode operation.
4784 */
4785 raise(SIGINT);
4786 return _PyGen_Send(gen, Py_None);
4787}
4788
4789
Victor Stinner3b5cf852017-06-09 16:48:45 +02004790static int
4791fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4792{
4793 if (args == Py_None) {
4794 *stack = NULL;
4795 *nargs = 0;
4796 }
4797 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004798 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004799 *nargs = PyTuple_GET_SIZE(args);
4800 }
4801 else {
4802 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4803 return -1;
4804 }
4805 return 0;
4806}
4807
4808
4809static PyObject *
4810test_pyobject_fastcall(PyObject *self, PyObject *args)
4811{
4812 PyObject *func, *func_args;
4813 PyObject **stack;
4814 Py_ssize_t nargs;
4815
4816 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4817 return NULL;
4818 }
4819
4820 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4821 return NULL;
4822 }
4823 return _PyObject_FastCall(func, stack, nargs);
4824}
4825
4826
4827static PyObject *
4828test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4829{
4830 PyObject *func, *func_args, *kwargs;
4831 PyObject **stack;
4832 Py_ssize_t nargs;
4833
4834 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4835 return NULL;
4836 }
4837
4838 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4839 return NULL;
4840 }
4841
4842 if (kwargs == Py_None) {
4843 kwargs = NULL;
4844 }
4845 else if (!PyDict_Check(kwargs)) {
4846 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4847 return NULL;
4848 }
4849
Petr Viktorinffd97532020-02-11 17:46:57 +01004850 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004851}
4852
4853
4854static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004855test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004856{
4857 PyObject *func, *func_args, *kwnames = NULL;
4858 PyObject **stack;
4859 Py_ssize_t nargs, nkw;
4860
4861 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4862 return NULL;
4863 }
4864
4865 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4866 return NULL;
4867 }
4868
4869 if (kwnames == Py_None) {
4870 kwnames = NULL;
4871 }
4872 else if (PyTuple_Check(kwnames)) {
4873 nkw = PyTuple_GET_SIZE(kwnames);
4874 if (nargs < nkw) {
4875 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4876 return NULL;
4877 }
4878 nargs -= nkw;
4879 }
4880 else {
4881 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4882 return NULL;
4883 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004884 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004885}
4886
4887
4888static PyObject *
4889test_pyvectorcall_call(PyObject *self, PyObject *args)
4890{
4891 PyObject *func;
4892 PyObject *argstuple;
4893 PyObject *kwargs = NULL;
4894
4895 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4896 return NULL;
4897 }
4898
4899 if (!PyTuple_Check(argstuple)) {
4900 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4901 return NULL;
4902 }
4903 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4904 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4905 return NULL;
4906 }
4907
4908 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004909}
4910
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004911
Victor Stinner64fa4492017-07-10 14:37:49 +02004912static PyObject*
4913stack_pointer(PyObject *self, PyObject *args)
4914{
4915 int v = 5;
4916 return PyLong_FromVoidPtr(&v);
4917}
4918
Victor Stinner3b5cf852017-06-09 16:48:45 +02004919
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004920#ifdef W_STOPCODE
4921static PyObject*
4922py_w_stopcode(PyObject *self, PyObject *args)
4923{
4924 int sig, status;
4925 if (!PyArg_ParseTuple(args, "i", &sig)) {
4926 return NULL;
4927 }
4928 status = W_STOPCODE(sig);
4929 return PyLong_FromLong(status);
4930}
4931#endif
4932
4933
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004934static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004935get_mapping_keys(PyObject* self, PyObject *obj)
4936{
4937 return PyMapping_Keys(obj);
4938}
4939
4940static PyObject *
4941get_mapping_values(PyObject* self, PyObject *obj)
4942{
4943 return PyMapping_Values(obj);
4944}
4945
4946static PyObject *
4947get_mapping_items(PyObject* self, PyObject *obj)
4948{
4949 return PyMapping_Items(obj);
4950}
4951
4952
4953static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004954test_pythread_tss_key_state(PyObject *self, PyObject *args)
4955{
4956 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4957 if (PyThread_tss_is_created(&tss_key)) {
4958 return raiseTestError("test_pythread_tss_key_state",
4959 "TSS key not in an uninitialized state at "
4960 "creation time");
4961 }
4962 if (PyThread_tss_create(&tss_key) != 0) {
4963 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4964 return NULL;
4965 }
4966 if (!PyThread_tss_is_created(&tss_key)) {
4967 return raiseTestError("test_pythread_tss_key_state",
4968 "PyThread_tss_create succeeded, "
4969 "but with TSS key in an uninitialized state");
4970 }
4971 if (PyThread_tss_create(&tss_key) != 0) {
4972 return raiseTestError("test_pythread_tss_key_state",
4973 "PyThread_tss_create unsuccessful with "
4974 "an already initialized key");
4975 }
4976#define CHECK_TSS_API(expr) \
4977 (void)(expr); \
4978 if (!PyThread_tss_is_created(&tss_key)) { \
4979 return raiseTestError("test_pythread_tss_key_state", \
4980 "TSS key initialization state was not " \
4981 "preserved after calling " #expr); }
4982 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4983 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4984#undef CHECK_TSS_API
4985 PyThread_tss_delete(&tss_key);
4986 if (PyThread_tss_is_created(&tss_key)) {
4987 return raiseTestError("test_pythread_tss_key_state",
4988 "PyThread_tss_delete called, but did not "
4989 "set the key state to uninitialized");
4990 }
4991
4992 Py_tss_t *ptr_key = PyThread_tss_alloc();
4993 if (ptr_key == NULL) {
4994 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4995 return NULL;
4996 }
4997 if (PyThread_tss_is_created(ptr_key)) {
4998 return raiseTestError("test_pythread_tss_key_state",
4999 "TSS key not in an uninitialized state at "
5000 "allocation time");
5001 }
5002 PyThread_tss_free(ptr_key);
5003 ptr_key = NULL;
5004 Py_RETURN_NONE;
5005}
5006
5007
Yury Selivanovf23746a2018-01-22 19:11:18 -05005008static PyObject*
5009new_hamt(PyObject *self, PyObject *args)
5010{
5011 return _PyContext_NewHamtForTests();
5012}
5013
5014
jdemeyer5a306202018-10-19 23:50:06 +02005015/* def bad_get(self, obj, cls):
5016 cls()
5017 return repr(self)
5018*/
5019static PyObject*
5020bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5021{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005022 PyObject *self, *obj, *cls;
5023 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005024 return NULL;
5025 }
5026
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005027 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005028 if (res == NULL) {
5029 return NULL;
5030 }
5031 Py_DECREF(res);
5032
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005033 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005034}
5035
5036
Victor Stinner3d4226a2018-08-29 22:21:32 +02005037static PyObject *
5038encode_locale_ex(PyObject *self, PyObject *args)
5039{
5040 PyObject *unicode;
5041 int current_locale = 0;
5042 wchar_t *wstr;
5043 PyObject *res = NULL;
5044 const char *errors = NULL;
5045
5046 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5047 return NULL;
5048 }
5049 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5050 if (wstr == NULL) {
5051 return NULL;
5052 }
5053 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5054
5055 char *str = NULL;
5056 size_t error_pos;
5057 const char *reason = NULL;
5058 int ret = _Py_EncodeLocaleEx(wstr,
5059 &str, &error_pos, &reason,
5060 current_locale, error_handler);
5061 PyMem_Free(wstr);
5062
5063 switch(ret) {
5064 case 0:
5065 res = PyBytes_FromString(str);
5066 PyMem_RawFree(str);
5067 break;
5068 case -1:
5069 PyErr_NoMemory();
5070 break;
5071 case -2:
5072 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5073 error_pos, reason);
5074 break;
5075 case -3:
5076 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5077 break;
5078 default:
5079 PyErr_SetString(PyExc_ValueError, "unknow error code");
5080 break;
5081 }
5082 return res;
5083}
5084
5085
5086static PyObject *
5087decode_locale_ex(PyObject *self, PyObject *args)
5088{
5089 char *str;
5090 int current_locale = 0;
5091 PyObject *res = NULL;
5092 const char *errors = NULL;
5093
5094 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5095 return NULL;
5096 }
5097 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5098
5099 wchar_t *wstr = NULL;
5100 size_t wlen = 0;
5101 const char *reason = NULL;
5102 int ret = _Py_DecodeLocaleEx(str,
5103 &wstr, &wlen, &reason,
5104 current_locale, error_handler);
5105
5106 switch(ret) {
5107 case 0:
5108 res = PyUnicode_FromWideChar(wstr, wlen);
5109 PyMem_RawFree(wstr);
5110 break;
5111 case -1:
5112 PyErr_NoMemory();
5113 break;
5114 case -2:
5115 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5116 wlen, reason);
5117 break;
5118 case -3:
5119 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5120 break;
5121 default:
5122 PyErr_SetString(PyExc_ValueError, "unknow error code");
5123 break;
5124 }
5125 return res;
5126}
5127
5128
Victor Stinner18618e652018-10-25 17:28:11 +02005129#ifdef Py_REF_DEBUG
5130static PyObject *
5131negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5132{
5133 PyObject *obj = PyUnicode_FromString("negative_refcount");
5134 if (obj == NULL) {
5135 return NULL;
5136 }
5137 assert(Py_REFCNT(obj) == 1);
5138
Victor Stinnerc86a1122020-02-07 01:24:29 +01005139 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005140 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5141 Py_DECREF(obj);
5142
5143 Py_RETURN_NONE;
5144}
5145#endif
5146
5147
Victor Stinneref9d9b62019-05-22 11:28:22 +02005148static PyObject*
5149test_write_unraisable_exc(PyObject *self, PyObject *args)
5150{
Victor Stinner71c52e32019-05-27 08:57:14 +02005151 PyObject *exc, *err_msg, *obj;
5152 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005153 return NULL;
5154 }
5155
Victor Stinner71c52e32019-05-27 08:57:14 +02005156 const char *err_msg_utf8;
5157 if (err_msg != Py_None) {
5158 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5159 if (err_msg_utf8 == NULL) {
5160 return NULL;
5161 }
5162 }
5163 else {
5164 err_msg_utf8 = NULL;
5165 }
5166
Victor Stinneref9d9b62019-05-22 11:28:22 +02005167 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005168 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005169 Py_RETURN_NONE;
5170}
5171
5172
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005173static PyObject *
5174sequence_getitem(PyObject *self, PyObject *args)
5175{
5176 PyObject *seq;
5177 Py_ssize_t i;
5178 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5179 return NULL;
5180 }
5181 return PySequence_GetItem(seq, i);
5182}
5183
5184
Petr Viktorinf9583772019-09-10 12:21:09 +01005185/* Functions for testing C calling conventions (METH_*) are named meth_*,
5186 * e.g. "meth_varargs" for METH_VARARGS.
5187 *
5188 * They all return a tuple of their C-level arguments, with None instead
5189 * of NULL and Python tuples instead of C arrays.
5190 */
5191
5192
5193static PyObject*
5194_null_to_none(PyObject* obj)
5195{
5196 if (obj == NULL) {
5197 Py_RETURN_NONE;
5198 }
5199 Py_INCREF(obj);
5200 return obj;
5201}
5202
5203static PyObject*
5204meth_varargs(PyObject* self, PyObject* args)
5205{
5206 return Py_BuildValue("NO", _null_to_none(self), args);
5207}
5208
5209static PyObject*
5210meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5211{
5212 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5213}
5214
5215static PyObject*
5216meth_o(PyObject* self, PyObject* obj)
5217{
5218 return Py_BuildValue("NO", _null_to_none(self), obj);
5219}
5220
5221static PyObject*
5222meth_noargs(PyObject* self, PyObject* ignored)
5223{
5224 return _null_to_none(self);
5225}
5226
5227static PyObject*
5228_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5229{
5230 PyObject *tuple = PyTuple_New(nargs);
5231 if (tuple == NULL) {
5232 return NULL;
5233 }
5234 for (Py_ssize_t i=0; i < nargs; i++) {
5235 Py_INCREF(args[i]);
5236 PyTuple_SET_ITEM(tuple, i, args[i]);
5237 }
5238 return tuple;
5239}
5240
5241static PyObject*
5242meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5243{
5244 return Py_BuildValue(
5245 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5246 );
5247}
5248
5249static PyObject*
5250meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5251 Py_ssize_t nargs, PyObject* kwargs)
5252{
5253 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5254 if (pyargs == NULL) {
5255 return NULL;
5256 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005257 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005258 args + nargs, 0, kwargs);
5259 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5260}
5261
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005262
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005263static PyObject*
5264pynumber_tobase(PyObject *module, PyObject *args)
5265{
5266 PyObject *obj;
5267 int base;
5268 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5269 &obj, &base)) {
5270 return NULL;
5271 }
5272 return PyNumber_ToBase(obj, base);
5273}
5274
5275
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005276static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5277
Tim Peters9ea17ac2001-02-02 05:57:15 +00005278static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305280 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005281 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305282 {"test_config", test_config, METH_NOARGS},
5283 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005284 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005285 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5286 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5287 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5288 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5289 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5290 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005291 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005292 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005293 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5294 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5295 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5296 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5297 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5298 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005299 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5300 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005301 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5302 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5303 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5304 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305305 {"test_list_api", test_list_api, METH_NOARGS},
5306 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005307 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005308 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305309 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5310 {"test_long_api", test_long_api, METH_NOARGS},
5311 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5312 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5313 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5314 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005315 {"test_structseq_newtype_doesnt_leak",
5316 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305317 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5318 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5319 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5320 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005321 {"test_long_as_unsigned_long_long_mask",
5322 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305323 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5324 {"test_k_code", test_k_code, METH_NOARGS},
5325 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005326 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305327 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305329 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305331 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5332 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5333 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005335 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005336#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005337 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005338#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005339 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005340 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005341 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005342 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005343 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005344 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005346 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005348 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005349 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005350 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005351 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005352 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 {"getargs_b", getargs_b, METH_VARARGS},
5354 {"getargs_B", getargs_B, METH_VARARGS},
5355 {"getargs_h", getargs_h, METH_VARARGS},
5356 {"getargs_H", getargs_H, METH_VARARGS},
5357 {"getargs_I", getargs_I, METH_VARARGS},
5358 {"getargs_k", getargs_k, METH_VARARGS},
5359 {"getargs_i", getargs_i, METH_VARARGS},
5360 {"getargs_l", getargs_l, METH_VARARGS},
5361 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005362 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 {"getargs_L", getargs_L, METH_VARARGS},
5364 {"getargs_K", getargs_K, METH_VARARGS},
5365 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305366 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5367 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005368 {"getargs_f", getargs_f, METH_VARARGS},
5369 {"getargs_d", getargs_d, METH_VARARGS},
5370 {"getargs_D", getargs_D, METH_VARARGS},
5371 {"getargs_S", getargs_S, METH_VARARGS},
5372 {"getargs_Y", getargs_Y, METH_VARARGS},
5373 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005374 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005375 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005376 {"getargs_s", getargs_s, METH_VARARGS},
5377 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5378 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5379 {"getargs_z", getargs_z, METH_VARARGS},
5380 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5381 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5382 {"getargs_y", getargs_y, METH_VARARGS},
5383 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5384 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5385 {"getargs_u", getargs_u, METH_VARARGS},
5386 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5387 {"getargs_Z", getargs_Z, METH_VARARGS},
5388 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005389 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005390 {"getargs_es", getargs_es, METH_VARARGS},
5391 {"getargs_et", getargs_et, METH_VARARGS},
5392 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5393 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005395 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005397 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305398 {"test_s_code", test_s_code, METH_NOARGS},
5399 {"test_u_code", test_u_code, METH_NOARGS},
5400 {"test_Z_code", test_Z_code, METH_NOARGS},
5401 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005402 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5403 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005404 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005405 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5406 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005407 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005408 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005409 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5410 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005411 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005412 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005414#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005415 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005416#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005417 {"traceback_print", traceback_print, METH_VARARGS},
5418 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005419 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005420 {"argparsing", argparsing, METH_VARARGS},
5421 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005422 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305424 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005425 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305426 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005427 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005428 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5429 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005430 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005431 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005432 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305433 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5434 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5435 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5436 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005437 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5438 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305439 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005440 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005441 {"no_docstring",
5442 (PyCFunction)test_with_docstring, METH_NOARGS},
5443 {"docstring_empty",
5444 (PyCFunction)test_with_docstring, METH_NOARGS,
5445 docstring_empty},
5446 {"docstring_no_signature",
5447 (PyCFunction)test_with_docstring, METH_NOARGS,
5448 docstring_no_signature},
5449 {"docstring_with_invalid_signature",
5450 (PyCFunction)test_with_docstring, METH_NOARGS,
5451 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005452 {"docstring_with_invalid_signature2",
5453 (PyCFunction)test_with_docstring, METH_NOARGS,
5454 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005455 {"docstring_with_signature",
5456 (PyCFunction)test_with_docstring, METH_NOARGS,
5457 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005458 {"docstring_with_signature_but_no_doc",
5459 (PyCFunction)test_with_docstring, METH_NOARGS,
5460 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005461 {"docstring_with_signature_and_extra_newlines",
5462 (PyCFunction)test_with_docstring, METH_NOARGS,
5463 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005464 {"docstring_with_signature_with_defaults",
5465 (PyCFunction)test_with_docstring, METH_NOARGS,
5466 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005467 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5468 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005469 {"pymarshal_write_long_to_file",
5470 pymarshal_write_long_to_file, METH_VARARGS},
5471 {"pymarshal_write_object_to_file",
5472 pymarshal_write_object_to_file, METH_VARARGS},
5473 {"pymarshal_read_short_from_file",
5474 pymarshal_read_short_from_file, METH_VARARGS},
5475 {"pymarshal_read_long_from_file",
5476 pymarshal_read_long_from_file, METH_VARARGS},
5477 {"pymarshal_read_last_object_from_file",
5478 pymarshal_read_last_object_from_file, METH_VARARGS},
5479 {"pymarshal_read_object_from_file",
5480 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005481 {"return_null_without_error",
5482 return_null_without_error, METH_NOARGS},
5483 {"return_result_with_error",
5484 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005485 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005486 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5487 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005488 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005489#ifdef HAVE_CLOCK_GETTIME
5490 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5491#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005492 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5493 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01005494 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5495 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005496 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005497 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005498 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005499 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5500 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5501 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005502 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005503 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5504 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5505 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005506 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005507 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005508 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5509 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005510 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5511 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005512 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005513#ifdef W_STOPCODE
5514 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5515#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005516 {"get_mapping_keys", get_mapping_keys, METH_O},
5517 {"get_mapping_values", get_mapping_values, METH_O},
5518 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005519 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005520 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005521 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005522 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5523 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005524#ifdef Py_REF_DEBUG
5525 {"negative_refcount", negative_refcount, METH_NOARGS},
5526#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005527 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005528 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005529 {"meth_varargs", meth_varargs, METH_VARARGS},
5530 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5531 {"meth_o", meth_o, METH_O},
5532 {"meth_noargs", meth_noargs, METH_NOARGS},
5533 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5534 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005535 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005537};
5538
Thomas Hellera4ea6032003-04-17 18:55:45 +00005539#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5540
Thomas Wouters89f507f2006-12-13 04:49:30 +00005541typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 char bool_member;
5543 char byte_member;
5544 unsigned char ubyte_member;
5545 short short_member;
5546 unsigned short ushort_member;
5547 int int_member;
5548 unsigned int uint_member;
5549 long long_member;
5550 unsigned long ulong_member;
5551 Py_ssize_t pyssizet_member;
5552 float float_member;
5553 double double_member;
5554 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005555 long long longlong_member;
5556 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005557} all_structmembers;
5558
5559typedef struct {
5560 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005561 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005562} test_structmembers;
5563
5564static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5566 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5567 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5568 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5569 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5570 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5571 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5572 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5573 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5574 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5575 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5576 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5577 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5579 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005581};
5582
5583
Christian Heimes1af737c2008-01-23 08:24:23 +00005584static PyObject *
5585test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 static char *keywords[] = {
5588 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5589 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5590 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005593 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 test_structmembers *ob;
5595 const char *s = NULL;
5596 Py_ssize_t string_len = 0;
5597 ob = PyObject_New(test_structmembers, type);
5598 if (ob == NULL)
5599 return NULL;
5600 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5601 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5602 &ob->structmembers.bool_member,
5603 &ob->structmembers.byte_member,
5604 &ob->structmembers.ubyte_member,
5605 &ob->structmembers.short_member,
5606 &ob->structmembers.ushort_member,
5607 &ob->structmembers.int_member,
5608 &ob->structmembers.uint_member,
5609 &ob->structmembers.long_member,
5610 &ob->structmembers.ulong_member,
5611 &ob->structmembers.pyssizet_member,
5612 &ob->structmembers.float_member,
5613 &ob->structmembers.double_member,
5614 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 , &ob->structmembers.longlong_member,
5616 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 )) {
5618 Py_DECREF(ob);
5619 return NULL;
5620 }
5621 if (s != NULL) {
5622 if (string_len > 5) {
5623 Py_DECREF(ob);
5624 PyErr_SetString(PyExc_ValueError, "string too long");
5625 return NULL;
5626 }
5627 strcpy(ob->structmembers.inplace_member, s);
5628 }
5629 else {
5630 strcpy(ob->structmembers.inplace_member, "");
5631 }
5632 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005633}
5634
Christian Heimes1af737c2008-01-23 08:24:23 +00005635static void
5636test_structmembers_free(PyObject *ob)
5637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005639}
5640
5641static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005642 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 "test_structmembersType",
5644 sizeof(test_structmembers), /* tp_basicsize */
5645 0, /* tp_itemsize */
5646 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005647 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 0, /* tp_getattr */
5649 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005650 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 0, /* tp_repr */
5652 0, /* tp_as_number */
5653 0, /* tp_as_sequence */
5654 0, /* tp_as_mapping */
5655 0, /* tp_hash */
5656 0, /* tp_call */
5657 0, /* tp_str */
5658 PyObject_GenericGetAttr, /* tp_getattro */
5659 PyObject_GenericSetAttr, /* tp_setattro */
5660 0, /* tp_as_buffer */
5661 0, /* tp_flags */
5662 "Type containing all structmember types",
5663 0, /* traverseproc tp_traverse */
5664 0, /* tp_clear */
5665 0, /* tp_richcompare */
5666 0, /* tp_weaklistoffset */
5667 0, /* tp_iter */
5668 0, /* tp_iternext */
5669 0, /* tp_methods */
5670 test_members, /* tp_members */
5671 0,
5672 0,
5673 0,
5674 0,
5675 0,
5676 0,
5677 0,
5678 0,
5679 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005680};
5681
5682
Benjamin Petersond51374e2014-04-09 23:55:56 -04005683typedef struct {
5684 PyObject_HEAD
5685} matmulObject;
5686
5687static PyObject *
5688matmulType_matmul(PyObject *self, PyObject *other)
5689{
5690 return Py_BuildValue("(sOO)", "matmul", self, other);
5691}
5692
5693static PyObject *
5694matmulType_imatmul(PyObject *self, PyObject *other)
5695{
5696 return Py_BuildValue("(sOO)", "imatmul", self, other);
5697}
5698
5699static void
5700matmulType_dealloc(PyObject *self)
5701{
Zachary Ware420dc562014-04-23 13:51:27 -05005702 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005703}
5704
5705static PyNumberMethods matmulType_as_number = {
5706 0, /* nb_add */
5707 0, /* nb_subtract */
5708 0, /* nb_multiply */
5709 0, /* nb_remainde r*/
5710 0, /* nb_divmod */
5711 0, /* nb_power */
5712 0, /* nb_negative */
5713 0, /* tp_positive */
5714 0, /* tp_absolute */
5715 0, /* tp_bool */
5716 0, /* nb_invert */
5717 0, /* nb_lshift */
5718 0, /* nb_rshift */
5719 0, /* nb_and */
5720 0, /* nb_xor */
5721 0, /* nb_or */
5722 0, /* nb_int */
5723 0, /* nb_reserved */
5724 0, /* nb_float */
5725 0, /* nb_inplace_add */
5726 0, /* nb_inplace_subtract */
5727 0, /* nb_inplace_multiply */
5728 0, /* nb_inplace_remainder */
5729 0, /* nb_inplace_power */
5730 0, /* nb_inplace_lshift */
5731 0, /* nb_inplace_rshift */
5732 0, /* nb_inplace_and */
5733 0, /* nb_inplace_xor */
5734 0, /* nb_inplace_or */
5735 0, /* nb_floor_divide */
5736 0, /* nb_true_divide */
5737 0, /* nb_inplace_floor_divide */
5738 0, /* nb_inplace_true_divide */
5739 0, /* nb_index */
5740 matmulType_matmul, /* nb_matrix_multiply */
5741 matmulType_imatmul /* nb_matrix_inplace_multiply */
5742};
5743
5744static PyTypeObject matmulType = {
5745 PyVarObject_HEAD_INIT(NULL, 0)
5746 "matmulType",
5747 sizeof(matmulObject), /* tp_basicsize */
5748 0, /* tp_itemsize */
5749 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005750 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005751 0, /* tp_getattr */
5752 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005753 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005754 0, /* tp_repr */
5755 &matmulType_as_number, /* tp_as_number */
5756 0, /* tp_as_sequence */
5757 0, /* tp_as_mapping */
5758 0, /* tp_hash */
5759 0, /* tp_call */
5760 0, /* tp_str */
5761 PyObject_GenericGetAttr, /* tp_getattro */
5762 PyObject_GenericSetAttr, /* tp_setattro */
5763 0, /* tp_as_buffer */
5764 0, /* tp_flags */
5765 "C level type with matrix operations defined",
5766 0, /* traverseproc tp_traverse */
5767 0, /* tp_clear */
5768 0, /* tp_richcompare */
5769 0, /* tp_weaklistoffset */
5770 0, /* tp_iter */
5771 0, /* tp_iternext */
5772 0, /* tp_methods */
5773 0, /* tp_members */
5774 0,
5775 0,
5776 0,
5777 0,
5778 0,
5779 0,
5780 0,
5781 0,
5782 PyType_GenericNew, /* tp_new */
5783 PyObject_Del, /* tp_free */
5784};
5785
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005786typedef struct {
5787 PyObject_HEAD
5788} ipowObject;
5789
5790static PyObject *
5791ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5792{
5793 return Py_BuildValue("OO", other, mod);
5794}
5795
5796static PyNumberMethods ipowType_as_number = {
5797 .nb_inplace_power = ipowType_ipow
5798};
5799
5800static PyTypeObject ipowType = {
5801 PyVarObject_HEAD_INIT(NULL, 0)
5802 .tp_name = "ipowType",
5803 .tp_basicsize = sizeof(ipowObject),
5804 .tp_as_number = &ipowType_as_number,
5805 .tp_new = PyType_GenericNew
5806};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005807
Yury Selivanov75445082015-05-11 22:57:16 -04005808typedef struct {
5809 PyObject_HEAD
5810 PyObject *ao_iterator;
5811} awaitObject;
5812
5813
5814static PyObject *
5815awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5816{
5817 PyObject *v;
5818 awaitObject *ao;
5819
5820 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5821 return NULL;
5822
5823 ao = (awaitObject *)type->tp_alloc(type, 0);
5824 if (ao == NULL) {
5825 return NULL;
5826 }
5827
5828 Py_INCREF(v);
5829 ao->ao_iterator = v;
5830
5831 return (PyObject *)ao;
5832}
5833
5834
5835static void
5836awaitObject_dealloc(awaitObject *ao)
5837{
5838 Py_CLEAR(ao->ao_iterator);
5839 Py_TYPE(ao)->tp_free(ao);
5840}
5841
5842
5843static PyObject *
5844awaitObject_await(awaitObject *ao)
5845{
5846 Py_INCREF(ao->ao_iterator);
5847 return ao->ao_iterator;
5848}
5849
5850static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005851 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005852 0, /* am_aiter */
5853 0 /* am_anext */
5854};
5855
5856
5857static PyTypeObject awaitType = {
5858 PyVarObject_HEAD_INIT(NULL, 0)
5859 "awaitType",
5860 sizeof(awaitObject), /* tp_basicsize */
5861 0, /* tp_itemsize */
5862 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005863 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005864 0, /* tp_getattr */
5865 0, /* tp_setattr */
5866 &awaitType_as_async, /* tp_as_async */
5867 0, /* tp_repr */
5868 0, /* tp_as_number */
5869 0, /* tp_as_sequence */
5870 0, /* tp_as_mapping */
5871 0, /* tp_hash */
5872 0, /* tp_call */
5873 0, /* tp_str */
5874 PyObject_GenericGetAttr, /* tp_getattro */
5875 PyObject_GenericSetAttr, /* tp_setattro */
5876 0, /* tp_as_buffer */
5877 0, /* tp_flags */
5878 "C level type with tp_as_async",
5879 0, /* traverseproc tp_traverse */
5880 0, /* tp_clear */
5881 0, /* tp_richcompare */
5882 0, /* tp_weaklistoffset */
5883 0, /* tp_iter */
5884 0, /* tp_iternext */
5885 0, /* tp_methods */
5886 0, /* tp_members */
5887 0,
5888 0,
5889 0,
5890 0,
5891 0,
5892 0,
5893 0,
5894 0,
5895 awaitObject_new, /* tp_new */
5896 PyObject_Del, /* tp_free */
5897};
5898
5899
xdegaye56d1f5c2017-10-26 15:09:06 +02005900static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5901
5902static PyTypeObject PyRecursingInfinitelyError_Type = {
5903 PyVarObject_HEAD_INIT(NULL, 0)
5904 "RecursingInfinitelyError", /* tp_name */
5905 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5906 0, /* tp_itemsize */
5907 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005908 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005909 0, /* tp_getattr */
5910 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005911 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005912 0, /* tp_repr */
5913 0, /* tp_as_number */
5914 0, /* tp_as_sequence */
5915 0, /* tp_as_mapping */
5916 0, /* tp_hash */
5917 0, /* tp_call */
5918 0, /* tp_str */
5919 0, /* tp_getattro */
5920 0, /* tp_setattro */
5921 0, /* tp_as_buffer */
5922 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5923 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5924 0, /* tp_traverse */
5925 0, /* tp_clear */
5926 0, /* tp_richcompare */
5927 0, /* tp_weaklistoffset */
5928 0, /* tp_iter */
5929 0, /* tp_iternext */
5930 0, /* tp_methods */
5931 0, /* tp_members */
5932 0, /* tp_getset */
5933 0, /* tp_base */
5934 0, /* tp_dict */
5935 0, /* tp_descr_get */
5936 0, /* tp_descr_set */
5937 0, /* tp_dictoffset */
5938 (initproc)recurse_infinitely_error_init, /* tp_init */
5939 0, /* tp_alloc */
5940 0, /* tp_new */
5941};
5942
5943static int
5944recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5945{
5946 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5947
5948 /* Instantiating this exception starts infinite recursion. */
5949 Py_INCREF(type);
5950 PyErr_SetObject(type, NULL);
5951 return -1;
5952}
5953
5954
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005955/* Test bpo-35983: create a subclass of "list" which checks that instances
5956 * are not deallocated twice */
5957
5958typedef struct {
5959 PyListObject list;
5960 int deallocated;
5961} MyListObject;
5962
5963static PyObject *
5964MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5965{
5966 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5967 ((MyListObject*)op)->deallocated = 0;
5968 return op;
5969}
5970
5971void
5972MyList_dealloc(MyListObject* op)
5973{
5974 if (op->deallocated) {
5975 /* We cannot raise exceptions here but we still want the testsuite
5976 * to fail when we hit this */
5977 Py_FatalError("MyList instance deallocated twice");
5978 }
5979 op->deallocated = 1;
5980 PyList_Type.tp_dealloc((PyObject *)op);
5981}
5982
5983static PyTypeObject MyList_Type = {
5984 PyVarObject_HEAD_INIT(NULL, 0)
5985 "MyList",
5986 sizeof(MyListObject),
5987 0,
5988 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005989 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005990 0, /* tp_getattr */
5991 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005992 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005993 0, /* tp_repr */
5994 0, /* tp_as_number */
5995 0, /* tp_as_sequence */
5996 0, /* tp_as_mapping */
5997 0, /* tp_hash */
5998 0, /* tp_call */
5999 0, /* tp_str */
6000 0, /* tp_getattro */
6001 0, /* tp_setattro */
6002 0, /* tp_as_buffer */
6003 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6004 0, /* tp_doc */
6005 0, /* tp_traverse */
6006 0, /* tp_clear */
6007 0, /* tp_richcompare */
6008 0, /* tp_weaklistoffset */
6009 0, /* tp_iter */
6010 0, /* tp_iternext */
6011 0, /* tp_methods */
6012 0, /* tp_members */
6013 0, /* tp_getset */
6014 0, /* &PyList_Type */ /* tp_base */
6015 0, /* tp_dict */
6016 0, /* tp_descr_get */
6017 0, /* tp_descr_set */
6018 0, /* tp_dictoffset */
6019 0, /* tp_init */
6020 0, /* tp_alloc */
6021 MyList_new, /* tp_new */
6022};
6023
6024
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006025/* Test PEP 560 */
6026
6027typedef struct {
6028 PyObject_HEAD
6029 PyObject *item;
6030} PyGenericAliasObject;
6031
6032static void
6033generic_alias_dealloc(PyGenericAliasObject *self)
6034{
6035 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006036 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006037}
6038
6039static PyObject *
6040generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6041{
6042 return PyTuple_Pack(1, self->item);
6043}
6044
6045static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006046 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006047 {NULL} /* sentinel */
6048};
6049
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006050static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006051 PyVarObject_HEAD_INIT(NULL, 0)
6052 "GenericAlias",
6053 sizeof(PyGenericAliasObject),
6054 0,
6055 .tp_dealloc = (destructor)generic_alias_dealloc,
6056 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6057 .tp_methods = generic_alias_methods,
6058};
6059
6060static PyObject *
6061generic_alias_new(PyObject *item)
6062{
6063 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6064 if (o == NULL) {
6065 return NULL;
6066 }
6067 Py_INCREF(item);
6068 o->item = item;
6069 return (PyObject*) o;
6070}
6071
6072typedef struct {
6073 PyObject_HEAD
6074} PyGenericObject;
6075
6076static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006077generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006078{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006079 return generic_alias_new(item);
6080}
6081
6082static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006083 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006084 {NULL} /* sentinel */
6085};
6086
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006087static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006088 PyVarObject_HEAD_INIT(NULL, 0)
6089 "Generic",
6090 sizeof(PyGenericObject),
6091 0,
6092 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6093 .tp_methods = generic_methods,
6094};
6095
6096
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006097/* Test PEP 590 */
6098
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006099typedef struct {
6100 PyObject_HEAD
6101 vectorcallfunc vectorcall;
6102} MethodDescriptorObject;
6103
6104static PyObject *
6105MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6106 size_t nargsf, PyObject *kwnames)
6107{
6108 /* True if using the vectorcall function in MethodDescriptorObject
6109 * but False for MethodDescriptor2Object */
6110 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6111 return PyBool_FromLong(md->vectorcall != NULL);
6112}
6113
6114static PyObject *
6115MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6116{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006117 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006118 op->vectorcall = MethodDescriptor_vectorcall;
6119 return (PyObject *)op;
6120}
6121
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006122static PyObject *
6123func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6124{
6125 if (obj == Py_None || obj == NULL) {
6126 Py_INCREF(func);
6127 return func;
6128 }
6129 return PyMethod_New(func, obj);
6130}
6131
6132static PyObject *
6133nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6134{
6135 Py_INCREF(func);
6136 return func;
6137}
6138
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006139static PyObject *
6140call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6141{
6142 Py_INCREF(args);
6143 return args;
6144}
6145
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006146static PyTypeObject MethodDescriptorBase_Type = {
6147 PyVarObject_HEAD_INIT(NULL, 0)
6148 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006149 sizeof(MethodDescriptorObject),
6150 .tp_new = MethodDescriptor_new,
6151 .tp_call = PyVectorcall_Call,
6152 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6153 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006154 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006155 .tp_descr_get = func_descr_get,
6156};
6157
6158static PyTypeObject MethodDescriptorDerived_Type = {
6159 PyVarObject_HEAD_INIT(NULL, 0)
6160 "MethodDescriptorDerived",
6161 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6162};
6163
6164static PyTypeObject MethodDescriptorNopGet_Type = {
6165 PyVarObject_HEAD_INIT(NULL, 0)
6166 "MethodDescriptorNopGet",
6167 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006168 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006169 .tp_descr_get = nop_descr_get,
6170};
6171
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006172typedef struct {
6173 MethodDescriptorObject base;
6174 vectorcallfunc vectorcall;
6175} MethodDescriptor2Object;
6176
6177static PyObject *
6178MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6179{
6180 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6181 op->base.vectorcall = NULL;
6182 op->vectorcall = MethodDescriptor_vectorcall;
6183 return (PyObject *)op;
6184}
6185
6186static PyTypeObject MethodDescriptor2_Type = {
6187 PyVarObject_HEAD_INIT(NULL, 0)
6188 "MethodDescriptor2",
6189 sizeof(MethodDescriptor2Object),
6190 .tp_new = MethodDescriptor2_new,
6191 .tp_call = PyVectorcall_Call,
6192 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006193 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006194};
6195
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006196PyDoc_STRVAR(heapgctype__doc__,
6197"A heap type with GC, and with overridden dealloc.\n\n"
6198"The 'value' attribute is set to 10 in __init__.");
6199
6200typedef struct {
6201 PyObject_HEAD
6202 int value;
6203} HeapCTypeObject;
6204
6205static struct PyMemberDef heapctype_members[] = {
6206 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6207 {NULL} /* Sentinel */
6208};
6209
6210static int
6211heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6212{
6213 ((HeapCTypeObject *)self)->value = 10;
6214 return 0;
6215}
6216
6217static void
6218heapgcctype_dealloc(HeapCTypeObject *self)
6219{
6220 PyTypeObject *tp = Py_TYPE(self);
6221 PyObject_GC_UnTrack(self);
6222 PyObject_GC_Del(self);
6223 Py_DECREF(tp);
6224}
6225
6226static PyType_Slot HeapGcCType_slots[] = {
6227 {Py_tp_init, heapctype_init},
6228 {Py_tp_members, heapctype_members},
6229 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006230 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006231 {0, 0},
6232};
6233
6234static PyType_Spec HeapGcCType_spec = {
6235 "_testcapi.HeapGcCType",
6236 sizeof(HeapCTypeObject),
6237 0,
6238 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6239 HeapGcCType_slots
6240};
6241
6242PyDoc_STRVAR(heapctype__doc__,
6243"A heap type without GC, but with overridden dealloc.\n\n"
6244"The 'value' attribute is set to 10 in __init__.");
6245
6246static void
6247heapctype_dealloc(HeapCTypeObject *self)
6248{
6249 PyTypeObject *tp = Py_TYPE(self);
6250 PyObject_Del(self);
6251 Py_DECREF(tp);
6252}
6253
6254static PyType_Slot HeapCType_slots[] = {
6255 {Py_tp_init, heapctype_init},
6256 {Py_tp_members, heapctype_members},
6257 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006258 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006259 {0, 0},
6260};
6261
6262static PyType_Spec HeapCType_spec = {
6263 "_testcapi.HeapCType",
6264 sizeof(HeapCTypeObject),
6265 0,
6266 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6267 HeapCType_slots
6268};
6269
6270PyDoc_STRVAR(heapctypesubclass__doc__,
6271"Subclass of HeapCType, without GC.\n\n"
6272"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6273
6274typedef struct {
6275 HeapCTypeObject base;
6276 int value2;
6277} HeapCTypeSubclassObject;
6278
6279static int
6280heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6281{
6282 /* Call __init__ of the superclass */
6283 if (heapctype_init(self, args, kwargs) < 0) {
6284 return -1;
6285 }
6286 /* Initialize additional element */
6287 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6288 return 0;
6289}
6290
6291static struct PyMemberDef heapctypesubclass_members[] = {
6292 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6293 {NULL} /* Sentinel */
6294};
6295
6296static PyType_Slot HeapCTypeSubclass_slots[] = {
6297 {Py_tp_init, heapctypesubclass_init},
6298 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006299 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006300 {0, 0},
6301};
6302
6303static PyType_Spec HeapCTypeSubclass_spec = {
6304 "_testcapi.HeapCTypeSubclass",
6305 sizeof(HeapCTypeSubclassObject),
6306 0,
6307 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6308 HeapCTypeSubclass_slots
6309};
6310
scoderf7c4e232020-06-06 21:35:10 +02006311PyDoc_STRVAR(heapctypewithbuffer__doc__,
6312"Heap type with buffer support.\n\n"
6313"The buffer is set to [b'1', b'2', b'3', b'4']");
6314
6315typedef struct {
6316 HeapCTypeObject base;
6317 char buffer[4];
6318} HeapCTypeWithBufferObject;
6319
6320static int
6321heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6322{
6323 self->buffer[0] = '1';
6324 self->buffer[1] = '2';
6325 self->buffer[2] = '3';
6326 self->buffer[3] = '4';
6327 return PyBuffer_FillInfo(
6328 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6329}
6330
RĂ©mi Lapeyreb8867e52020-06-07 09:05:33 +02006331static void
scoderf7c4e232020-06-06 21:35:10 +02006332heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6333{
6334 assert(view->obj == (void*) self);
6335}
6336
6337static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6338 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6339 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6340 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6341 {0, 0},
6342};
6343
6344static PyType_Spec HeapCTypeWithBuffer_spec = {
6345 "_testcapi.HeapCTypeWithBuffer",
6346 sizeof(HeapCTypeWithBufferObject),
6347 0,
6348 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6349 HeapCTypeWithBuffer_slots
6350};
6351
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006352PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6353"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6354"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6355"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6356
6357static int
6358heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6359{
6360 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6361 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6362 base_init(self, args, kwargs);
6363 return 0;
6364}
6365
6366static void
6367heapctypesubclasswithfinalizer_finalize(PyObject *self)
6368{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006369 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006370 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006371
6372 /* Save the current exception, if any. */
6373 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6374
6375 m = PyState_FindModule(&_testcapimodule);
6376 if (m == NULL) {
6377 goto cleanup_finalize;
6378 }
6379 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6380 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6381 if (oldtype == NULL || newtype == NULL) {
6382 goto cleanup_finalize;
6383 }
6384
6385 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6386 goto cleanup_finalize;
6387 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006388 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6389 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006390 goto cleanup_finalize;
6391 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006392 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6393 goto cleanup_finalize;
6394 }
6395 Py_DECREF(refcnt);
6396 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6397 if (refcnt == NULL) {
6398 goto cleanup_finalize;
6399 }
6400 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006401 goto cleanup_finalize;
6402 }
6403
6404cleanup_finalize:
6405 Py_XDECREF(oldtype);
6406 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006407 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006408
6409 /* Restore the saved exception. */
6410 PyErr_Restore(error_type, error_value, error_traceback);
6411}
6412
6413static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6414 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6415 {Py_tp_members, heapctypesubclass_members},
6416 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006417 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006418 {0, 0},
6419};
6420
6421static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6422 "_testcapi.HeapCTypeSubclassWithFinalizer",
6423 sizeof(HeapCTypeSubclassObject),
6424 0,
6425 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6426 HeapCTypeSubclassWithFinalizer_slots
6427};
6428
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006429typedef struct {
6430 PyObject_HEAD
6431 PyObject *dict;
6432} HeapCTypeWithDictObject;
6433
6434static void
6435heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6436{
6437
6438 PyTypeObject *tp = Py_TYPE(self);
6439 Py_XDECREF(self->dict);
6440 PyObject_DEL(self);
6441 Py_DECREF(tp);
6442}
6443
6444static PyGetSetDef heapctypewithdict_getsetlist[] = {
6445 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6446 {NULL} /* Sentinel */
6447};
6448
6449static struct PyMemberDef heapctypewithdict_members[] = {
6450 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6451 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6452 {NULL} /* Sentinel */
6453};
6454
6455static PyType_Slot HeapCTypeWithDict_slots[] = {
6456 {Py_tp_members, heapctypewithdict_members},
6457 {Py_tp_getset, heapctypewithdict_getsetlist},
6458 {Py_tp_dealloc, heapctypewithdict_dealloc},
6459 {0, 0},
6460};
6461
6462static PyType_Spec HeapCTypeWithDict_spec = {
6463 "_testcapi.HeapCTypeWithDict",
6464 sizeof(HeapCTypeWithDictObject),
6465 0,
6466 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6467 HeapCTypeWithDict_slots
6468};
6469
6470static struct PyMemberDef heapctypewithnegativedict_members[] = {
6471 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006472 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006473 {NULL} /* Sentinel */
6474};
6475
6476static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6477 {Py_tp_members, heapctypewithnegativedict_members},
6478 {Py_tp_getset, heapctypewithdict_getsetlist},
6479 {Py_tp_dealloc, heapctypewithdict_dealloc},
6480 {0, 0},
6481};
6482
6483static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6484 "_testcapi.HeapCTypeWithNegativeDict",
6485 sizeof(HeapCTypeWithDictObject),
6486 0,
6487 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6488 HeapCTypeWithNegativeDict_slots
6489};
6490
6491typedef struct {
6492 PyObject_HEAD
6493 PyObject *weakreflist;
6494} HeapCTypeWithWeakrefObject;
6495
6496static struct PyMemberDef heapctypewithweakref_members[] = {
6497 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6498 {"__weaklistoffset__", T_PYSSIZET,
6499 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6500 {NULL} /* Sentinel */
6501};
6502
6503static void
6504heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6505{
6506
6507 PyTypeObject *tp = Py_TYPE(self);
6508 if (self->weakreflist != NULL)
6509 PyObject_ClearWeakRefs((PyObject *) self);
6510 Py_XDECREF(self->weakreflist);
6511 PyObject_DEL(self);
6512 Py_DECREF(tp);
6513}
6514
6515static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6516 {Py_tp_members, heapctypewithweakref_members},
6517 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6518 {0, 0},
6519};
6520
6521static PyType_Spec HeapCTypeWithWeakref_spec = {
6522 "_testcapi.HeapCTypeWithWeakref",
6523 sizeof(HeapCTypeWithWeakrefObject),
6524 0,
6525 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6526 HeapCTypeWithWeakref_slots
6527};
6528
Petr Viktorinf9583772019-09-10 12:21:09 +01006529static PyMethodDef meth_instance_methods[] = {
6530 {"meth_varargs", meth_varargs, METH_VARARGS},
6531 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6532 {"meth_o", meth_o, METH_O},
6533 {"meth_noargs", meth_noargs, METH_NOARGS},
6534 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6535 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6536 {NULL, NULL} /* sentinel */
6537};
6538
6539
6540static PyTypeObject MethInstance_Type = {
6541 PyVarObject_HEAD_INIT(NULL, 0)
6542 "MethInstance",
6543 sizeof(PyObject),
6544 .tp_new = PyType_GenericNew,
6545 .tp_flags = Py_TPFLAGS_DEFAULT,
6546 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006547 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006548 "Class with normal (instance) methods to test calling conventions"),
6549};
6550
6551static PyMethodDef meth_class_methods[] = {
6552 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6553 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6554 {"meth_o", meth_o, METH_O|METH_CLASS},
6555 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6556 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6557 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6558 {NULL, NULL} /* sentinel */
6559};
6560
6561
6562static PyTypeObject MethClass_Type = {
6563 PyVarObject_HEAD_INIT(NULL, 0)
6564 "MethClass",
6565 sizeof(PyObject),
6566 .tp_new = PyType_GenericNew,
6567 .tp_flags = Py_TPFLAGS_DEFAULT,
6568 .tp_methods = meth_class_methods,
6569 .tp_doc = PyDoc_STR(
6570 "Class with class methods to test calling conventions"),
6571};
6572
6573static PyMethodDef meth_static_methods[] = {
6574 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6575 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6576 {"meth_o", meth_o, METH_O|METH_STATIC},
6577 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6578 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6579 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6580 {NULL, NULL} /* sentinel */
6581};
6582
6583
6584static PyTypeObject MethStatic_Type = {
6585 PyVarObject_HEAD_INIT(NULL, 0)
6586 "MethStatic",
6587 sizeof(PyObject),
6588 .tp_new = PyType_GenericNew,
6589 .tp_flags = Py_TPFLAGS_DEFAULT,
6590 .tp_methods = meth_static_methods,
6591 .tp_doc = PyDoc_STR(
6592 "Class with static methods to test calling conventions"),
6593};
6594
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006595/* ContainerNoGC -- a simple container without GC methods */
6596
6597typedef struct {
6598 PyObject_HEAD
6599 PyObject *value;
6600} ContainerNoGCobject;
6601
6602static PyObject *
6603ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6604{
6605 PyObject *value;
6606 char *names[] = {"value", NULL};
6607 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6608 return NULL;
6609 }
6610 PyObject *self = type->tp_alloc(type, 0);
6611 if (self == NULL) {
6612 return NULL;
6613 }
6614 Py_INCREF(value);
6615 ((ContainerNoGCobject *)self)->value = value;
6616 return self;
6617}
6618
6619static void
6620ContainerNoGC_dealloc(ContainerNoGCobject *self)
6621{
6622 Py_DECREF(self->value);
6623 Py_TYPE(self)->tp_free((PyObject *)self);
6624}
6625
6626static PyMemberDef ContainerNoGC_members[] = {
6627 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6628 PyDoc_STR("a container value for test purposes")},
6629 {0}
6630};
6631
6632static PyTypeObject ContainerNoGC_type = {
6633 PyVarObject_HEAD_INIT(NULL, 0)
6634 "_testcapi.ContainerNoGC",
6635 sizeof(ContainerNoGCobject),
6636 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
6637 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6638 .tp_members = ContainerNoGC_members,
6639 .tp_new = ContainerNoGC_new,
6640};
6641
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006642
Martin v. Löwis1a214512008-06-11 05:26:20 +00006643static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 PyModuleDef_HEAD_INIT,
6645 "_testcapi",
6646 NULL,
6647 -1,
6648 TestMethods,
6649 NULL,
6650 NULL,
6651 NULL,
6652 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006653};
6654
Nick Coghland5cacbb2015-05-23 22:24:10 +10006655/* Per PEP 489, this module will not be converted to multi-phase initialization
6656 */
6657
Mark Hammond62b1ab12002-07-23 06:31:15 +00006658PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006659PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 m = PyModule_Create(&_testcapimodule);
6664 if (m == NULL)
6665 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006666
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006667 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006668
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006669 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 Py_INCREF(&test_structmembersType);
6671 /* don't use a name starting with "test", since we don't want
6672 test_capi to automatically call this */
6673 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006674 if (PyType_Ready(&matmulType) < 0)
6675 return NULL;
6676 Py_INCREF(&matmulType);
6677 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006678 if (PyType_Ready(&ipowType) < 0) {
6679 return NULL;
6680 }
6681 Py_INCREF(&ipowType);
6682 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006683
Yury Selivanov75445082015-05-11 22:57:16 -04006684 if (PyType_Ready(&awaitType) < 0)
6685 return NULL;
6686 Py_INCREF(&awaitType);
6687 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6688
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006689 MyList_Type.tp_base = &PyList_Type;
6690 if (PyType_Ready(&MyList_Type) < 0)
6691 return NULL;
6692 Py_INCREF(&MyList_Type);
6693 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6694
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006695 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6696 return NULL;
6697 Py_INCREF(&MethodDescriptorBase_Type);
6698 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6699
6700 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6701 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6702 return NULL;
6703 Py_INCREF(&MethodDescriptorDerived_Type);
6704 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6705
6706 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6707 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6708 return NULL;
6709 Py_INCREF(&MethodDescriptorNopGet_Type);
6710 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6711
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006712 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6713 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6714 return NULL;
6715 Py_INCREF(&MethodDescriptor2_Type);
6716 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6717
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006718 if (PyType_Ready(&GenericAlias_Type) < 0)
6719 return NULL;
6720 Py_INCREF(&GenericAlias_Type);
6721 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6722
6723 if (PyType_Ready(&Generic_Type) < 0)
6724 return NULL;
6725 Py_INCREF(&Generic_Type);
6726 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6727
Petr Viktorinf9583772019-09-10 12:21:09 +01006728 if (PyType_Ready(&MethInstance_Type) < 0)
6729 return NULL;
6730 Py_INCREF(&MethInstance_Type);
6731 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
6732
6733 if (PyType_Ready(&MethClass_Type) < 0)
6734 return NULL;
6735 Py_INCREF(&MethClass_Type);
6736 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
6737
6738 if (PyType_Ready(&MethStatic_Type) < 0)
6739 return NULL;
6740 Py_INCREF(&MethStatic_Type);
6741 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
6742
xdegaye56d1f5c2017-10-26 15:09:06 +02006743 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6744 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6745 return NULL;
6746 }
6747 Py_INCREF(&PyRecursingInfinitelyError_Type);
6748 PyModule_AddObject(m, "RecursingInfinitelyError",
6749 (PyObject *)&PyRecursingInfinitelyError_Type);
6750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6752 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6753 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6754 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6755 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6756 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6757 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6758 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6759 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6760 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6761 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6762 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6763 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6764 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6765 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6766 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05006767 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
6768 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
6769 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6771 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02006772 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 Py_INCREF(&PyInstanceMethod_Type);
6774 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006775
Larry Hastings2a727912014-01-16 11:32:01 -08006776 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01006777 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01006778#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01006779 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01006780#else
Victor Stinner310e2d22019-11-22 10:58:00 +01006781 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01006782#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01006783 Py_INCREF(v);
6784 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08006785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6787 Py_INCREF(TestError);
6788 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006789
6790 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
6791 if (HeapGcCType == NULL) {
6792 return NULL;
6793 }
6794 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
6795
6796 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
6797 if (HeapCType == NULL) {
6798 return NULL;
6799 }
6800 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
6801 if (subclass_bases == NULL) {
6802 return NULL;
6803 }
6804 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
6805 if (HeapCTypeSubclass == NULL) {
6806 return NULL;
6807 }
6808 Py_DECREF(subclass_bases);
6809 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
6810
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006811 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
6812 if (HeapCTypeWithDict == NULL) {
6813 return NULL;
6814 }
6815 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
6816
6817 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
6818 if (HeapCTypeWithNegativeDict == NULL) {
6819 return NULL;
6820 }
6821 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
6822
6823 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
6824 if (HeapCTypeWithWeakref == NULL) {
6825 return NULL;
6826 }
6827 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
6828
scoderf7c4e232020-06-06 21:35:10 +02006829 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
6830 if (HeapCTypeWithBuffer == NULL) {
6831 return NULL;
6832 }
6833 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
6834
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006835 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
6836 if (subclass_with_finalizer_bases == NULL) {
6837 return NULL;
6838 }
6839 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
6840 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
6841 if (HeapCTypeSubclassWithFinalizer == NULL) {
6842 return NULL;
6843 }
6844 Py_DECREF(subclass_with_finalizer_bases);
6845 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
6846
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006847 if (PyType_Ready(&ContainerNoGC_type) < 0) {
6848 return NULL;
6849 }
6850 Py_INCREF(&ContainerNoGC_type);
6851 if (PyModule_AddObject(m, "ContainerNoGC",
6852 (PyObject *) &ContainerNoGC_type) < 0)
6853 return NULL;
6854
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006855 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006857}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006858
6859
6860/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
6861
6862#undef Py_BuildValue
6863PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
6864
6865static PyObject *
6866test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
6867{
6868 PyObject *res;
6869 const char str[] = "string";
6870 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02006871 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006872
6873 res = Py_BuildValue("(s#O)", str, 1, Py_None);
6874 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006875 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006876 return NULL;
6877 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006878 PyErr_Clear();
6879
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006880 res = Py_BuildValue("(z#O)", str, 1, Py_None);
6881 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006882 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006883 return NULL;
6884 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006885 PyErr_Clear();
6886
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006887 res = Py_BuildValue("(y#O)", str, 1, Py_None);
6888 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006889 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006890 return NULL;
6891 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006892 PyErr_Clear();
6893
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006894 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
6895 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006896 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006897 return NULL;
6898 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006899 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02006900
6901
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006902 Py_RETURN_NONE;
6903}