blob: c759dcc0f152bf6cb600c91582004d1fd3d52560 [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
scoder3cc481b2021-04-28 18:12:16 +0200147static PyObject*
148test_gc_control(PyObject *self, PyObject *Py_UNUSED(ignored))
149{
150 int orig_enabled = PyGC_IsEnabled();
151 const char* msg = "ok";
152 int old_state;
153
154 old_state = PyGC_Enable();
155 msg = "Enable(1)";
156 if (old_state != orig_enabled) {
157 goto failed;
158 }
159 msg = "IsEnabled(1)";
160 if (!PyGC_IsEnabled()) {
161 goto failed;
162 }
163
164 old_state = PyGC_Disable();
165 msg = "disable(2)";
166 if (!old_state) {
167 goto failed;
168 }
169 msg = "IsEnabled(2)";
170 if (PyGC_IsEnabled()) {
171 goto failed;
172 }
173
174 old_state = PyGC_Enable();
175 msg = "enable(3)";
176 if (old_state) {
177 goto failed;
178 }
179 msg = "IsEnabled(3)";
180 if (!PyGC_IsEnabled()) {
181 goto failed;
182 }
183
184 if (!orig_enabled) {
185 old_state = PyGC_Disable();
186 msg = "disable(4)";
187 if (old_state) {
188 goto failed;
189 }
190 msg = "IsEnabled(4)";
191 if (PyGC_IsEnabled()) {
192 goto failed;
193 }
194 }
195
196 Py_RETURN_NONE;
197
198failed:
199 /* Try to clean up if we can. */
200 if (orig_enabled) {
201 PyGC_Enable();
202 } else {
203 PyGC_Disable();
204 }
205 PyErr_Format(TestError, "GC control failed in %s", msg);
206 return NULL;
207}
Victor Stinner01076552013-10-29 19:39:52 +0100208
209static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530210test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 PyObject* list;
213 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000216#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 list = PyList_New(NLIST);
218 if (list == (PyObject*)NULL)
219 return (PyObject*)NULL;
220 /* list = range(NLIST) */
221 for (i = 0; i < NLIST; ++i) {
222 PyObject* anint = PyLong_FromLong(i);
223 if (anint == (PyObject*)NULL) {
224 Py_DECREF(list);
225 return (PyObject*)NULL;
226 }
227 PyList_SET_ITEM(list, i, anint);
228 }
229 /* list.reverse(), via PyList_Reverse() */
230 i = PyList_Reverse(list); /* should not blow up! */
231 if (i != 0) {
232 Py_DECREF(list);
233 return (PyObject*)NULL;
234 }
235 /* Check that list == range(29, -1, -1) now */
236 for (i = 0; i < NLIST; ++i) {
237 PyObject* anint = PyList_GET_ITEM(list, i);
238 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
239 PyErr_SetString(TestError,
240 "test_list_api: reverse screwed up");
241 Py_DECREF(list);
242 return (PyObject*)NULL;
243 }
244 }
245 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000246#undef NLIST
247
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200248 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000249}
250
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000251static int
252test_dict_inner(int count)
253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 Py_ssize_t pos = 0, iterations = 0;
255 int i;
256 PyObject *dict = PyDict_New();
257 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 if (dict == NULL)
260 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 for (i = 0; i < count; i++) {
263 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200264 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200265 return -1;
266 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200267 if (PyDict_SetItem(dict, v, v) < 0) {
268 Py_DECREF(v);
269 return -1;
270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 Py_DECREF(v);
272 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 while (PyDict_Next(dict, &pos, &k, &v)) {
275 PyObject *o;
276 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 i = PyLong_AS_LONG(v) + 1;
279 o = PyLong_FromLong(i);
280 if (o == NULL)
281 return -1;
282 if (PyDict_SetItem(dict, k, o) < 0) {
283 Py_DECREF(o);
284 return -1;
285 }
286 Py_DECREF(o);
287 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 if (iterations != count) {
292 PyErr_SetString(
293 TestError,
294 "test_dict_iteration: dict iteration went wrong ");
295 return -1;
296 } else {
297 return 0;
298 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000299}
300
301static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530302test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 for (i = 0; i < 200; i++) {
307 if (test_dict_inner(i) < 0) {
308 return NULL;
309 }
310 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000311
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200312 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000313}
314
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200315static PyObject*
316dict_getitem_knownhash(PyObject *self, PyObject *args)
317{
318 PyObject *mp, *key, *result;
319 Py_ssize_t hash;
320
321 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
322 &mp, &key, &hash)) {
323 return NULL;
324 }
325
326 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
327 if (result == NULL && !PyErr_Occurred()) {
328 _PyErr_SetKeyError(key);
329 return NULL;
330 }
331
332 Py_XINCREF(result);
333 return result;
334}
Tim Peters91621db2001-06-12 20:10:01 +0000335
Victor Stinner3d3f2642016-12-15 17:21:23 +0100336static PyObject*
337dict_hassplittable(PyObject *self, PyObject *arg)
338{
339 if (!PyDict_Check(arg)) {
340 PyErr_Format(PyExc_TypeError,
341 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100342 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100343 return NULL;
344 }
345
346 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
347}
348
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000349/* Issue #4701: Check that PyObject_Hash implicitly calls
350 * PyType_Ready if it hasn't already been called
351 */
352static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 PyVarObject_HEAD_INIT(NULL, 0)
354 "hashinheritancetester", /* Name of this type */
355 sizeof(PyObject), /* Basic object size */
356 0, /* Item size for varobject */
357 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200358 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 0, /* tp_getattr */
360 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200361 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 0, /* tp_repr */
363 0, /* tp_as_number */
364 0, /* tp_as_sequence */
365 0, /* tp_as_mapping */
366 0, /* tp_hash */
367 0, /* tp_call */
368 0, /* tp_str */
369 PyObject_GenericGetAttr, /* tp_getattro */
370 0, /* tp_setattro */
371 0, /* tp_as_buffer */
372 Py_TPFLAGS_DEFAULT, /* tp_flags */
373 0, /* tp_doc */
374 0, /* tp_traverse */
375 0, /* tp_clear */
376 0, /* tp_richcompare */
377 0, /* tp_weaklistoffset */
378 0, /* tp_iter */
379 0, /* tp_iternext */
380 0, /* tp_methods */
381 0, /* tp_members */
382 0, /* tp_getset */
383 0, /* tp_base */
384 0, /* tp_dict */
385 0, /* tp_descr_get */
386 0, /* tp_descr_set */
387 0, /* tp_dictoffset */
388 0, /* tp_init */
389 0, /* tp_alloc */
390 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000391};
392
393static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530394test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 PyTypeObject *type;
397 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000398 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 if (type->tp_dict != NULL)
403 /* The type has already been initialized. This probably means
404 -R is being used. */
405 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000406
407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 obj = PyObject_New(PyObject, type);
409 if (obj == NULL) {
410 PyErr_Clear();
411 PyErr_SetString(
412 TestError,
413 "test_lazy_hash_inheritance: failed to create object");
414 return NULL;
415 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (type->tp_dict != NULL) {
418 PyErr_SetString(
419 TestError,
420 "test_lazy_hash_inheritance: type initialised too soon");
421 Py_DECREF(obj);
422 return NULL;
423 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 hash = PyObject_Hash(obj);
426 if ((hash == -1) && PyErr_Occurred()) {
427 PyErr_Clear();
428 PyErr_SetString(
429 TestError,
430 "test_lazy_hash_inheritance: could not hash object");
431 Py_DECREF(obj);
432 return NULL;
433 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 if (type->tp_dict == NULL) {
436 PyErr_SetString(
437 TestError,
438 "test_lazy_hash_inheritance: type not initialised by hash()");
439 Py_DECREF(obj);
440 return NULL;
441 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 if (type->tp_hash != PyType_Type.tp_hash) {
444 PyErr_SetString(
445 TestError,
446 "test_lazy_hash_inheritance: unexpected hash function");
447 Py_DECREF(obj);
448 return NULL;
449 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000454}
455
456
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700457/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000458 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000459
460 Note that the meat of the test is contained in testcapi_long.h.
461 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700462 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000463 dependence on type names makes it impossible to use a parameterized
464 function. A giant macro would be even worse than this. A C++ template
465 would be perfect.
466
467 The "report an error" functions are deliberately not part of the #include
468 file: if the test fails, you can set a breakpoint in the appropriate
469 error function directly, and crawl back from there in the debugger.
470*/
471
472#define UNBIND(X) Py_DECREF(X); (X) = NULL
473
474static PyObject *
475raise_test_long_error(const char* msg)
476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000478}
479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480#define TESTNAME test_long_api_inner
481#define TYPENAME long
482#define F_S_TO_PY PyLong_FromLong
483#define F_PY_TO_S PyLong_AsLong
484#define F_U_TO_PY PyLong_FromUnsignedLong
485#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000486
487#include "testcapi_long.h"
488
489static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530490test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000493}
494
495#undef TESTNAME
496#undef TYPENAME
497#undef F_S_TO_PY
498#undef F_PY_TO_S
499#undef F_U_TO_PY
500#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000501
Tim Peters91621db2001-06-12 20:10:01 +0000502static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000503raise_test_longlong_error(const char* msg)
504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000506}
507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700509#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510#define F_S_TO_PY PyLong_FromLongLong
511#define F_PY_TO_S PyLong_AsLongLong
512#define F_U_TO_PY PyLong_FromUnsignedLongLong
513#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000514
515#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000516
517static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000521}
522
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000523#undef TESTNAME
524#undef TYPENAME
525#undef F_S_TO_PY
526#undef F_PY_TO_S
527#undef F_U_TO_PY
528#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000529
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000530/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
531 is tested by test_long_api_inner. This test will concentrate on proper
532 handling of overflow.
533*/
534
535static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530536test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyObject *num, *one, *temp;
539 long value;
540 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Test that overflow is set properly for a large value. */
543 /* num is a number larger than LONG_MAX even on 64-bit platforms */
544 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
545 if (num == NULL)
546 return NULL;
547 overflow = 1234;
548 value = PyLong_AsLongAndOverflow(num, &overflow);
549 Py_DECREF(num);
550 if (value == -1 && PyErr_Occurred())
551 return NULL;
552 if (value != -1)
553 return raiseTestError("test_long_and_overflow",
554 "return value was not set to -1");
555 if (overflow != 1)
556 return raiseTestError("test_long_and_overflow",
557 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* Same again, with num = LONG_MAX + 1 */
560 num = PyLong_FromLong(LONG_MAX);
561 if (num == NULL)
562 return NULL;
563 one = PyLong_FromLong(1L);
564 if (one == NULL) {
565 Py_DECREF(num);
566 return NULL;
567 }
568 temp = PyNumber_Add(num, one);
569 Py_DECREF(one);
570 Py_DECREF(num);
571 num = temp;
572 if (num == NULL)
573 return NULL;
574 overflow = 0;
575 value = PyLong_AsLongAndOverflow(num, &overflow);
576 Py_DECREF(num);
577 if (value == -1 && PyErr_Occurred())
578 return NULL;
579 if (value != -1)
580 return raiseTestError("test_long_and_overflow",
581 "return value was not set to -1");
582 if (overflow != 1)
583 return raiseTestError("test_long_and_overflow",
584 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 /* Test that overflow is set properly for a large negative value. */
587 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
588 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
589 if (num == NULL)
590 return NULL;
591 overflow = 1234;
592 value = PyLong_AsLongAndOverflow(num, &overflow);
593 Py_DECREF(num);
594 if (value == -1 && PyErr_Occurred())
595 return NULL;
596 if (value != -1)
597 return raiseTestError("test_long_and_overflow",
598 "return value was not set to -1");
599 if (overflow != -1)
600 return raiseTestError("test_long_and_overflow",
601 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Same again, with num = LONG_MIN - 1 */
604 num = PyLong_FromLong(LONG_MIN);
605 if (num == NULL)
606 return NULL;
607 one = PyLong_FromLong(1L);
608 if (one == NULL) {
609 Py_DECREF(num);
610 return NULL;
611 }
612 temp = PyNumber_Subtract(num, one);
613 Py_DECREF(one);
614 Py_DECREF(num);
615 num = temp;
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 != -1)
624 return raiseTestError("test_long_and_overflow",
625 "return value was not set to -1");
626 if (overflow != -1)
627 return raiseTestError("test_long_and_overflow",
628 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Test that overflow is cleared properly for small values. */
631 num = PyLong_FromString("FF", NULL, 16);
632 if (num == NULL)
633 return NULL;
634 overflow = 1234;
635 value = PyLong_AsLongAndOverflow(num, &overflow);
636 Py_DECREF(num);
637 if (value == -1 && PyErr_Occurred())
638 return NULL;
639 if (value != 0xFF)
640 return raiseTestError("test_long_and_overflow",
641 "expected return value 0xFF");
642 if (overflow != 0)
643 return raiseTestError("test_long_and_overflow",
644 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 num = PyLong_FromString("-FF", NULL, 16);
647 if (num == NULL)
648 return NULL;
649 overflow = 0;
650 value = PyLong_AsLongAndOverflow(num, &overflow);
651 Py_DECREF(num);
652 if (value == -1 && PyErr_Occurred())
653 return NULL;
654 if (value != -0xFF)
655 return raiseTestError("test_long_and_overflow",
656 "expected return value 0xFF");
657 if (overflow != 0)
658 return raiseTestError("test_long_and_overflow",
659 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 num = PyLong_FromLong(LONG_MAX);
662 if (num == NULL)
663 return NULL;
664 overflow = 1234;
665 value = PyLong_AsLongAndOverflow(num, &overflow);
666 Py_DECREF(num);
667 if (value == -1 && PyErr_Occurred())
668 return NULL;
669 if (value != LONG_MAX)
670 return raiseTestError("test_long_and_overflow",
671 "expected return value LONG_MAX");
672 if (overflow != 0)
673 return raiseTestError("test_long_and_overflow",
674 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 num = PyLong_FromLong(LONG_MIN);
677 if (num == NULL)
678 return NULL;
679 overflow = 0;
680 value = PyLong_AsLongAndOverflow(num, &overflow);
681 Py_DECREF(num);
682 if (value == -1 && PyErr_Occurred())
683 return NULL;
684 if (value != LONG_MIN)
685 return raiseTestError("test_long_and_overflow",
686 "expected return value LONG_MIN");
687 if (overflow != 0)
688 return raiseTestError("test_long_and_overflow",
689 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000690
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200691 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000692}
693
Mark Dickinson93f562c2010-01-30 10:30:15 +0000694/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700695 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000696 concentrate on proper handling of overflow.
697*/
698
699static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530700test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700703 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500707 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
709 if (num == NULL)
710 return NULL;
711 overflow = 1234;
712 value = PyLong_AsLongLongAndOverflow(num, &overflow);
713 Py_DECREF(num);
714 if (value == -1 && PyErr_Occurred())
715 return NULL;
716 if (value != -1)
717 return raiseTestError("test_long_long_and_overflow",
718 "return value was not set to -1");
719 if (overflow != 1)
720 return raiseTestError("test_long_long_and_overflow",
721 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000722
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500723 /* Same again, with num = LLONG_MAX + 1 */
724 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 if (num == NULL)
726 return NULL;
727 one = PyLong_FromLong(1L);
728 if (one == NULL) {
729 Py_DECREF(num);
730 return NULL;
731 }
732 temp = PyNumber_Add(num, one);
733 Py_DECREF(one);
734 Py_DECREF(num);
735 num = temp;
736 if (num == NULL)
737 return NULL;
738 overflow = 0;
739 value = PyLong_AsLongLongAndOverflow(num, &overflow);
740 Py_DECREF(num);
741 if (value == -1 && PyErr_Occurred())
742 return NULL;
743 if (value != -1)
744 return raiseTestError("test_long_long_and_overflow",
745 "return value was not set to -1");
746 if (overflow != 1)
747 return raiseTestError("test_long_long_and_overflow",
748 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500751 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
753 if (num == NULL)
754 return NULL;
755 overflow = 1234;
756 value = PyLong_AsLongLongAndOverflow(num, &overflow);
757 Py_DECREF(num);
758 if (value == -1 && PyErr_Occurred())
759 return NULL;
760 if (value != -1)
761 return raiseTestError("test_long_long_and_overflow",
762 "return value was not set to -1");
763 if (overflow != -1)
764 return raiseTestError("test_long_long_and_overflow",
765 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000766
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500767 /* Same again, with num = LLONG_MIN - 1 */
768 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (num == NULL)
770 return NULL;
771 one = PyLong_FromLong(1L);
772 if (one == NULL) {
773 Py_DECREF(num);
774 return NULL;
775 }
776 temp = PyNumber_Subtract(num, one);
777 Py_DECREF(one);
778 Py_DECREF(num);
779 num = temp;
780 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;
787 if (value != -1)
788 return raiseTestError("test_long_long_and_overflow",
789 "return value was not set to -1");
790 if (overflow != -1)
791 return raiseTestError("test_long_long_and_overflow",
792 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* Test that overflow is cleared properly for small values. */
795 num = PyLong_FromString("FF", NULL, 16);
796 if (num == NULL)
797 return NULL;
798 overflow = 1234;
799 value = PyLong_AsLongLongAndOverflow(num, &overflow);
800 Py_DECREF(num);
801 if (value == -1 && PyErr_Occurred())
802 return NULL;
803 if (value != 0xFF)
804 return raiseTestError("test_long_long_and_overflow",
805 "expected return value 0xFF");
806 if (overflow != 0)
807 return raiseTestError("test_long_long_and_overflow",
808 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 num = PyLong_FromString("-FF", NULL, 16);
811 if (num == NULL)
812 return NULL;
813 overflow = 0;
814 value = PyLong_AsLongLongAndOverflow(num, &overflow);
815 Py_DECREF(num);
816 if (value == -1 && PyErr_Occurred())
817 return NULL;
818 if (value != -0xFF)
819 return raiseTestError("test_long_long_and_overflow",
820 "expected return value 0xFF");
821 if (overflow != 0)
822 return raiseTestError("test_long_long_and_overflow",
823 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000824
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500825 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 if (num == NULL)
827 return NULL;
828 overflow = 1234;
829 value = PyLong_AsLongLongAndOverflow(num, &overflow);
830 Py_DECREF(num);
831 if (value == -1 && PyErr_Occurred())
832 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500833 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500835 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 if (overflow != 0)
837 return raiseTestError("test_long_long_and_overflow",
838 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000839
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500840 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 if (num == NULL)
842 return NULL;
843 overflow = 0;
844 value = PyLong_AsLongLongAndOverflow(num, &overflow);
845 Py_DECREF(num);
846 if (value == -1 && PyErr_Occurred())
847 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500848 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500850 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 if (overflow != 0)
852 return raiseTestError("test_long_long_and_overflow",
853 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000854
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200855 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000856}
857
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200858/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
859 non-integer arguments are handled correctly. It should be extended to
860 test overflow handling.
861 */
862
863static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530864test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200865{
866 size_t out_u;
867 Py_ssize_t out_s;
868
869 Py_INCREF(Py_None);
870
871 out_u = PyLong_AsSize_t(Py_None);
872 if (out_u != (size_t)-1 || !PyErr_Occurred())
873 return raiseTestError("test_long_as_size_t",
874 "PyLong_AsSize_t(None) didn't complain");
875 if (!PyErr_ExceptionMatches(PyExc_TypeError))
876 return raiseTestError("test_long_as_size_t",
877 "PyLong_AsSize_t(None) raised "
878 "something other than TypeError");
879 PyErr_Clear();
880
881 out_s = PyLong_AsSsize_t(Py_None);
882 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
883 return raiseTestError("test_long_as_size_t",
884 "PyLong_AsSsize_t(None) didn't complain");
885 if (!PyErr_ExceptionMatches(PyExc_TypeError))
886 return raiseTestError("test_long_as_size_t",
887 "PyLong_AsSsize_t(None) raised "
888 "something other than TypeError");
889 PyErr_Clear();
890
891 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
892 return Py_None;
893}
894
Zackery Spytzdc247652019-06-06 14:39:23 -0600895static PyObject *
896test_long_as_unsigned_long_long_mask(PyObject *self,
897 PyObject *Py_UNUSED(ignored))
898{
899 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
900
901 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
902 return raiseTestError("test_long_as_unsigned_long_long_mask",
903 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
904 "complain");
905 }
906 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
907 return raiseTestError("test_long_as_unsigned_long_long_mask",
908 "PyLong_AsUnsignedLongLongMask(NULL) raised "
909 "something other than SystemError");
910 }
911 PyErr_Clear();
912 Py_RETURN_NONE;
913}
914
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200915/* Test the PyLong_AsDouble API. At present this just tests that
916 non-integer arguments are handled correctly.
917 */
918
919static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530920test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200921{
922 double out;
923
924 Py_INCREF(Py_None);
925
926 out = PyLong_AsDouble(Py_None);
927 if (out != -1.0 || !PyErr_Occurred())
928 return raiseTestError("test_long_as_double",
929 "PyLong_AsDouble(None) didn't complain");
930 if (!PyErr_ExceptionMatches(PyExc_TypeError))
931 return raiseTestError("test_long_as_double",
932 "PyLong_AsDouble(None) raised "
933 "something other than TypeError");
934 PyErr_Clear();
935
936 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
937 return Py_None;
938}
939
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700940/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000941 for both long and int arguments. The test may leak a little memory if
942 it fails.
943*/
944static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530945test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700948 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 tuple = PyTuple_New(1);
951 if (tuple == NULL)
952 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 num = PyLong_FromLong(42);
955 if (num == NULL)
956 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300961 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300963 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 if (value != 42)
965 return raiseTestError("test_L_code",
966 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 Py_DECREF(num);
969 num = PyLong_FromLong(42);
970 if (num == NULL)
971 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300976 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300978 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 if (value != 42)
980 return raiseTestError("test_L_code",
981 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200984 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000985}
986
Serhiy Storchakace412872016-05-08 23:36:44 +0300987static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300988return_none(void *unused)
989{
990 Py_RETURN_NONE;
991}
992
993static PyObject *
994raise_error(void *unused)
995{
996 PyErr_SetNone(PyExc_ValueError);
997 return NULL;
998}
999
1000static int
1001test_buildvalue_N_error(const char *fmt)
1002{
1003 PyObject *arg, *res;
1004
1005 arg = PyList_New(0);
1006 if (arg == NULL) {
1007 return -1;
1008 }
1009
1010 Py_INCREF(arg);
1011 res = Py_BuildValue(fmt, return_none, NULL, arg);
1012 if (res == NULL) {
1013 return -1;
1014 }
1015 Py_DECREF(res);
1016 if (Py_REFCNT(arg) != 1) {
1017 PyErr_Format(TestError, "test_buildvalue_N: "
1018 "arg was not decrefed in successful "
1019 "Py_BuildValue(\"%s\")", fmt);
1020 return -1;
1021 }
1022
1023 Py_INCREF(arg);
1024 res = Py_BuildValue(fmt, raise_error, NULL, arg);
1025 if (res != NULL || !PyErr_Occurred()) {
1026 PyErr_Format(TestError, "test_buildvalue_N: "
1027 "Py_BuildValue(\"%s\") didn't complain", fmt);
1028 return -1;
1029 }
1030 PyErr_Clear();
1031 if (Py_REFCNT(arg) != 1) {
1032 PyErr_Format(TestError, "test_buildvalue_N: "
1033 "arg was not decrefed in failed "
1034 "Py_BuildValue(\"%s\")", fmt);
1035 return -1;
1036 }
1037 Py_DECREF(arg);
1038 return 0;
1039}
1040
1041static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02001042test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03001043{
1044 PyObject *arg, *res;
1045
1046 arg = PyList_New(0);
1047 if (arg == NULL) {
1048 return NULL;
1049 }
1050 Py_INCREF(arg);
1051 res = Py_BuildValue("N", arg);
1052 if (res == NULL) {
1053 return NULL;
1054 }
1055 if (res != arg) {
1056 return raiseTestError("test_buildvalue_N",
1057 "Py_BuildValue(\"N\") returned wrong result");
1058 }
1059 if (Py_REFCNT(arg) != 2) {
1060 return raiseTestError("test_buildvalue_N",
1061 "arg was not decrefed in Py_BuildValue(\"N\")");
1062 }
1063 Py_DECREF(res);
1064 Py_DECREF(arg);
1065
1066 if (test_buildvalue_N_error("O&N") < 0)
1067 return NULL;
1068 if (test_buildvalue_N_error("(O&N)") < 0)
1069 return NULL;
1070 if (test_buildvalue_N_error("[O&N]") < 0)
1071 return NULL;
1072 if (test_buildvalue_N_error("{O&N}") < 0)
1073 return NULL;
1074 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1075 return NULL;
1076
1077 Py_RETURN_NONE;
1078}
1079
1080
1081static PyObject *
Hai Shia13b26c2020-11-11 04:53:46 +08001082test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1083{
1084 newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1085 if (PyLong_Type.tp_new != tp_new) {
1086 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1087 return NULL;
1088 }
1089
1090 reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1091 if (PyLong_Type.tp_repr != tp_repr) {
1092 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1093 return NULL;
1094 }
1095
1096 ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1097 if (tp_call != NULL) {
1098 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1099 return NULL;
1100 }
1101
1102 binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1103 if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1104 PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1105 return NULL;
1106 }
1107
1108 lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1109 if (mp_length != NULL) {
1110 PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1111 return NULL;
1112 }
1113
1114 void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1115 if (over_value != NULL) {
1116 PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1117 return NULL;
1118 }
1119
1120 tp_new = PyType_GetSlot(&PyLong_Type, 0);
1121 if (tp_new != NULL) {
1122 PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1123 return NULL;
1124 }
1125 if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1126 // This is the right exception
1127 PyErr_Clear();
1128 }
1129 else {
1130 return NULL;
1131 }
1132
1133 Py_RETURN_NONE;
1134}
1135
1136
1137static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001138get_args(PyObject *self, PyObject *args)
1139{
1140 if (args == NULL) {
1141 args = Py_None;
1142 }
1143 Py_INCREF(args);
1144 return args;
1145}
1146
1147static PyObject *
1148get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1149{
1150 if (kwargs == NULL) {
1151 kwargs = Py_None;
1152 }
1153 Py_INCREF(kwargs);
1154 return kwargs;
1155}
1156
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001157/* Test tuple argument processing */
1158static PyObject *
1159getargs_tuple(PyObject *self, PyObject *args)
1160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 int a, b, c;
1162 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1163 return NULL;
1164 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001165}
1166
Christian Heimes380f7f22008-02-28 11:19:05 +00001167/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001168static PyObject *
1169getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001172 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1176 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1177 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1178 return NULL;
1179 return Py_BuildValue("iiiiiiiiii",
1180 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1181 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001182}
1183
Larry Hastings83a9f482012-03-20 20:06:16 +00001184/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1185static PyObject *
1186getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1187{
1188 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1189 int required = -1;
1190 int optional = -1;
1191 int keyword_only = -1;
1192
1193 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1194 &required, &optional, &keyword_only))
1195 return NULL;
1196 return Py_BuildValue("iii", required, optional, keyword_only);
1197}
1198
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001199/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1200static PyObject *
1201getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1202{
1203 static char *keywords[] = {"", "", "keyword", NULL};
1204 int required = -1;
1205 int optional = -1;
1206 int keyword = -1;
1207
1208 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1209 &required, &optional, &keyword))
1210 return NULL;
1211 return Py_BuildValue("iii", required, optional, keyword);
1212}
1213
Thomas Heller3457e4b2003-04-24 16:14:27 +00001214/* Functions to call PyArg_ParseTuple with integer format codes,
1215 and return the result.
1216*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001217static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001218getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 unsigned char value;
1221 if (!PyArg_ParseTuple(args, "b", &value))
1222 return NULL;
1223 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224}
1225
Thomas Heller3457e4b2003-04-24 16:14:27 +00001226static PyObject *
1227getargs_B(PyObject *self, PyObject *args)
1228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 unsigned char value;
1230 if (!PyArg_ParseTuple(args, "B", &value))
1231 return NULL;
1232 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001233}
1234
1235static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001236getargs_h(PyObject *self, PyObject *args)
1237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 short value;
1239 if (!PyArg_ParseTuple(args, "h", &value))
1240 return NULL;
1241 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001242}
1243
1244static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001245getargs_H(PyObject *self, PyObject *args)
1246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 unsigned short value;
1248 if (!PyArg_ParseTuple(args, "H", &value))
1249 return NULL;
1250 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001251}
1252
1253static PyObject *
1254getargs_I(PyObject *self, PyObject *args)
1255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 unsigned int value;
1257 if (!PyArg_ParseTuple(args, "I", &value))
1258 return NULL;
1259 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001260}
1261
1262static PyObject *
1263getargs_k(PyObject *self, PyObject *args)
1264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 unsigned long value;
1266 if (!PyArg_ParseTuple(args, "k", &value))
1267 return NULL;
1268 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001269}
1270
1271static PyObject *
1272getargs_i(PyObject *self, PyObject *args)
1273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 int value;
1275 if (!PyArg_ParseTuple(args, "i", &value))
1276 return NULL;
1277 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001278}
1279
Thomas Hellera4ea6032003-04-17 18:55:45 +00001280static PyObject *
1281getargs_l(PyObject *self, PyObject *args)
1282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 long value;
1284 if (!PyArg_ParseTuple(args, "l", &value))
1285 return NULL;
1286 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001287}
1288
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001289static PyObject *
1290getargs_n(PyObject *self, PyObject *args)
1291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 Py_ssize_t value;
1293 if (!PyArg_ParseTuple(args, "n", &value))
1294 return NULL;
1295 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001296}
1297
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001298static PyObject *
1299getargs_p(PyObject *self, PyObject *args)
1300{
1301 int value;
1302 if (!PyArg_ParseTuple(args, "p", &value))
1303 return NULL;
1304 return PyLong_FromLong(value);
1305}
1306
Thomas Hellera4ea6032003-04-17 18:55:45 +00001307static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001308getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001309{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001310 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 if (!PyArg_ParseTuple(args, "L", &value))
1312 return NULL;
1313 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001314}
1315
Thomas Hellera4ea6032003-04-17 18:55:45 +00001316static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001317getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001318{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001319 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 if (!PyArg_ParseTuple(args, "K", &value))
1321 return NULL;
1322 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001323}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001324
1325/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001326 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001327static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301328test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 PyObject *tuple, *num;
1331 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 tuple = PyTuple_New(1);
1334 if (tuple == NULL)
1335 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 /* a number larger than ULONG_MAX even on 64-bit platforms */
1338 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1339 if (num == NULL)
1340 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 value = PyLong_AsUnsignedLongMask(num);
1343 if (value != ULONG_MAX)
1344 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001345 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001350 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (value != ULONG_MAX)
1354 return raiseTestError("test_k_code",
1355 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Py_DECREF(num);
1358 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1359 if (num == NULL)
1360 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 value = PyLong_AsUnsignedLongMask(num);
1363 if (value != (unsigned long)-0x42)
1364 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001365 "PyLong_AsUnsignedLongMask() returned wrong "
1366 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001371 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 if (value != (unsigned long)-0x42)
1375 return raiseTestError("test_k_code",
1376 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001379 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001380}
1381
Victor Stinner06e49dd2010-06-13 18:21:50 +00001382static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001383getargs_f(PyObject *self, PyObject *args)
1384{
1385 float f;
1386 if (!PyArg_ParseTuple(args, "f", &f))
1387 return NULL;
1388 return PyFloat_FromDouble(f);
1389}
1390
1391static PyObject *
1392getargs_d(PyObject *self, PyObject *args)
1393{
1394 double d;
1395 if (!PyArg_ParseTuple(args, "d", &d))
1396 return NULL;
1397 return PyFloat_FromDouble(d);
1398}
1399
1400static PyObject *
1401getargs_D(PyObject *self, PyObject *args)
1402{
1403 Py_complex cval;
1404 if (!PyArg_ParseTuple(args, "D", &cval))
1405 return NULL;
1406 return PyComplex_FromCComplex(cval);
1407}
1408
1409static PyObject *
1410getargs_S(PyObject *self, PyObject *args)
1411{
1412 PyObject *obj;
1413 if (!PyArg_ParseTuple(args, "S", &obj))
1414 return NULL;
1415 Py_INCREF(obj);
1416 return obj;
1417}
1418
1419static PyObject *
1420getargs_Y(PyObject *self, PyObject *args)
1421{
1422 PyObject *obj;
1423 if (!PyArg_ParseTuple(args, "Y", &obj))
1424 return NULL;
1425 Py_INCREF(obj);
1426 return obj;
1427}
1428
1429static PyObject *
1430getargs_U(PyObject *self, PyObject *args)
1431{
1432 PyObject *obj;
1433 if (!PyArg_ParseTuple(args, "U", &obj))
1434 return NULL;
1435 Py_INCREF(obj);
1436 return obj;
1437}
1438
1439static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001440getargs_c(PyObject *self, PyObject *args)
1441{
1442 char c;
1443 if (!PyArg_ParseTuple(args, "c", &c))
1444 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001445 return PyLong_FromLong((unsigned char)c);
1446}
1447
1448static PyObject *
1449getargs_C(PyObject *self, PyObject *args)
1450{
1451 int c;
1452 if (!PyArg_ParseTuple(args, "C", &c))
1453 return NULL;
1454 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001455}
1456
1457static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001458getargs_s(PyObject *self, PyObject *args)
1459{
1460 char *str;
1461 if (!PyArg_ParseTuple(args, "s", &str))
1462 return NULL;
1463 return PyBytes_FromString(str);
1464}
1465
1466static PyObject *
1467getargs_s_star(PyObject *self, PyObject *args)
1468{
1469 Py_buffer buffer;
1470 PyObject *bytes;
1471 if (!PyArg_ParseTuple(args, "s*", &buffer))
1472 return NULL;
1473 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1474 PyBuffer_Release(&buffer);
1475 return bytes;
1476}
1477
1478static PyObject *
1479getargs_s_hash(PyObject *self, PyObject *args)
1480{
1481 char *str;
1482 Py_ssize_t size;
1483 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1484 return NULL;
1485 return PyBytes_FromStringAndSize(str, size);
1486}
1487
1488static PyObject *
1489getargs_z(PyObject *self, PyObject *args)
1490{
1491 char *str;
1492 if (!PyArg_ParseTuple(args, "z", &str))
1493 return NULL;
1494 if (str != NULL)
1495 return PyBytes_FromString(str);
1496 else
1497 Py_RETURN_NONE;
1498}
1499
1500static PyObject *
1501getargs_z_star(PyObject *self, PyObject *args)
1502{
1503 Py_buffer buffer;
1504 PyObject *bytes;
1505 if (!PyArg_ParseTuple(args, "z*", &buffer))
1506 return NULL;
1507 if (buffer.buf != NULL)
1508 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1509 else {
1510 Py_INCREF(Py_None);
1511 bytes = Py_None;
1512 }
1513 PyBuffer_Release(&buffer);
1514 return bytes;
1515}
1516
1517static PyObject *
1518getargs_z_hash(PyObject *self, PyObject *args)
1519{
1520 char *str;
1521 Py_ssize_t size;
1522 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1523 return NULL;
1524 if (str != NULL)
1525 return PyBytes_FromStringAndSize(str, size);
1526 else
1527 Py_RETURN_NONE;
1528}
1529
1530static PyObject *
1531getargs_y(PyObject *self, PyObject *args)
1532{
1533 char *str;
1534 if (!PyArg_ParseTuple(args, "y", &str))
1535 return NULL;
1536 return PyBytes_FromString(str);
1537}
1538
1539static PyObject *
1540getargs_y_star(PyObject *self, PyObject *args)
1541{
1542 Py_buffer buffer;
1543 PyObject *bytes;
1544 if (!PyArg_ParseTuple(args, "y*", &buffer))
1545 return NULL;
1546 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1547 PyBuffer_Release(&buffer);
1548 return bytes;
1549}
1550
1551static PyObject *
1552getargs_y_hash(PyObject *self, PyObject *args)
1553{
1554 char *str;
1555 Py_ssize_t size;
1556 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1557 return NULL;
1558 return PyBytes_FromStringAndSize(str, size);
1559}
1560
1561static PyObject *
1562getargs_u(PyObject *self, PyObject *args)
1563{
1564 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001565 if (!PyArg_ParseTuple(args, "u", &str))
1566 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001567 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001568}
1569
1570static PyObject *
1571getargs_u_hash(PyObject *self, PyObject *args)
1572{
1573 Py_UNICODE *str;
1574 Py_ssize_t size;
1575 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1576 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001577 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001578}
1579
1580static PyObject *
1581getargs_Z(PyObject *self, PyObject *args)
1582{
1583 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001584 if (!PyArg_ParseTuple(args, "Z", &str))
1585 return NULL;
1586 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001587 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001588 } else
1589 Py_RETURN_NONE;
1590}
1591
1592static PyObject *
1593getargs_Z_hash(PyObject *self, PyObject *args)
1594{
1595 Py_UNICODE *str;
1596 Py_ssize_t size;
1597 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1598 return NULL;
1599 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001600 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001601 else
1602 Py_RETURN_NONE;
1603}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001604
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001605static PyObject *
1606getargs_es(PyObject *self, PyObject *args)
1607{
1608 PyObject *arg, *result;
1609 const char *encoding = NULL;
1610 char *str;
1611
1612 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1613 return NULL;
1614 if (!PyArg_Parse(arg, "es", encoding, &str))
1615 return NULL;
1616 result = PyBytes_FromString(str);
1617 PyMem_Free(str);
1618 return result;
1619}
1620
1621static PyObject *
1622getargs_et(PyObject *self, PyObject *args)
1623{
1624 PyObject *arg, *result;
1625 const char *encoding = NULL;
1626 char *str;
1627
1628 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1629 return NULL;
1630 if (!PyArg_Parse(arg, "et", encoding, &str))
1631 return NULL;
1632 result = PyBytes_FromString(str);
1633 PyMem_Free(str);
1634 return result;
1635}
1636
1637static PyObject *
1638getargs_es_hash(PyObject *self, PyObject *args)
1639{
1640 PyObject *arg, *result;
1641 const char *encoding = NULL;
1642 PyByteArrayObject *buffer = NULL;
1643 char *str = NULL;
1644 Py_ssize_t size;
1645
1646 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1647 return NULL;
1648 if (buffer != NULL) {
1649 str = PyByteArray_AS_STRING(buffer);
1650 size = PyByteArray_GET_SIZE(buffer);
1651 }
1652 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1653 return NULL;
1654 result = PyBytes_FromStringAndSize(str, size);
1655 if (buffer == NULL)
1656 PyMem_Free(str);
1657 return result;
1658}
1659
1660static PyObject *
1661getargs_et_hash(PyObject *self, PyObject *args)
1662{
1663 PyObject *arg, *result;
1664 const char *encoding = NULL;
1665 PyByteArrayObject *buffer = NULL;
1666 char *str = NULL;
1667 Py_ssize_t size;
1668
1669 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1670 return NULL;
1671 if (buffer != NULL) {
1672 str = PyByteArray_AS_STRING(buffer);
1673 size = PyByteArray_GET_SIZE(buffer);
1674 }
1675 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1676 return NULL;
1677 result = PyBytes_FromStringAndSize(str, size);
1678 if (buffer == NULL)
1679 PyMem_Free(str);
1680 return result;
1681}
1682
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001683/* Test the s and z codes for PyArg_ParseTuple.
1684*/
1685static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301686test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001687{
1688 /* Unicode strings should be accepted */
1689 PyObject *tuple, *obj;
1690 char *value;
1691
1692 tuple = PyTuple_New(1);
1693 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001695
1696 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001698 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001700
1701 PyTuple_SET_ITEM(tuple, 0, obj);
1702
1703 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001705 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001706 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1707 return NULL;
1708 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001709
Oren Milmanba7d7362017-08-29 11:58:27 +03001710 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1711 return NULL;
1712 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001713
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001714 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001715 Py_RETURN_NONE;
1716}
1717
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001718static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001719parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001720{
Larry Hastings8f904da2012-06-22 03:56:29 -07001721 PyObject *sub_args;
1722 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001723 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001724 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001725
Larry Hastings8f904da2012-06-22 03:56:29 -07001726 Py_ssize_t i, size;
1727 char *keywords[8 + 1]; /* space for NULL at end */
1728 PyObject *o;
1729 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001730
Larry Hastings8f904da2012-06-22 03:56:29 -07001731 int result;
1732 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001733
Larry Hastings22701e82012-08-08 14:52:22 -07001734 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001735
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001736 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001737 &sub_args, &sub_kwargs,
1738 &sub_format, &sub_keywords))
1739 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001740
Larry Hastings8f904da2012-06-22 03:56:29 -07001741 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1742 PyErr_SetString(PyExc_ValueError,
1743 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1744 return NULL;
1745 }
1746
1747 memset(buffers, 0, sizeof(buffers));
1748 memset(converted, 0, sizeof(converted));
1749 memset(keywords, 0, sizeof(keywords));
1750
1751 size = PySequence_Fast_GET_SIZE(sub_keywords);
1752 if (size > 8) {
1753 PyErr_SetString(PyExc_ValueError,
1754 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1755 goto exit;
1756 }
1757
1758 for (i = 0; i < size; i++) {
1759 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1760 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1761 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001762 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001763 goto exit;
1764 }
1765 keywords[i] = PyBytes_AS_STRING(converted[i]);
1766 }
1767
1768 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1769 sub_format, keywords,
1770 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1771 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1772
1773 if (result) {
1774 return_value = Py_None;
1775 Py_INCREF(Py_None);
1776 }
1777
1778exit:
1779 size = sizeof(converted) / sizeof(converted[0]);
1780 for (i = 0; i < size; i++) {
1781 Py_XDECREF(converted[i]);
1782 }
1783 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001784}
1785
Benjamin Peterson92035012008-12-27 16:00:54 +00001786static volatile int x;
1787
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001788#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001789/* Ignore use of deprecated APIs */
1790_Py_COMP_DIAG_PUSH
1791_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1792
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001793/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1794 of an error.
1795*/
1796static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301797test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 PyObject *tuple, *obj;
1800 Py_UNICODE *value;
1801 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1804 /* Just use the macro and check that it compiles */
1805 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 tuple = PyTuple_New(1);
1808 if (tuple == NULL)
1809 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 obj = PyUnicode_Decode("test", strlen("test"),
1812 "ascii", NULL);
1813 if (obj == NULL)
1814 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001819 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001821 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (value != PyUnicode_AS_UNICODE(obj))
1823 return raiseTestError("test_u_code",
1824 "u code returned wrong value for u'test'");
1825 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001826 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 if (value != PyUnicode_AS_UNICODE(obj) ||
1830 len != PyUnicode_GET_SIZE(obj))
1831 return raiseTestError("test_u_code",
1832 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001835 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001836}
1837
Guido van Rossumfb67be22007-08-29 18:38:11 +00001838/* Test Z and Z# codes for PyArg_ParseTuple */
1839static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301840test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001843 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 tuple = PyTuple_New(2);
1847 if (tuple == NULL)
1848 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 obj = PyUnicode_FromString("test");
1851 PyTuple_SET_ITEM(tuple, 0, obj);
1852 Py_INCREF(Py_None);
1853 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 /* swap values on purpose */
1856 value1 = NULL;
1857 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001860 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001862 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 if (value1 != PyUnicode_AS_UNICODE(obj))
1864 return raiseTestError("test_Z_code",
1865 "Z code returned wrong value for 'test'");
1866 if (value2 != NULL)
1867 return raiseTestError("test_Z_code",
1868 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 value1 = NULL;
1871 value2 = PyUnicode_AS_UNICODE(obj);
1872 len1 = -1;
1873 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001876 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1877 &value2, &len2))
1878 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001880 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1882 len1 != PyUnicode_GET_SIZE(obj))
1883 return raiseTestError("test_Z_code",
1884 "Z# code returned wrong values for 'test'");
1885 if (value2 != NULL ||
1886 len2 != 0)
1887 return raiseTestError("test_Z_code",
1888 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 Py_DECREF(tuple);
1891 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001892}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001893_Py_COMP_DIAG_POP
1894#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001895
Thomas Wouters477c8d52006-05-27 19:21:47 +00001896static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301897test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001898{
1899#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1901 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001902 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1905 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1910 if (wide == NULL)
1911 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1914 if (utf8 == NULL) {
1915 Py_DECREF(wide);
1916 return NULL;
1917 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001918
Victor Stinner8ef18872011-11-21 02:06:57 +01001919 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 Py_DECREF(wide);
1921 Py_DECREF(utf8);
1922 return raiseTestError("test_widechar",
1923 "wide string and utf8 string "
1924 "have different length");
1925 }
1926 if (PyUnicode_Compare(wide, utf8)) {
1927 Py_DECREF(wide);
1928 Py_DECREF(utf8);
1929 if (PyErr_Occurred())
1930 return NULL;
1931 return raiseTestError("test_widechar",
1932 "wide string and utf8 string "
1933 "are different");
1934 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 Py_DECREF(wide);
1937 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001938
1939#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1940 wide = PyUnicode_FromWideChar(invalid, 1);
1941 if (wide == NULL)
1942 PyErr_Clear();
1943 else
1944 return raiseTestError("test_widechar",
1945 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1946
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001947#if USE_UNICODE_WCHAR_CACHE
1948/* Ignore use of deprecated APIs */
1949_Py_COMP_DIAG_PUSH
1950_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001951 wide = PyUnicode_FromUnicode(invalid, 1);
1952 if (wide == NULL)
1953 PyErr_Clear();
1954 else
1955 return raiseTestError("test_widechar",
1956 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001957
1958 wide = PyUnicode_FromUnicode(NULL, 1);
1959 if (wide == NULL)
1960 return NULL;
1961 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001962 if (_PyUnicode_Ready(wide) < 0) {
1963 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001964 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001965 }
1966 else {
1967 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001968 return raiseTestError("test_widechar",
1969 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001970 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001971_Py_COMP_DIAG_POP
1972#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001973#endif
1974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001976}
1977
1978static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001979unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001980{
1981 PyObject *unicode, *result;
1982 Py_ssize_t buflen, size;
1983 wchar_t *buffer;
1984
1985 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1986 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001987 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001988 if (buffer == NULL)
1989 return PyErr_NoMemory();
1990
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001991 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001992 if (size == -1) {
1993 PyMem_Free(buffer);
1994 return NULL;
1995 }
1996
1997 if (size < buflen)
1998 buflen = size + 1;
1999 else
2000 buflen = size;
2001 result = PyUnicode_FromWideChar(buffer, buflen);
2002 PyMem_Free(buffer);
2003 if (result == NULL)
2004 return NULL;
2005
2006 return Py_BuildValue("(Nn)", result, size);
2007}
2008
2009static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00002010unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00002011{
2012 PyObject *unicode, *result;
2013 Py_ssize_t size;
2014 wchar_t *buffer;
2015
2016 if (!PyArg_ParseTuple(args, "U", &unicode))
2017 return NULL;
2018
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00002019 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00002020 if (buffer == NULL)
2021 return NULL;
2022
2023 result = PyUnicode_FromWideChar(buffer, size + 1);
2024 PyMem_Free(buffer);
2025 if (result == NULL)
2026 return NULL;
2027 return Py_BuildValue("(Nn)", result, size);
2028}
2029
2030static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03002031unicode_asucs4(PyObject *self, PyObject *args)
2032{
2033 PyObject *unicode, *result;
2034 Py_UCS4 *buffer;
2035 int copy_null;
2036 Py_ssize_t str_len, buf_len;
2037
2038 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
2039 return NULL;
2040 }
2041
2042 buf_len = str_len + 1;
2043 buffer = PyMem_NEW(Py_UCS4, buf_len);
2044 if (buffer == NULL) {
2045 return PyErr_NoMemory();
2046 }
2047 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
2048 buffer[str_len] = 0xffffU;
2049
2050 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
Victor Stinner00d7abd2020-12-01 09:56:42 +01002051 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002052 return NULL;
2053 }
2054
2055 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
Victor Stinner00d7abd2020-12-01 09:56:42 +01002056 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002057 return result;
2058}
2059
2060static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05002061unicode_asutf8(PyObject *self, PyObject *args)
2062{
2063 PyObject *unicode;
2064 const char *buffer;
2065
2066 if (!PyArg_ParseTuple(args, "U", &unicode)) {
2067 return NULL;
2068 }
2069
2070 buffer = PyUnicode_AsUTF8(unicode);
2071 if (buffer == NULL) {
2072 return NULL;
2073 }
2074
2075 return PyBytes_FromString(buffer);
2076}
2077
2078static PyObject *
2079unicode_asutf8andsize(PyObject *self, PyObject *args)
2080{
2081 PyObject *unicode, *result;
2082 const char *buffer;
2083 Py_ssize_t utf8_len;
2084
2085 if(!PyArg_ParseTuple(args, "U", &unicode)) {
2086 return NULL;
2087 }
2088
Victor Stinneraca8c402019-09-30 21:14:26 +02002089 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05002090 if (buffer == NULL) {
2091 return NULL;
2092 }
2093
2094 result = PyBytes_FromString(buffer);
2095 if (result == NULL) {
2096 return NULL;
2097 }
2098
2099 return Py_BuildValue("(Nn)", result, utf8_len);
2100}
2101
2102static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08002103unicode_findchar(PyObject *self, PyObject *args)
2104{
2105 PyObject *str;
2106 int direction;
2107 unsigned int ch;
2108 Py_ssize_t result;
2109 Py_ssize_t start, end;
2110
2111 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2112 &start, &end, &direction)) {
2113 return NULL;
2114 }
2115
2116 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2117 if (result == -2)
2118 return NULL;
2119 else
2120 return PyLong_FromSsize_t(result);
2121}
2122
2123static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002124unicode_copycharacters(PyObject *self, PyObject *args)
2125{
2126 PyObject *from, *to, *to_copy;
2127 Py_ssize_t from_start, to_start, how_many, copied;
2128
2129 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2130 &from, &from_start, &how_many)) {
2131 return NULL;
2132 }
2133
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002134 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2135 PyUnicode_MAX_CHAR_VALUE(to)))) {
2136 return NULL;
2137 }
2138 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2139 Py_DECREF(to_copy);
2140 return NULL;
2141 }
2142
2143 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2144 from_start, how_many)) < 0) {
2145 Py_DECREF(to_copy);
2146 return NULL;
2147 }
2148
2149 return Py_BuildValue("(Nn)", to_copy, copied);
2150}
2151
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002152#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002153/* Ignore use of deprecated APIs */
2154_Py_COMP_DIAG_PUSH
2155_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2156
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002157static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002158unicode_encodedecimal(PyObject *self, PyObject *args)
2159{
2160 Py_UNICODE *unicode;
2161 Py_ssize_t length;
2162 char *errors = NULL;
2163 PyObject *decimal;
2164 Py_ssize_t decimal_length, new_length;
2165 int res;
2166
2167 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2168 return NULL;
2169
2170 decimal_length = length * 7; /* len('&#8364;') */
2171 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2172 if (decimal == NULL)
2173 return NULL;
2174
2175 res = PyUnicode_EncodeDecimal(unicode, length,
2176 PyBytes_AS_STRING(decimal),
2177 errors);
2178 if (res < 0) {
2179 Py_DECREF(decimal);
2180 return NULL;
2181 }
2182
2183 new_length = strlen(PyBytes_AS_STRING(decimal));
2184 assert(new_length <= decimal_length);
2185 res = _PyBytes_Resize(&decimal, new_length);
2186 if (res < 0)
2187 return NULL;
2188
2189 return decimal;
2190}
2191
2192static PyObject *
2193unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2194{
2195 Py_UNICODE *unicode;
2196 Py_ssize_t length;
2197 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2198 return NULL;
2199 return PyUnicode_TransformDecimalToASCII(unicode, length);
2200}
2201
2202static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002203unicode_legacy_string(PyObject *self, PyObject *args)
2204{
2205 Py_UNICODE *data;
2206 Py_ssize_t len;
2207 PyObject *u;
2208
2209 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2210 return NULL;
2211
2212 u = PyUnicode_FromUnicode(NULL, len);
2213 if (u == NULL)
2214 return NULL;
2215
2216 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2217
2218 if (len > 0) { /* The empty string is always ready. */
2219 assert(!PyUnicode_IS_READY(u));
2220 }
2221
2222 return u;
2223}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002224_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002225#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002226
2227static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002228getargs_w_star(PyObject *self, PyObject *args)
2229{
2230 Py_buffer buffer;
2231 PyObject *result;
2232 char *str;
2233
2234 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2235 return NULL;
2236
2237 if (2 <= buffer.len) {
2238 str = buffer.buf;
2239 str[0] = '[';
2240 str[buffer.len-1] = ']';
2241 }
2242
2243 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2244 PyBuffer_Release(&buffer);
2245 return result;
2246}
2247
2248
2249static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302250test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 /* Test that formats can begin with '|'. See issue #4720. */
2253 PyObject *tuple, *dict = NULL;
2254 static char *kwlist[] = {NULL};
2255 int result;
2256 tuple = PyTuple_New(0);
2257 if (!tuple)
2258 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002259 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 dict = PyDict_New();
2263 if (!dict)
2264 goto done;
2265 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002266 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 Py_DECREF(tuple);
2268 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002269 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 else {
2273 Py_RETURN_NONE;
2274 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002275}
2276
2277static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 const char *encoding, *errors = NULL;
2281 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2282 &encoding, &errors))
2283 return NULL;
2284 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002285}
2286
Thomas Wouters477c8d52006-05-27 19:21:47 +00002287static PyObject *
2288codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 const char *encoding, *errors = NULL;
2291 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2292 &encoding, &errors))
2293 return NULL;
2294 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002295}
2296
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002297
Tim Peters5b8132f2003-01-31 15:52:05 +00002298/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002299static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302300test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 struct triple {
2303 long input;
2304 size_t nbits;
2305 int sign;
2306 } testcases[] = {{0, 0, 0},
2307 {1L, 1, 1},
2308 {-1L, 1, -1},
2309 {2L, 2, 1},
2310 {-2L, 2, -1},
2311 {3L, 2, 1},
2312 {-3L, 2, -1},
2313 {4L, 3, 1},
2314 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002315 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 {-0x7fffL, 15, -1},
2317 {0xffffL, 16, 1},
2318 {-0xffffL, 16, -1},
2319 {0xfffffffL, 28, 1},
2320 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002321 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002322
Victor Stinner63941882011-09-29 00:42:28 +02002323 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002324 size_t nbits;
2325 int sign;
2326 PyObject *plong;
2327
2328 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002329 if (plong == NULL)
2330 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002331 nbits = _PyLong_NumBits(plong);
2332 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 Py_DECREF(plong);
2335 if (nbits != testcases[i].nbits)
2336 return raiseTestError("test_long_numbits",
2337 "wrong result for _PyLong_NumBits");
2338 if (sign != testcases[i].sign)
2339 return raiseTestError("test_long_numbits",
2340 "wrong result for _PyLong_Sign");
2341 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002342 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002343}
2344
Thomas Heller519a0422007-11-15 20:48:54 +00002345/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002346
2347static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302348test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2351 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2352 Py_XDECREF(o1);
2353 Py_XDECREF(o2);
2354 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002355}
2356
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002357static PyObject *
2358raise_exception(PyObject *self, PyObject *args)
2359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 PyObject *exc;
2361 PyObject *exc_args, *v;
2362 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2365 &exc, &num_args))
2366 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 exc_args = PyTuple_New(num_args);
2369 if (exc_args == NULL)
2370 return NULL;
2371 for (i = 0; i < num_args; ++i) {
2372 v = PyLong_FromLong(i);
2373 if (v == NULL) {
2374 Py_DECREF(exc_args);
2375 return NULL;
2376 }
2377 PyTuple_SET_ITEM(exc_args, i, v);
2378 }
2379 PyErr_SetObject(exc, exc_args);
2380 Py_DECREF(exc_args);
2381 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002382}
Tim Peters91621db2001-06-12 20:10:01 +00002383
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002384static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002385set_errno(PyObject *self, PyObject *args)
2386{
2387 int new_errno;
2388
2389 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2390 return NULL;
2391
2392 errno = new_errno;
2393 Py_RETURN_NONE;
2394}
2395
2396static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002397test_set_exc_info(PyObject *self, PyObject *args)
2398{
2399 PyObject *orig_exc;
2400 PyObject *new_type, *new_value, *new_tb;
2401 PyObject *type, *value, *tb;
2402 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2403 &new_type, &new_value, &new_tb))
2404 return NULL;
2405
2406 PyErr_GetExcInfo(&type, &value, &tb);
2407
2408 Py_INCREF(new_type);
2409 Py_INCREF(new_value);
2410 Py_INCREF(new_tb);
2411 PyErr_SetExcInfo(new_type, new_value, new_tb);
2412
2413 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2414 Py_XDECREF(type);
2415 Py_XDECREF(value);
2416 Py_XDECREF(tb);
2417 return orig_exc;
2418}
Benjamin Peterson16323982010-02-03 01:13:41 +00002419
2420static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002421
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002422static PyObject *
2423test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 if (PyDateTimeAPI) {
2425 if (test_run_counter) {
2426 /* Probably regrtest.py -R */
2427 Py_RETURN_NONE;
2428 }
2429 else {
2430 PyErr_SetString(PyExc_AssertionError,
2431 "PyDateTime_CAPI somehow initialized");
2432 return NULL;
2433 }
2434 }
2435 test_run_counter++;
2436 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 if (PyDateTimeAPI)
2439 Py_RETURN_NONE;
2440 else
2441 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002442}
2443
Paul Ganssle04af5b12018-01-24 17:29:30 -05002444/* Functions exposing the C API type checking for testing */
2445#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2446 PyObject *obj; \
2447 int exact = 0; \
2448 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2449 return NULL; \
2450 } \
2451 int rv = exact?exact_method(obj):check_method(obj); \
2452 if (rv) { \
2453 Py_RETURN_TRUE; \
2454 } else { \
2455 Py_RETURN_FALSE; \
2456 }
2457
2458static PyObject *
2459datetime_check_date(PyObject *self, PyObject *args) {
2460 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2461}
2462
2463static PyObject *
2464datetime_check_time(PyObject *self, PyObject *args) {
2465 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2466}
2467
2468static PyObject *
2469datetime_check_datetime(PyObject *self, PyObject *args) {
2470 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2471}
2472
2473static PyObject *
2474datetime_check_delta(PyObject *self, PyObject *args) {
2475 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2476}
2477
2478static PyObject *
2479datetime_check_tzinfo(PyObject *self, PyObject *args) {
2480 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2481}
2482
2483
2484/* Makes three variations on timezone representing UTC-5:
2485 1. timezone with offset and name from PyDateTimeAPI
2486 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2487 3. timezone with offset (no name) from PyTimeZone_FromOffset
2488*/
2489static PyObject *
2490make_timezones_capi(PyObject *self, PyObject *args) {
2491 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2492 PyObject *name = PyUnicode_FromString("EST");
2493
2494 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2495 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2496 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2497
2498 Py_DecRef(offset);
2499 Py_DecRef(name);
2500
2501 PyObject *rv = PyTuple_New(3);
2502
2503 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2504 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2505 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2506
2507 return rv;
2508}
2509
2510static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002511get_timezones_offset_zero(PyObject *self, PyObject *args) {
2512 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2513 PyObject *name = PyUnicode_FromString("");
2514
2515 // These two should return the UTC singleton
2516 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2517 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2518
2519 // This one will return +00:00 zone, but not the UTC singleton
2520 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2521
2522 Py_DecRef(offset);
2523 Py_DecRef(name);
2524
2525 PyObject *rv = PyTuple_New(3);
2526 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2527 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2528 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2529
2530 return rv;
2531}
2532
2533static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002534get_timezone_utc_capi(PyObject* self, PyObject *args) {
2535 int macro = 0;
2536 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2537 return NULL;
2538 }
2539 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002540 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002541 return PyDateTime_TimeZone_UTC;
2542 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002543 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002544 return PyDateTimeAPI->TimeZone_UTC;
2545 }
2546}
2547
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002548static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002549get_date_fromdate(PyObject *self, PyObject *args)
2550{
2551 PyObject *rv = NULL;
2552 int macro;
2553 int year, month, day;
2554
2555 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2556 return NULL;
2557 }
2558
2559 if (macro) {
2560 rv = PyDate_FromDate(year, month, day);
2561 }
2562 else {
2563 rv = PyDateTimeAPI->Date_FromDate(
2564 year, month, day,
2565 PyDateTimeAPI->DateType);
2566 }
2567 return rv;
2568}
2569
2570static PyObject *
2571get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2572{
2573 PyObject *rv = NULL;
2574 int macro;
2575 int year, month, day;
2576 int hour, minute, second, microsecond;
2577
2578 if (!PyArg_ParseTuple(args, "piiiiiii",
2579 &macro,
2580 &year, &month, &day,
2581 &hour, &minute, &second, &microsecond)) {
2582 return NULL;
2583 }
2584
2585 if (macro) {
2586 rv = PyDateTime_FromDateAndTime(
2587 year, month, day,
2588 hour, minute, second, microsecond);
2589 }
2590 else {
2591 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2592 year, month, day,
2593 hour, minute, second, microsecond,
2594 Py_None,
2595 PyDateTimeAPI->DateTimeType);
2596 }
2597 return rv;
2598}
2599
2600static PyObject *
2601get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2602{
2603 PyObject *rv = NULL;
2604 int macro;
2605 int year, month, day;
2606 int hour, minute, second, microsecond, fold;
2607
2608 if (!PyArg_ParseTuple(args, "piiiiiiii",
2609 &macro,
2610 &year, &month, &day,
2611 &hour, &minute, &second, &microsecond,
2612 &fold)) {
2613 return NULL;
2614 }
2615
2616 if (macro) {
2617 rv = PyDateTime_FromDateAndTimeAndFold(
2618 year, month, day,
2619 hour, minute, second, microsecond,
2620 fold);
2621 }
2622 else {
2623 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2624 year, month, day,
2625 hour, minute, second, microsecond,
2626 Py_None,
2627 fold,
2628 PyDateTimeAPI->DateTimeType);
2629 }
2630 return rv;
2631}
2632
2633static PyObject *
2634get_time_fromtime(PyObject *self, PyObject *args)
2635{
2636 PyObject *rv = NULL;
2637 int macro;
2638 int hour, minute, second, microsecond;
2639
2640 if (!PyArg_ParseTuple(args, "piiii",
2641 &macro,
2642 &hour, &minute, &second, &microsecond)) {
2643 return NULL;
2644 }
2645
2646 if (macro) {
2647 rv = PyTime_FromTime(hour, minute, second, microsecond);
2648 }
2649 else {
2650 rv = PyDateTimeAPI->Time_FromTime(
2651 hour, minute, second, microsecond,
2652 Py_None,
2653 PyDateTimeAPI->TimeType);
2654 }
2655 return rv;
2656}
2657
2658static PyObject *
2659get_time_fromtimeandfold(PyObject *self, PyObject *args)
2660{
2661 PyObject *rv = NULL;
2662 int macro;
2663 int hour, minute, second, microsecond, fold;
2664
2665 if (!PyArg_ParseTuple(args, "piiiii",
2666 &macro,
2667 &hour, &minute, &second, &microsecond,
2668 &fold)) {
2669 return NULL;
2670 }
2671
2672 if (macro) {
2673 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2674 }
2675 else {
2676 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2677 hour, minute, second, microsecond,
2678 Py_None,
2679 fold,
2680 PyDateTimeAPI->TimeType);
2681 }
2682 return rv;
2683}
2684
2685static PyObject *
2686get_delta_fromdsu(PyObject *self, PyObject *args)
2687{
2688 PyObject *rv = NULL;
2689 int macro;
2690 int days, seconds, microseconds;
2691
2692 if (!PyArg_ParseTuple(args, "piii",
2693 &macro,
2694 &days, &seconds, &microseconds)) {
2695 return NULL;
2696 }
2697
2698 if (macro) {
2699 rv = PyDelta_FromDSU(days, seconds, microseconds);
2700 }
2701 else {
2702 rv = PyDateTimeAPI->Delta_FromDelta(
2703 days, seconds, microseconds, 1,
2704 PyDateTimeAPI->DeltaType);
2705 }
2706
2707 return rv;
2708}
2709
2710static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002711get_date_fromtimestamp(PyObject* self, PyObject *args)
2712{
2713 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2714 int macro = 0;
2715
2716 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2717 return NULL;
2718 }
2719
2720 // Construct the argument tuple
2721 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2722 return NULL;
2723 }
2724
2725 // Pass along to the API function
2726 if (macro) {
2727 rv = PyDate_FromTimestamp(tsargs);
2728 }
2729 else {
2730 rv = PyDateTimeAPI->Date_FromTimestamp(
2731 (PyObject *)PyDateTimeAPI->DateType, tsargs
2732 );
2733 }
2734
2735 Py_DECREF(tsargs);
2736 return rv;
2737}
2738
2739static PyObject *
2740get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2741{
2742 int macro = 0;
2743 int usetz = 0;
2744 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2745 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2746 return NULL;
2747 }
2748
2749 // Construct the argument tuple
2750 if (usetz) {
2751 tsargs = PyTuple_Pack(2, ts, tzinfo);
2752 }
2753 else {
2754 tsargs = PyTuple_Pack(1, ts);
2755 }
2756
2757 if (tsargs == NULL) {
2758 return NULL;
2759 }
2760
2761 // Pass along to the API function
2762 if (macro) {
2763 rv = PyDateTime_FromTimestamp(tsargs);
2764 }
2765 else {
2766 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2767 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2768 );
2769 }
2770
2771 Py_DECREF(tsargs);
2772 return rv;
2773}
2774
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002775static PyObject *
2776test_PyDateTime_GET(PyObject *self, PyObject *obj)
2777{
2778 int year, month, day;
2779
2780 year = PyDateTime_GET_YEAR(obj);
2781 month = PyDateTime_GET_MONTH(obj);
2782 day = PyDateTime_GET_DAY(obj);
2783
2784 return Py_BuildValue("(lll)", year, month, day);
2785}
2786
2787static PyObject *
2788test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2789{
2790 int hour, minute, second, microsecond;
2791
2792 hour = PyDateTime_DATE_GET_HOUR(obj);
2793 minute = PyDateTime_DATE_GET_MINUTE(obj);
2794 second = PyDateTime_DATE_GET_SECOND(obj);
2795 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002796 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002797
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002798 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002799}
2800
2801static PyObject *
2802test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2803{
2804 int hour, minute, second, microsecond;
2805
2806 hour = PyDateTime_TIME_GET_HOUR(obj);
2807 minute = PyDateTime_TIME_GET_MINUTE(obj);
2808 second = PyDateTime_TIME_GET_SECOND(obj);
2809 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002810 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002811
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002812 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002813}
2814
2815static PyObject *
2816test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2817{
2818 int days, seconds, microseconds;
2819
2820 days = PyDateTime_DELTA_GET_DAYS(obj);
2821 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2822 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2823
2824 return Py_BuildValue("(lll)", days, seconds, microseconds);
2825}
Benjamin Peterson16323982010-02-03 01:13:41 +00002826
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827/* test_thread_state spawns a thread of its own, and that thread releases
2828 * `thread_done` when it's finished. The driver code has to know when the
2829 * thread finishes, because the thread uses a PyObject (the callable) that
2830 * may go away when the driver finishes. The former lack of this explicit
2831 * synchronization caused rare segfaults, so rare that they were seen only
2832 * on a Mac buildbot (although they were possible on any box).
2833 */
2834static PyThread_type_lock thread_done = NULL;
2835
Benjamin Petersona786b022008-08-25 21:05:21 +00002836static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002837_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 PyObject *rc;
2840 int success;
2841 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002842 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 success = (rc != NULL);
2844 Py_XDECREF(rc);
2845 PyGILState_Release(s);
2846 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002847}
2848
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002849/* Same thing, but releases `thread_done` when it returns. This variant
2850 * should be called only from threads spawned by test_thread_state().
2851 */
2852static void
2853_make_call_from_thread(void *callable)
2854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 _make_call(callable);
2856 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002857}
2858
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002859static PyObject *
2860test_thread_state(PyObject *self, PyObject *args)
2861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 PyObject *fn;
2863 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2866 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if (!PyCallable_Check(fn)) {
2869 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002870 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 return NULL;
2872 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 thread_done = PyThread_allocate_lock();
2875 if (thread_done == NULL)
2876 return PyErr_NoMemory();
2877 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 /* Start a new thread with our callback. */
2880 PyThread_start_new_thread(_make_call_from_thread, fn);
2881 /* Make the callback with the thread lock held by this thread */
2882 success &= _make_call(fn);
2883 /* Do it all again, but this time with the thread-lock released */
2884 Py_BEGIN_ALLOW_THREADS
2885 success &= _make_call(fn);
2886 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2887 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 /* And once more with and without a thread
2890 XXX - should use a lock and work out exactly what we are trying
2891 to test <wink>
2892 */
2893 Py_BEGIN_ALLOW_THREADS
2894 PyThread_start_new_thread(_make_call_from_thread, fn);
2895 success &= _make_call(fn);
2896 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2897 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 /* Release lock we acquired above. This is required on HP-UX. */
2900 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 PyThread_free_lock(thread_done);
2903 if (!success)
2904 return NULL;
2905 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002906}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002907
2908/* test Py_AddPendingCalls using threads */
2909static int _pending_callback(void *arg)
2910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 /* we assume the argument is callable object to which we own a reference */
2912 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002913 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 Py_DECREF(callable);
2915 Py_XDECREF(r);
2916 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002917}
2918
2919/* The following requests n callbacks to _pending_callback. It can be
2920 * run from any python thread.
2921 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002922static PyObject *
2923pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 PyObject *callable;
2926 int r;
2927 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2928 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 /* create the reference for the callbackwhile we hold the lock */
2931 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 Py_BEGIN_ALLOW_THREADS
2934 r = Py_AddPendingCall(&_pending_callback, callable);
2935 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 if (r<0) {
2938 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002939 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002941 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002942}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002943
Neal Norwitzb0d26332007-08-25 00:49:05 +00002944/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002945static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002946test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 PyObject *result;
2949 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002950
Alexander Belopolskye239d232010-12-08 23:31:48 +00002951#define CHECK_1_FORMAT(FORMAT, TYPE) \
2952 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2953 if (result == NULL) \
2954 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002955 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002956 msg = FORMAT " failed at 1"; \
2957 goto Fail; \
2958 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 CHECK_1_FORMAT("%d", int);
2962 CHECK_1_FORMAT("%ld", long);
2963 /* The z width modifier was added in Python 2.5. */
2964 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966 /* The u type code was added in Python 2.5. */
2967 CHECK_1_FORMAT("%u", unsigned int);
2968 CHECK_1_FORMAT("%lu", unsigned long);
2969 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002972 CHECK_1_FORMAT("%llu", unsigned long long);
2973 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002976
2977 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 Py_XDECREF(result);
2979 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002980
2981#undef CHECK_1_FORMAT
2982}
2983
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002984
2985static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302986test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2988 int result;
2989 if (py_s == NULL)
2990 return NULL;
2991 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2992 Py_DECREF(py_s);
2993 if (!result) {
2994 PyErr_SetString(TestError, "Python string ending in NULL "
2995 "should not compare equal to c string.");
2996 return NULL;
2997 }
2998 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002999}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003000
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003001/* This is here to provide a docstring for test_descr. */
3002static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303003test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003006}
3007
Mark Dickinson725bfd82009-05-03 20:33:40 +00003008/* Test PyOS_string_to_double. */
3009static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303010test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003012 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014#define CHECK_STRING(STR, expected) \
3015 result = PyOS_string_to_double(STR, NULL, NULL); \
3016 if (result == -1.0 && PyErr_Occurred()) \
3017 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003018 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 msg = "conversion of " STR " to float failed"; \
3020 goto fail; \
3021 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023#define CHECK_INVALID(STR) \
3024 result = PyOS_string_to_double(STR, NULL, NULL); \
3025 if (result == -1.0 && PyErr_Occurred()) { \
3026 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3027 PyErr_Clear(); \
3028 else \
3029 return NULL; \
3030 } \
3031 else { \
3032 msg = "conversion of " STR " didn't raise ValueError"; \
3033 goto fail; \
3034 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 CHECK_STRING("0.1", 0.1);
3037 CHECK_STRING("1.234", 1.234);
3038 CHECK_STRING("-1.35", -1.35);
3039 CHECK_STRING(".1e01", 1.0);
3040 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 CHECK_INVALID(" 0.1");
3043 CHECK_INVALID("\t\n-3");
3044 CHECK_INVALID(".123 ");
3045 CHECK_INVALID("3\n");
3046 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003049 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003051#undef CHECK_STRING
3052#undef CHECK_INVALID
3053}
3054
3055
Benjamin Petersonb173f782009-05-05 22:31:58 +00003056/* Coverage testing of capsule objects. */
3057
3058static const char *capsule_name = "capsule name";
3059static char *capsule_pointer = "capsule pointer";
3060static char *capsule_context = "capsule context";
3061static const char *capsule_error = NULL;
3062static int
3063capsule_destructor_call_count = 0;
3064
3065static void
3066capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 capsule_destructor_call_count++;
3068 if (PyCapsule_GetContext(o) != capsule_context) {
3069 capsule_error = "context did not match in destructor!";
3070 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3071 capsule_error = "destructor did not match in destructor! (woah!)";
3072 } else if (PyCapsule_GetName(o) != capsule_name) {
3073 capsule_error = "name did not match in destructor!";
3074 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3075 capsule_error = "pointer did not match in destructor!";
3076 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003077}
3078
3079typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 char *name;
3081 char *module;
3082 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003083} known_capsule;
3084
3085static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003086test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 PyObject *object;
3089 const char *error = NULL;
3090 void *pointer;
3091 void *pointer2;
3092 known_capsule known_capsules[] = {
3093 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3094 KNOWN_CAPSULE("_socket", "CAPI"),
3095 KNOWN_CAPSULE("_curses", "_C_API"),
3096 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3097 { NULL, NULL },
3098 };
3099 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003100
3101#define FAIL(x) { error = (x); goto exit; }
3102
3103#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 if (capsule_error) { \
3105 FAIL(capsule_error); \
3106 } \
3107 else if (!capsule_destructor_call_count) { \
3108 FAIL("destructor not called!"); \
3109 } \
3110 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3113 PyCapsule_SetContext(object, capsule_context);
3114 capsule_destructor(object);
3115 CHECK_DESTRUCTOR;
3116 Py_DECREF(object);
3117 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 object = PyCapsule_New(known, "ignored", NULL);
3120 PyCapsule_SetPointer(object, capsule_pointer);
3121 PyCapsule_SetName(object, capsule_name);
3122 PyCapsule_SetDestructor(object, capsule_destructor);
3123 PyCapsule_SetContext(object, capsule_context);
3124 capsule_destructor(object);
3125 CHECK_DESTRUCTOR;
3126 /* intentionally access using the wrong name */
3127 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3128 if (!PyErr_Occurred()) {
3129 FAIL("PyCapsule_GetPointer should have failed but did not!");
3130 }
3131 PyErr_Clear();
3132 if (pointer2) {
3133 if (pointer2 == capsule_pointer) {
3134 FAIL("PyCapsule_GetPointer should not have"
3135 " returned the internal pointer!");
3136 } else {
3137 FAIL("PyCapsule_GetPointer should have "
3138 "returned NULL pointer but did not!");
3139 }
3140 }
3141 PyCapsule_SetDestructor(object, NULL);
3142 Py_DECREF(object);
3143 if (capsule_destructor_call_count) {
3144 FAIL("destructor called when it should not have been!");
3145 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 for (known = &known_capsules[0]; known->module != NULL; known++) {
3148 /* yeah, ordinarily I wouldn't do this either,
3149 but it's fine for this test harness.
3150 */
3151 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003152#undef FAIL
3153#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 { \
3155 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3156 x, known->module, known->attribute); \
3157 error = buffer; \
3158 goto exit; \
3159 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 PyObject *module = PyImport_ImportModule(known->module);
3162 if (module) {
3163 pointer = PyCapsule_Import(known->name, 0);
3164 if (!pointer) {
3165 Py_DECREF(module);
3166 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3167 }
3168 object = PyObject_GetAttrString(module, known->attribute);
3169 if (!object) {
3170 Py_DECREF(module);
3171 return NULL;
3172 }
3173 pointer2 = PyCapsule_GetPointer(object,
3174 "weebles wobble but they don't fall down");
3175 if (!PyErr_Occurred()) {
3176 Py_DECREF(object);
3177 Py_DECREF(module);
3178 FAIL("PyCapsule_GetPointer should have failed but did not!");
3179 }
3180 PyErr_Clear();
3181 if (pointer2) {
3182 Py_DECREF(module);
3183 Py_DECREF(object);
3184 if (pointer2 == pointer) {
3185 FAIL("PyCapsule_GetPointer should not have"
3186 " returned its internal pointer!");
3187 } else {
3188 FAIL("PyCapsule_GetPointer should have"
3189 " returned NULL pointer but did not!");
3190 }
3191 }
3192 Py_DECREF(object);
3193 Py_DECREF(module);
3194 }
3195 else
3196 PyErr_Clear();
3197 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003198
3199 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 if (error) {
3201 return raiseTestError("test_capsule", error);
3202 }
3203 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003204#undef FAIL
3205}
3206
Guido van Rossumddefaf32007-01-14 03:31:43 +00003207#ifdef HAVE_GETTIMEOFDAY
3208/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003209static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 e->tv_sec -= s->tv_sec;
3212 e->tv_usec -= s->tv_usec;
3213 if (e->tv_usec < 0) {
3214 e->tv_sec -=1;
3215 e->tv_usec += 1000000;
3216 }
3217 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003218}
3219
3220static PyObject *
3221profile_int(PyObject *self, PyObject* args)
3222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 int i, k;
3224 struct timeval start, stop;
3225 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 /* Test 1: Allocate and immediately deallocate
3228 many small integers */
3229 gettimeofday(&start, NULL);
3230 for(k=0; k < 20000; k++)
3231 for(i=0; i < 1000; i++) {
3232 single = PyLong_FromLong(i);
3233 Py_DECREF(single);
3234 }
3235 gettimeofday(&stop, NULL);
3236 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 /* Test 2: Allocate and immediately deallocate
3239 many large integers */
3240 gettimeofday(&start, NULL);
3241 for(k=0; k < 20000; k++)
3242 for(i=0; i < 1000; i++) {
3243 single = PyLong_FromLong(i+1000000);
3244 Py_DECREF(single);
3245 }
3246 gettimeofday(&stop, NULL);
3247 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 /* Test 3: Allocate a few integers, then release
3250 them all simultaneously. */
3251 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003252 if (multiple == NULL)
3253 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 gettimeofday(&start, NULL);
3255 for(k=0; k < 20000; k++) {
3256 for(i=0; i < 1000; i++) {
3257 multiple[i] = PyLong_FromLong(i+1000000);
3258 }
3259 for(i=0; i < 1000; i++) {
3260 Py_DECREF(multiple[i]);
3261 }
3262 }
3263 gettimeofday(&stop, NULL);
3264 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003265 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 /* Test 4: Allocate many integers, then release
3268 them all simultaneously. */
3269 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003270 if (multiple == NULL)
3271 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272 gettimeofday(&start, NULL);
3273 for(k=0; k < 20; k++) {
3274 for(i=0; i < 1000000; i++) {
3275 multiple[i] = PyLong_FromLong(i+1000000);
3276 }
3277 for(i=0; i < 1000000; i++) {
3278 Py_DECREF(multiple[i]);
3279 }
3280 }
3281 gettimeofday(&stop, NULL);
3282 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003283 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 /* Test 5: Allocate many integers < 32000 */
3286 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003287 if (multiple == NULL)
3288 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 gettimeofday(&start, NULL);
3290 for(k=0; k < 10; k++) {
3291 for(i=0; i < 1000000; i++) {
3292 multiple[i] = PyLong_FromLong(i+1000);
3293 }
3294 for(i=0; i < 1000000; i++) {
3295 Py_DECREF(multiple[i]);
3296 }
3297 }
3298 gettimeofday(&stop, NULL);
3299 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003300 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 /* Test 6: Perform small int addition */
3303 op1 = PyLong_FromLong(1);
3304 gettimeofday(&start, NULL);
3305 for(i=0; i < 10000000; i++) {
3306 result = PyNumber_Add(op1, op1);
3307 Py_DECREF(result);
3308 }
3309 gettimeofday(&stop, NULL);
3310 Py_DECREF(op1);
3311 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 /* Test 7: Perform medium int addition */
3314 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003315 if (op1 == NULL)
3316 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 gettimeofday(&start, NULL);
3318 for(i=0; i < 10000000; i++) {
3319 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003320 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 }
3322 gettimeofday(&stop, NULL);
3323 Py_DECREF(op1);
3324 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003325
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003326 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003327}
3328#endif
3329
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003330/* To test the format of tracebacks as printed out. */
3331static PyObject *
3332traceback_print(PyObject *self, PyObject *args)
3333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 PyObject *file;
3335 PyObject *traceback;
3336 int result;
3337
3338 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3339 &traceback, &file))
3340 return NULL;
3341
3342 result = PyTraceBack_Print(traceback, file);
3343 if (result < 0)
3344 return NULL;
3345 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003346}
3347
Benjamin Petersone6528212008-07-15 15:32:09 +00003348/* To test the format of exceptions as printed out. */
3349static PyObject *
3350exception_print(PyObject *self, PyObject *args)
3351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 PyObject *value;
3353 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 if (!PyArg_ParseTuple(args, "O:exception_print",
3356 &value))
3357 return NULL;
3358 if (!PyExceptionInstance_Check(value)) {
3359 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3360 return NULL;
3361 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 tb = PyException_GetTraceback(value);
3364 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3365 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003367 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003368}
3369
3370
3371
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003372
3373/* reliably raise a MemoryError */
3374static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303375raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 PyErr_NoMemory();
3378 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003379}
3380
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003381/* Issue 6012 */
3382static PyObject *str1, *str2;
3383static int
3384failing_converter(PyObject *obj, void *arg)
3385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 /* Clone str1, then let the conversion fail. */
3387 assert(str1);
3388 str2 = str1;
3389 Py_INCREF(str2);
3390 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003391}
3392static PyObject*
3393argparsing(PyObject *o, PyObject *args)
3394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 PyObject *res;
3396 str1 = str2 = NULL;
3397 if (!PyArg_ParseTuple(args, "O&O&",
3398 PyUnicode_FSConverter, &str1,
3399 failing_converter, &str2)) {
3400 if (!str2)
3401 /* argument converter not called? */
3402 return NULL;
3403 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003404 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 Py_DECREF(str2);
3406 PyErr_Clear();
3407 return res;
3408 }
3409 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003410}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003411
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003412/* To test that the result of PyCode_NewEmpty has the right members. */
3413static PyObject *
3414code_newempty(PyObject *self, PyObject *args)
3415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 const char *filename;
3417 const char *funcname;
3418 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3421 &filename, &funcname, &firstlineno))
3422 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003425}
3426
Georg Brandl1e28a272009-12-28 08:41:01 +00003427/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3428 Run via Lib/test/test_exceptions.py */
3429static PyObject *
3430make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 const char *name;
3433 const char *doc = NULL;
3434 PyObject *base = NULL;
3435 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3440 "s|sOO:make_exception_with_doc", kwlist,
3441 &name, &doc, &base, &dict))
3442 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003445}
3446
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003447static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303448make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003449{
3450 Py_buffer info;
3451 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3452 return NULL;
3453 return PyMemoryView_FromBuffer(&info);
3454}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003455
Stefan Krah7213fcc2015-02-01 16:19:23 +01003456static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003457test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003458{
3459 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3460 int init[5] = {0, 1, 2, 3, 4};
3461 Py_ssize_t itemsize = sizeof(int);
3462 Py_ssize_t shape = 5;
3463 Py_ssize_t strides = 2 * itemsize;
3464 Py_buffer view = {
3465 data,
3466 NULL,
3467 5 * itemsize,
3468 itemsize,
3469 1,
3470 1,
3471 NULL,
3472 &shape,
3473 &strides,
3474 NULL,
3475 NULL
3476 };
3477 int *ptr;
3478 int i;
3479
3480 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3481 ptr = view.buf;
3482 for (i = 0; i < 5; i++) {
3483 if (ptr[2*i] != i) {
3484 PyErr_SetString(TestError,
3485 "test_from_contiguous: incorrect result");
3486 return NULL;
3487 }
3488 }
3489
3490 view.buf = &data[8];
3491 view.strides[0] = -2 * itemsize;
3492
3493 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3494 ptr = view.buf;
3495 for (i = 0; i < 5; i++) {
3496 if (*(ptr-2*i) != i) {
3497 PyErr_SetString(TestError,
3498 "test_from_contiguous: incorrect result");
3499 return NULL;
3500 }
3501 }
3502
3503 Py_RETURN_NONE;
3504}
Stefan Krah650c1e82015-02-03 21:43:23 +01003505
Stefan Kraha7559c02015-02-03 22:27:21 +01003506#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003507extern PyTypeObject _PyBytesIOBuffer_Type;
3508
Stefan Krah5178d912015-02-03 16:57:21 +01003509static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003510test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003511{
Stefan Krah650c1e82015-02-03 21:43:23 +01003512 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003513 PyObject *b;
3514 char *dummy[1];
3515 int ret, match;
3516
Stefan Krah650c1e82015-02-03 21:43:23 +01003517 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003518 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3519 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3520 PyErr_Clear();
3521 if (ret != -1 || match == 0)
3522 goto error;
3523
Stefan Krah650c1e82015-02-03 21:43:23 +01003524 /* bytesiobuf_getbuffer() */
3525 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003526 if (b == NULL) {
3527 return NULL;
3528 }
3529
3530 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3531 Py_DECREF(b);
3532 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3533 PyErr_Clear();
3534 if (ret != -1 || match == 0)
3535 goto error;
3536
3537 Py_RETURN_NONE;
3538
3539error:
3540 PyErr_SetString(TestError,
3541 "test_pep3118_obsolete_write_locks: failure");
3542 return NULL;
3543}
Stefan Kraha7559c02015-02-03 22:27:21 +01003544#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003545
Stefan Krah650c1e82015-02-03 21:43:23 +01003546/* This tests functions that historically supported write locks. It is
3547 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3548 is entitled to segfault in that case. */
3549static PyObject *
3550getbuffer_with_null_view(PyObject* self, PyObject *obj)
3551{
3552 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3553 return NULL;
3554
3555 Py_RETURN_NONE;
3556}
3557
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003558/* PyBuffer_SizeFromFormat() */
3559static PyObject *
3560test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3561{
3562 const char *format;
3563 Py_ssize_t result;
3564
3565 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3566 &format)) {
3567 return NULL;
3568 }
3569
3570 result = PyBuffer_SizeFromFormat(format);
3571 if (result == -1) {
3572 return NULL;
3573 }
3574
3575 return PyLong_FromSsize_t(result);
3576}
3577
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003578/* Test that the fatal error from not having a current thread doesn't
3579 cause an infinite loop. Run via Lib/test/test_capi.py */
3580static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303581crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003582{
3583 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003584 /* Using PyThreadState_Get() directly allows the test to pass in
3585 !pydebug mode. However, the test only actually tests anything
3586 in pydebug mode, since that's where the infinite loop was in
3587 the first place. */
3588 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003589 Py_END_ALLOW_THREADS
3590 return NULL;
3591}
3592
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003593/* To run some code in a sub-interpreter. */
3594static PyObject *
3595run_in_subinterp(PyObject *self, PyObject *args)
3596{
3597 const char *code;
3598 int r;
3599 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003600 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3601 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003602
3603 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3604 &code))
3605 return NULL;
3606
3607 mainstate = PyThreadState_Get();
3608
3609 PyThreadState_Swap(NULL);
3610
3611 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003612 if (substate == NULL) {
3613 /* Since no new thread state was created, there is no exception to
3614 propagate; raise a fresh one after swapping in the old thread
3615 state. */
3616 PyThreadState_Swap(mainstate);
3617 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3618 return NULL;
3619 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003620 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003621 Py_EndInterpreter(substate);
3622
3623 PyThreadState_Swap(mainstate);
3624
3625 return PyLong_FromLong(r);
3626}
3627
Victor Stinner3c1b3792014-02-17 00:02:43 +01003628static int
3629check_time_rounding(int round)
3630{
Victor Stinner74474232015-09-02 01:43:56 +02003631 if (round != _PyTime_ROUND_FLOOR
3632 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003633 && round != _PyTime_ROUND_HALF_EVEN
3634 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003635 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3636 return -1;
3637 }
3638 return 0;
3639}
3640
Victor Stinner5d272cc2012-03-13 13:35:55 +01003641static PyObject *
3642test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3643{
3644 PyObject *obj;
3645 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003646 int round;
3647 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003648 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003649 if (check_time_rounding(round) < 0)
3650 return NULL;
3651 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003652 return NULL;
3653 return _PyLong_FromTime_t(sec);
3654}
3655
3656static PyObject *
3657test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3658{
3659 PyObject *obj;
3660 time_t sec;
3661 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003662 int round;
3663 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003664 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003665 if (check_time_rounding(round) < 0)
3666 return NULL;
3667 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003668 return NULL;
3669 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3670}
3671
Victor Stinner643cd682012-03-02 22:54:03 +01003672static PyObject *
3673test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3674{
3675 PyObject *obj;
3676 time_t sec;
3677 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003678 int round;
3679 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003680 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003681 if (check_time_rounding(round) < 0)
3682 return NULL;
3683 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003684 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003685 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003686}
3687
Antoine Pitrou796564c2013-07-30 19:59:21 +02003688static void
3689slot_tp_del(PyObject *self)
3690{
3691 _Py_IDENTIFIER(__tp_del__);
3692 PyObject *del, *res;
3693 PyObject *error_type, *error_value, *error_traceback;
3694
3695 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003696 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003697 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003698
3699 /* Save the current exception, if any. */
3700 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3701
3702 /* Execute __del__ method, if any. */
3703 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3704 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003705 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003706 if (res == NULL)
3707 PyErr_WriteUnraisable(del);
3708 else
3709 Py_DECREF(res);
3710 Py_DECREF(del);
3711 }
3712
3713 /* Restore the saved exception. */
3714 PyErr_Restore(error_type, error_value, error_traceback);
3715
3716 /* Undo the temporary resurrection; can't use DECREF here, it would
3717 * cause a recursive call.
3718 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003719 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003720 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3721 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003722 /* this is the normal path out */
3723 return;
3724 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003725
3726 /* __del__ resurrected it! Make it look like the original Py_DECREF
3727 * never happened.
3728 */
3729 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003730 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003731 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003732 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003733 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003734 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003735 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3736 _Py_RefTotal, so we need to undo that. */
3737#ifdef Py_REF_DEBUG
3738 _Py_RefTotal--;
3739#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003740}
3741
3742static PyObject *
3743with_tp_del(PyObject *self, PyObject *args)
3744{
3745 PyObject *obj;
3746 PyTypeObject *tp;
3747
3748 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3749 return NULL;
3750 tp = (PyTypeObject *) obj;
3751 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3752 PyErr_Format(PyExc_TypeError,
3753 "heap type expected, got %R", obj);
3754 return NULL;
3755 }
3756 tp->tp_del = slot_tp_del;
3757 Py_INCREF(obj);
3758 return obj;
3759}
3760
Brandt Bucherc13b8472020-10-14 18:44:07 -07003761static PyObject *
3762without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3763{
3764 PyTypeObject *tp = (PyTypeObject*)obj;
3765 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3766 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3767 }
3768 if (PyType_IS_GC(tp)) {
3769 // Don't try this at home, kids:
3770 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3771 tp->tp_free = PyObject_Del;
3772 tp->tp_traverse = NULL;
3773 tp->tp_clear = NULL;
3774 }
3775 assert(!PyType_IS_GC(tp));
3776 Py_INCREF(obj);
3777 return obj;
3778}
3779
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003780static PyMethodDef ml;
3781
3782static PyObject *
3783create_cfunction(PyObject *self, PyObject *args)
3784{
3785 return PyCFunction_NewEx(&ml, self, NULL);
3786}
3787
3788static PyMethodDef ml = {
3789 "create_cfunction",
3790 create_cfunction,
3791 METH_NOARGS,
3792 NULL
3793};
3794
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003795static PyObject *
3796_test_incref(PyObject *ob)
3797{
3798 Py_INCREF(ob);
3799 return ob;
3800}
3801
3802static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303803test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003804{
3805 PyObject *obj = PyLong_FromLong(0);
3806 Py_XINCREF(_test_incref(obj));
3807 Py_DECREF(obj);
3808 Py_DECREF(obj);
3809 Py_DECREF(obj);
3810 Py_RETURN_NONE;
3811}
3812
3813static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303814test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003815{
3816 PyObject *obj = PyLong_FromLong(0);
3817 Py_INCREF(_test_incref(obj));
3818 Py_DECREF(obj);
3819 Py_DECREF(obj);
3820 Py_DECREF(obj);
3821 Py_RETURN_NONE;
3822}
3823
3824static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303825test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003826{
3827 Py_XDECREF(PyLong_FromLong(0));
3828 Py_RETURN_NONE;
3829}
3830
3831static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303832test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003833{
3834 Py_DECREF(PyLong_FromLong(0));
3835 Py_RETURN_NONE;
3836}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003837
Victor Stinner0507bf52013-07-07 02:05:46 +02003838static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003839test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3840 PyObject *Py_UNUSED(args))
3841{
3842 PyStructSequence_Desc descr;
3843 PyStructSequence_Field descr_fields[3];
3844
3845 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3846 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3847 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3848
3849 descr.name = "_testcapi.test_descr";
3850 descr.doc = "This is used to test for memory leaks in NewType";
3851 descr.fields = descr_fields;
3852 descr.n_in_sequence = 1;
3853
3854 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3855 assert(structseq_type != NULL);
3856 assert(PyType_Check(structseq_type));
3857 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3858 Py_DECREF(structseq_type);
3859
3860 Py_RETURN_NONE;
3861}
3862
3863static PyObject *
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07003864test_structseq_newtype_null_descr_doc(PyObject *Py_UNUSED(self),
3865 PyObject *Py_UNUSED(args))
3866{
3867 PyStructSequence_Field descr_fields[1] = {
3868 (PyStructSequence_Field){NULL, NULL}
3869 };
3870 // Test specifically for NULL .doc field.
3871 PyStructSequence_Desc descr = {"_testcapi.test_descr", NULL, &descr_fields[0], 0};
3872
3873 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3874 assert(structseq_type != NULL);
3875 assert(PyType_Check(structseq_type));
3876 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3877 Py_DECREF(structseq_type);
3878
3879 Py_RETURN_NONE;
3880}
3881
3882static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303883test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003884{
3885 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003886 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003887 Py_DecRef(obj);
3888 Py_DecRef(obj);
3889 Py_RETURN_NONE;
3890}
3891
3892static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303893test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003894{
3895 void *ptr;
3896
Victor Stinnerdb067af2014-05-02 22:31:14 +02003897 ptr = PyMem_RawMalloc(0);
3898 if (ptr == NULL) {
3899 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3900 return NULL;
3901 }
3902 PyMem_RawFree(ptr);
3903
3904 ptr = PyMem_RawCalloc(0, 0);
3905 if (ptr == NULL) {
3906 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3907 return NULL;
3908 }
3909 PyMem_RawFree(ptr);
3910
Victor Stinner0507bf52013-07-07 02:05:46 +02003911 ptr = PyMem_Malloc(0);
3912 if (ptr == NULL) {
3913 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3914 return NULL;
3915 }
3916 PyMem_Free(ptr);
3917
Victor Stinnerdb067af2014-05-02 22:31:14 +02003918 ptr = PyMem_Calloc(0, 0);
3919 if (ptr == NULL) {
3920 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3921 return NULL;
3922 }
3923 PyMem_Free(ptr);
3924
Victor Stinner0507bf52013-07-07 02:05:46 +02003925 ptr = PyObject_Malloc(0);
3926 if (ptr == NULL) {
3927 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3928 return NULL;
3929 }
3930 PyObject_Free(ptr);
3931
Victor Stinnerdb067af2014-05-02 22:31:14 +02003932 ptr = PyObject_Calloc(0, 0);
3933 if (ptr == NULL) {
3934 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3935 return NULL;
3936 }
3937 PyObject_Free(ptr);
3938
Victor Stinner0507bf52013-07-07 02:05:46 +02003939 Py_RETURN_NONE;
3940}
3941
3942typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003943 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003944
3945 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003946 size_t calloc_nelem;
3947 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003948 void *realloc_ptr;
3949 size_t realloc_new_size;
3950 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003951 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003952} alloc_hook_t;
3953
Victor Stinner9ed83c42017-10-31 12:18:10 -07003954static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003955{
3956 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003957 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003958 hook->malloc_size = size;
3959 return hook->alloc.malloc(hook->alloc.ctx, size);
3960}
3961
Victor Stinner9ed83c42017-10-31 12:18:10 -07003962static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003963{
3964 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003965 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003966 hook->calloc_nelem = nelem;
3967 hook->calloc_elsize = elsize;
3968 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3969}
3970
Victor Stinner9ed83c42017-10-31 12:18:10 -07003971static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003972{
3973 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003974 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003975 hook->realloc_ptr = ptr;
3976 hook->realloc_new_size = new_size;
3977 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3978}
3979
Victor Stinner9ed83c42017-10-31 12:18:10 -07003980static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003981{
3982 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003983 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003984 hook->free_ptr = ptr;
3985 hook->alloc.free(hook->alloc.ctx, ptr);
3986}
3987
3988static PyObject *
3989test_setallocators(PyMemAllocatorDomain domain)
3990{
3991 PyObject *res = NULL;
3992 const char *error_msg;
3993 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003994 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003995 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003996 void *ptr, *ptr2;
3997
Victor Stinnerdb067af2014-05-02 22:31:14 +02003998 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003999
4000 alloc.ctx = &hook;
4001 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004002 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004003 alloc.realloc = &hook_realloc;
4004 alloc.free = &hook_free;
4005 PyMem_GetAllocator(domain, &hook.alloc);
4006 PyMem_SetAllocator(domain, &alloc);
4007
Victor Stinner9ed83c42017-10-31 12:18:10 -07004008 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004009 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004010 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004011 switch(domain)
4012 {
4013 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4014 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4015 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4016 default: ptr = NULL; break;
4017 }
4018
Victor Stinner9ed83c42017-10-31 12:18:10 -07004019#define CHECK_CTX(FUNC) \
4020 if (hook.ctx != &hook) { \
4021 error_msg = FUNC " wrong context"; \
4022 goto fail; \
4023 } \
4024 hook.ctx = NULL; /* reset for next check */
4025
Victor Stinner0507bf52013-07-07 02:05:46 +02004026 if (ptr == NULL) {
4027 error_msg = "malloc failed";
4028 goto fail;
4029 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004030 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004031 if (hook.malloc_size != size) {
4032 error_msg = "malloc invalid size";
4033 goto fail;
4034 }
4035
4036 size2 = 200;
4037 switch(domain)
4038 {
4039 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4040 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4041 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004042 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004043 }
4044
4045 if (ptr2 == NULL) {
4046 error_msg = "realloc failed";
4047 goto fail;
4048 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004049 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004050 if (hook.realloc_ptr != ptr
4051 || hook.realloc_new_size != size2) {
4052 error_msg = "realloc invalid parameters";
4053 goto fail;
4054 }
4055
4056 switch(domain)
4057 {
4058 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4059 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4060 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4061 }
4062
Victor Stinner9ed83c42017-10-31 12:18:10 -07004063 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004064 if (hook.free_ptr != ptr2) {
4065 error_msg = "free invalid pointer";
4066 goto fail;
4067 }
4068
Victor Stinner9ed83c42017-10-31 12:18:10 -07004069 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004070 nelem = 2;
4071 elsize = 5;
4072 switch(domain)
4073 {
4074 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4075 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4076 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4077 default: ptr = NULL; break;
4078 }
4079
4080 if (ptr == NULL) {
4081 error_msg = "calloc failed";
4082 goto fail;
4083 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004084 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004085 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4086 error_msg = "calloc invalid nelem or elsize";
4087 goto fail;
4088 }
4089
Victor Stinner9ed83c42017-10-31 12:18:10 -07004090 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004091 switch(domain)
4092 {
4093 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4094 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4095 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4096 }
4097
Victor Stinner9ed83c42017-10-31 12:18:10 -07004098 CHECK_CTX("calloc free");
4099 if (hook.free_ptr != ptr) {
4100 error_msg = "calloc free invalid pointer";
4101 goto fail;
4102 }
4103
Victor Stinner0507bf52013-07-07 02:05:46 +02004104 Py_INCREF(Py_None);
4105 res = Py_None;
4106 goto finally;
4107
4108fail:
4109 PyErr_SetString(PyExc_RuntimeError, error_msg);
4110
4111finally:
4112 PyMem_SetAllocator(domain, &hook.alloc);
4113 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004114
4115#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004116}
4117
4118static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304119test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004120{
4121 return test_setallocators(PYMEM_DOMAIN_RAW);
4122}
4123
4124static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304125test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004126{
4127 return test_setallocators(PYMEM_DOMAIN_MEM);
4128}
4129
4130static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304131test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004132{
4133 return test_setallocators(PYMEM_DOMAIN_OBJ);
4134}
4135
xdegaye85f64302017-07-01 14:14:45 +02004136/* Most part of the following code is inherited from the pyfailmalloc project
4137 * written by Victor Stinner. */
4138static struct {
4139 int installed;
4140 PyMemAllocatorEx raw;
4141 PyMemAllocatorEx mem;
4142 PyMemAllocatorEx obj;
4143} FmHook;
4144
4145static struct {
4146 int start;
4147 int stop;
4148 Py_ssize_t count;
4149} FmData;
4150
4151static int
4152fm_nomemory(void)
4153{
4154 FmData.count++;
4155 if (FmData.count > FmData.start &&
4156 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4157 return 1;
4158 }
4159 return 0;
4160}
4161
4162static void *
4163hook_fmalloc(void *ctx, size_t size)
4164{
4165 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4166 if (fm_nomemory()) {
4167 return NULL;
4168 }
4169 return alloc->malloc(alloc->ctx, size);
4170}
4171
4172static void *
4173hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4174{
4175 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4176 if (fm_nomemory()) {
4177 return NULL;
4178 }
4179 return alloc->calloc(alloc->ctx, nelem, elsize);
4180}
4181
4182static void *
4183hook_frealloc(void *ctx, void *ptr, size_t new_size)
4184{
4185 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4186 if (fm_nomemory()) {
4187 return NULL;
4188 }
4189 return alloc->realloc(alloc->ctx, ptr, new_size);
4190}
4191
4192static void
4193hook_ffree(void *ctx, void *ptr)
4194{
4195 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4196 alloc->free(alloc->ctx, ptr);
4197}
4198
4199static void
4200fm_setup_hooks(void)
4201{
4202 PyMemAllocatorEx alloc;
4203
4204 if (FmHook.installed) {
4205 return;
4206 }
4207 FmHook.installed = 1;
4208
4209 alloc.malloc = hook_fmalloc;
4210 alloc.calloc = hook_fcalloc;
4211 alloc.realloc = hook_frealloc;
4212 alloc.free = hook_ffree;
4213 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4214 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4215 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4216
4217 alloc.ctx = &FmHook.raw;
4218 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4219
4220 alloc.ctx = &FmHook.mem;
4221 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4222
4223 alloc.ctx = &FmHook.obj;
4224 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4225}
4226
4227static void
4228fm_remove_hooks(void)
4229{
4230 if (FmHook.installed) {
4231 FmHook.installed = 0;
4232 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4233 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4234 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4235 }
4236}
4237
4238static PyObject*
4239set_nomemory(PyObject *self, PyObject *args)
4240{
4241 /* Memory allocation fails after 'start' allocation requests, and until
4242 * 'stop' allocation requests except when 'stop' is negative or equal
4243 * to 0 (default) in which case allocation failures never stop. */
4244 FmData.count = 0;
4245 FmData.stop = 0;
4246 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4247 return NULL;
4248 }
4249 fm_setup_hooks();
4250 Py_RETURN_NONE;
4251}
4252
4253static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304254remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004255{
4256 fm_remove_hooks();
4257 Py_RETURN_NONE;
4258}
4259
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004260PyDoc_STRVAR(docstring_empty,
4261""
4262);
4263
4264PyDoc_STRVAR(docstring_no_signature,
4265"This docstring has no signature."
4266);
4267
4268PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004269"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004270"\n"
4271"This docstring has an invalid signature."
4272);
4273
Larry Hastings2623c8c2014-02-08 22:15:29 -08004274PyDoc_STRVAR(docstring_with_invalid_signature2,
4275"docstring_with_invalid_signature2($module, /, boo)\n"
4276"\n"
4277"--\n"
4278"\n"
4279"This docstring also has an invalid signature."
4280);
4281
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004282PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004283"docstring_with_signature($module, /, sig)\n"
4284"--\n"
4285"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004286"This docstring has a valid signature."
4287);
4288
Zachary Ware8ef887c2015-04-13 18:22:35 -05004289PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4290"docstring_with_signature_but_no_doc($module, /, sig)\n"
4291"--\n"
4292"\n"
4293);
4294
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004295PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004296"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4297"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004298"\n"
4299"\n"
4300"This docstring has a valid signature and some extra newlines."
4301);
4302
Larry Hastings16c51912014-01-07 11:53:01 -08004303PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004304"docstring_with_signature_with_defaults(module, s='avocado',\n"
4305" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4306" local=the_number_three, sys=sys.maxsize,\n"
4307" exp=sys.maxsize - 1)\n"
4308"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004309"\n"
4310"\n"
4311"\n"
4312"This docstring has a valid signature with parameters,\n"
4313"and the parameters take defaults of varying types."
4314);
4315
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004316typedef struct {
4317 PyThread_type_lock start_event;
4318 PyThread_type_lock exit_event;
4319 PyObject *callback;
4320} test_c_thread_t;
4321
4322static void
4323temporary_c_thread(void *data)
4324{
4325 test_c_thread_t *test_c_thread = data;
4326 PyGILState_STATE state;
4327 PyObject *res;
4328
4329 PyThread_release_lock(test_c_thread->start_event);
4330
4331 /* Allocate a Python thread state for this thread */
4332 state = PyGILState_Ensure();
4333
Victor Stinner3466bde2016-09-05 18:16:01 -07004334 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004335 Py_CLEAR(test_c_thread->callback);
4336
4337 if (res == NULL) {
4338 PyErr_Print();
4339 }
4340 else {
4341 Py_DECREF(res);
4342 }
4343
4344 /* Destroy the Python thread state for this thread */
4345 PyGILState_Release(state);
4346
4347 PyThread_release_lock(test_c_thread->exit_event);
4348
4349 PyThread_exit_thread();
4350}
4351
4352static PyObject *
4353call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4354{
4355 PyObject *res = NULL;
4356 test_c_thread_t test_c_thread;
4357 long thread;
4358
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004359 test_c_thread.start_event = PyThread_allocate_lock();
4360 test_c_thread.exit_event = PyThread_allocate_lock();
4361 test_c_thread.callback = NULL;
4362 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4363 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4364 goto exit;
4365 }
4366
4367 Py_INCREF(callback);
4368 test_c_thread.callback = callback;
4369
4370 PyThread_acquire_lock(test_c_thread.start_event, 1);
4371 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4372
4373 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4374 if (thread == -1) {
4375 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4376 PyThread_release_lock(test_c_thread.start_event);
4377 PyThread_release_lock(test_c_thread.exit_event);
4378 goto exit;
4379 }
4380
4381 PyThread_acquire_lock(test_c_thread.start_event, 1);
4382 PyThread_release_lock(test_c_thread.start_event);
4383
4384 Py_BEGIN_ALLOW_THREADS
4385 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4386 PyThread_release_lock(test_c_thread.exit_event);
4387 Py_END_ALLOW_THREADS
4388
4389 Py_INCREF(Py_None);
4390 res = Py_None;
4391
4392exit:
4393 Py_CLEAR(test_c_thread.callback);
4394 if (test_c_thread.start_event)
4395 PyThread_free_lock(test_c_thread.start_event);
4396 if (test_c_thread.exit_event)
4397 PyThread_free_lock(test_c_thread.exit_event);
4398 return res;
4399}
Victor Stinner13105102013-12-13 02:17:29 +01004400
Serhiy Storchakab5181342015-02-06 08:58:56 +02004401/* marshal */
4402
4403static PyObject*
4404pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4405{
4406 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004407 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004408 int version;
4409 FILE *fp;
4410
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004411 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004412 &value, &filename, &version))
4413 return NULL;
4414
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004415 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004416 if (fp == NULL) {
4417 PyErr_SetFromErrno(PyExc_OSError);
4418 return NULL;
4419 }
4420
4421 PyMarshal_WriteLongToFile(value, fp, version);
4422
4423 fclose(fp);
4424 if (PyErr_Occurred())
4425 return NULL;
4426 Py_RETURN_NONE;
4427}
4428
4429static PyObject*
4430pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4431{
4432 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004433 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004434 int version;
4435 FILE *fp;
4436
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004437 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004438 &obj, &filename, &version))
4439 return NULL;
4440
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004441 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004442 if (fp == NULL) {
4443 PyErr_SetFromErrno(PyExc_OSError);
4444 return NULL;
4445 }
4446
4447 PyMarshal_WriteObjectToFile(obj, fp, version);
4448
4449 fclose(fp);
4450 if (PyErr_Occurred())
4451 return NULL;
4452 Py_RETURN_NONE;
4453}
4454
4455static PyObject*
4456pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4457{
4458 int value;
4459 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004460 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004461 FILE *fp;
4462
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004463 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004464 return NULL;
4465
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004466 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004467 if (fp == NULL) {
4468 PyErr_SetFromErrno(PyExc_OSError);
4469 return NULL;
4470 }
4471
4472 value = PyMarshal_ReadShortFromFile(fp);
4473 pos = ftell(fp);
4474
4475 fclose(fp);
4476 if (PyErr_Occurred())
4477 return NULL;
4478 return Py_BuildValue("il", value, pos);
4479}
4480
4481static PyObject*
4482pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4483{
4484 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004485 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004486 FILE *fp;
4487
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004488 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004489 return NULL;
4490
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004491 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004492 if (fp == NULL) {
4493 PyErr_SetFromErrno(PyExc_OSError);
4494 return NULL;
4495 }
4496
4497 value = PyMarshal_ReadLongFromFile(fp);
4498 pos = ftell(fp);
4499
4500 fclose(fp);
4501 if (PyErr_Occurred())
4502 return NULL;
4503 return Py_BuildValue("ll", value, pos);
4504}
4505
4506static PyObject*
4507pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4508{
4509 PyObject *obj;
4510 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004511 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004512 FILE *fp;
4513
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004514 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004515 return NULL;
4516
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004517 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004518 if (fp == NULL) {
4519 PyErr_SetFromErrno(PyExc_OSError);
4520 return NULL;
4521 }
4522
4523 obj = PyMarshal_ReadLastObjectFromFile(fp);
4524 pos = ftell(fp);
4525
4526 fclose(fp);
4527 return Py_BuildValue("Nl", obj, pos);
4528}
4529
4530static PyObject*
4531pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4532{
4533 PyObject *obj;
4534 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004535 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004536 FILE *fp;
4537
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004538 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004539 return NULL;
4540
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004541 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004542 if (fp == NULL) {
4543 PyErr_SetFromErrno(PyExc_OSError);
4544 return NULL;
4545 }
4546
4547 obj = PyMarshal_ReadObjectFromFile(fp);
4548 pos = ftell(fp);
4549
4550 fclose(fp);
4551 return Py_BuildValue("Nl", obj, pos);
4552}
4553
Victor Stinnerefde1462015-03-21 15:04:43 +01004554static PyObject*
4555return_null_without_error(PyObject *self, PyObject *args)
4556{
4557 /* invalid call: return NULL without setting an error,
4558 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4559 PyErr_Clear();
4560 return NULL;
4561}
4562
4563static PyObject*
4564return_result_with_error(PyObject *self, PyObject *args)
4565{
4566 /* invalid call: return a result with an error set,
4567 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4568 PyErr_SetNone(PyExc_ValueError);
4569 Py_RETURN_NONE;
4570}
4571
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01004572static PyObject*
4573getitem_with_error(PyObject *self, PyObject *args)
4574{
4575 PyObject *map, *key;
4576 if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
4577 return NULL;
4578 }
4579
4580 PyErr_SetString(PyExc_ValueError, "bug");
4581 return PyObject_GetItem(map, key);
4582}
4583
Victor Stinner992c43f2015-03-27 17:12:45 +01004584static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004585test_pytime_fromseconds(PyObject *self, PyObject *args)
4586{
4587 int seconds;
4588 _PyTime_t ts;
4589
4590 if (!PyArg_ParseTuple(args, "i", &seconds))
4591 return NULL;
4592 ts = _PyTime_FromSeconds(seconds);
4593 return _PyTime_AsNanosecondsObject(ts);
4594}
4595
4596static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004597test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4598{
4599 PyObject *obj;
4600 int round;
4601 _PyTime_t ts;
4602
4603 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4604 return NULL;
4605 if (check_time_rounding(round) < 0)
4606 return NULL;
4607 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4608 return NULL;
4609 return _PyTime_AsNanosecondsObject(ts);
4610}
4611
Victor Stinner4bfb4602015-03-27 22:27:24 +01004612static PyObject *
4613test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4614{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004615 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004616 _PyTime_t ts;
4617 double d;
4618
Victor Stinnerc29b5852017-11-02 07:28:27 -07004619 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004620 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004621 }
4622 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4623 return NULL;
4624 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004625 d = _PyTime_AsSecondsDouble(ts);
4626 return PyFloat_FromDouble(d);
4627}
4628
Victor Stinner95e9cef2015-03-28 01:26:47 +01004629static PyObject *
4630test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4631{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004632 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004633 int round;
4634 _PyTime_t t;
4635 struct timeval tv;
4636 PyObject *seconds;
4637
Victor Stinnerc29b5852017-11-02 07:28:27 -07004638 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004639 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004640 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004641 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004642 }
4643 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004644 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004645 }
4646 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4647 return NULL;
4648 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004649
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004650 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004651 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004652 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004653 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004654 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4655}
4656
Victor Stinner34dc0f42015-03-27 18:19:03 +01004657#ifdef HAVE_CLOCK_GETTIME
4658static PyObject *
4659test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4660{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004661 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004662 _PyTime_t t;
4663 struct timespec ts;
4664
Victor Stinnerc29b5852017-11-02 07:28:27 -07004665 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004666 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004667 }
4668 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004669 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004670 }
4671 if (_PyTime_AsTimespec(t, &ts) == -1) {
4672 return NULL;
4673 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004674 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4675}
4676#endif
4677
Victor Stinner62d1c702015-04-01 17:47:07 +02004678static PyObject *
4679test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4680{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004681 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004682 int round;
4683 _PyTime_t t, ms;
4684
Victor Stinnerc29b5852017-11-02 07:28:27 -07004685 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004686 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004687 }
4688 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004689 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004690 }
4691 if (check_time_rounding(round) < 0) {
4692 return NULL;
4693 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004694 ms = _PyTime_AsMilliseconds(t, round);
4695 /* This conversion rely on the fact that _PyTime_t is a number of
4696 nanoseconds */
4697 return _PyTime_AsNanosecondsObject(ms);
4698}
4699
4700static PyObject *
4701test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4702{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004703 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004704 int round;
4705 _PyTime_t t, ms;
4706
Victor Stinnerc29b5852017-11-02 07:28:27 -07004707 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004708 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004709 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004710 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004711 }
4712 if (check_time_rounding(round) < 0) {
4713 return NULL;
4714 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004715 ms = _PyTime_AsMicroseconds(t, round);
4716 /* This conversion rely on the fact that _PyTime_t is a number of
4717 nanoseconds */
4718 return _PyTime_AsNanosecondsObject(ms);
4719}
4720
Victor Stinner50856d52015-10-13 00:11:21 +02004721static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004722pymem_buffer_overflow(PyObject *self, PyObject *args)
4723{
4724 char *buffer;
4725
4726 /* Deliberate buffer overflow to check that PyMem_Free() detects
4727 the overflow when debug hooks are installed. */
4728 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004729 if (buffer == NULL) {
4730 PyErr_NoMemory();
4731 return NULL;
4732 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004733 buffer[16] = 'x';
4734 PyMem_Free(buffer);
4735
4736 Py_RETURN_NONE;
4737}
4738
4739static PyObject*
4740pymem_api_misuse(PyObject *self, PyObject *args)
4741{
4742 char *buffer;
4743
4744 /* Deliberate misusage of Python allocators:
4745 allococate with PyMem but release with PyMem_Raw. */
4746 buffer = PyMem_Malloc(16);
4747 PyMem_RawFree(buffer);
4748
4749 Py_RETURN_NONE;
4750}
4751
Victor Stinnerc4aec362016-03-14 22:26:53 +01004752static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004753pymem_malloc_without_gil(PyObject *self, PyObject *args)
4754{
4755 char *buffer;
4756
4757 /* Deliberate bug to test debug hooks on Python memory allocators:
4758 call PyMem_Malloc() without holding the GIL */
4759 Py_BEGIN_ALLOW_THREADS
4760 buffer = PyMem_Malloc(10);
4761 Py_END_ALLOW_THREADS
4762
4763 PyMem_Free(buffer);
4764
4765 Py_RETURN_NONE;
4766}
4767
Victor Stinner5d39e042017-11-29 17:20:38 +01004768
4769static PyObject*
4770test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4771{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004772 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004773 if (name == NULL) {
4774 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4775 return NULL;
4776 }
4777 return PyUnicode_FromString(name);
4778}
4779
4780
Victor Stinnerad524372016-03-16 12:12:53 +01004781static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004782test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004783{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004784 if (!_PyObject_IsFreed(op)) {
4785 return raiseTestError(test_name, "object is not seen as freed");
4786 }
4787 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004788}
4789
4790
4791static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004792check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4793{
4794 PyObject *op = NULL;
4795 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4796}
4797
4798
4799static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004800check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004801{
4802 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4803 if (op == NULL) {
4804 return NULL;
4805 }
4806 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004807 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004808 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004809 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004810}
4811
4812
4813static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004814check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004815{
4816 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4817 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4818 if (op == NULL) {
4819 return NULL;
4820 }
4821 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004822 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004823 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004824 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004825 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004826}
4827
4828
4829static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004830check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004831{
4832 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4833 if (op == NULL) {
4834 return NULL;
4835 }
4836 Py_TYPE(op)->tp_dealloc(op);
4837 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004838 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004839 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004840 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004841}
4842
4843
4844static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004845pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4846{
4847 char *buffer;
4848
Victor Stinnerad524372016-03-16 12:12:53 +01004849 /* Deliberate bug to test debug hooks on Python memory allocators:
4850 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004851 Py_BEGIN_ALLOW_THREADS
4852 buffer = PyObject_Malloc(10);
4853 Py_END_ALLOW_THREADS
4854
4855 PyObject_Free(buffer);
4856
4857 Py_RETURN_NONE;
4858}
4859
Victor Stinner10b73e12016-03-22 13:39:05 +01004860static PyObject *
4861tracemalloc_track(PyObject *self, PyObject *args)
4862{
4863 unsigned int domain;
4864 PyObject *ptr_obj;
4865 void *ptr;
4866 Py_ssize_t size;
4867 int release_gil = 0;
4868 int res;
4869
4870 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4871 return NULL;
4872 ptr = PyLong_AsVoidPtr(ptr_obj);
4873 if (PyErr_Occurred())
4874 return NULL;
4875
4876 if (release_gil) {
4877 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004878 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004879 Py_END_ALLOW_THREADS
4880 }
4881 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004882 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004883 }
4884
4885 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004886 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004887 return NULL;
4888 }
4889
4890 Py_RETURN_NONE;
4891}
4892
4893static PyObject *
4894tracemalloc_untrack(PyObject *self, PyObject *args)
4895{
4896 unsigned int domain;
4897 PyObject *ptr_obj;
4898 void *ptr;
4899 int res;
4900
4901 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4902 return NULL;
4903 ptr = PyLong_AsVoidPtr(ptr_obj);
4904 if (PyErr_Occurred())
4905 return NULL;
4906
Victor Stinner5ea4c062017-06-20 17:46:36 +02004907 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004908 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004909 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004910 return NULL;
4911 }
4912
4913 Py_RETURN_NONE;
4914}
4915
4916static PyObject *
4917tracemalloc_get_traceback(PyObject *self, PyObject *args)
4918{
4919 unsigned int domain;
4920 PyObject *ptr_obj;
4921 void *ptr;
4922
4923 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4924 return NULL;
4925 ptr = PyLong_AsVoidPtr(ptr_obj);
4926 if (PyErr_Occurred())
4927 return NULL;
4928
Benjamin Petersonca470632016-09-06 13:47:26 -07004929 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004930}
4931
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004932static PyObject *
4933dict_get_version(PyObject *self, PyObject *args)
4934{
4935 PyDictObject *dict;
4936 uint64_t version;
4937
4938 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4939 return NULL;
4940
4941 version = dict->ma_version_tag;
4942
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004943 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4944 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004945}
4946
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004947
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004948static PyObject *
4949raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4950{
Vladimir Matveev037245c2020-10-09 17:15:15 -07004951 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004952 PyGenObject *gen;
4953
4954 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4955 return NULL;
4956
4957 /* This is used in a test to check what happens if a signal arrives just
4958 as we're in the process of entering a yield from chain (see
4959 bpo-30039).
4960
4961 Needs to be done in C, because:
4962 - we don't have a Python wrapper for raise()
4963 - we need to make sure that the Python-level signal handler doesn't run
4964 *before* we enter the generator frame, which is impossible in Python
4965 because we check for signals before every bytecode operation.
4966 */
4967 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07004968 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004969}
4970
4971
Victor Stinner3b5cf852017-06-09 16:48:45 +02004972static int
4973fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4974{
4975 if (args == Py_None) {
4976 *stack = NULL;
4977 *nargs = 0;
4978 }
4979 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004980 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004981 *nargs = PyTuple_GET_SIZE(args);
4982 }
4983 else {
4984 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4985 return -1;
4986 }
4987 return 0;
4988}
4989
4990
4991static PyObject *
4992test_pyobject_fastcall(PyObject *self, PyObject *args)
4993{
4994 PyObject *func, *func_args;
4995 PyObject **stack;
4996 Py_ssize_t nargs;
4997
4998 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4999 return NULL;
5000 }
5001
5002 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5003 return NULL;
5004 }
5005 return _PyObject_FastCall(func, stack, nargs);
5006}
5007
5008
5009static PyObject *
5010test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5011{
5012 PyObject *func, *func_args, *kwargs;
5013 PyObject **stack;
5014 Py_ssize_t nargs;
5015
5016 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5017 return NULL;
5018 }
5019
5020 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5021 return NULL;
5022 }
5023
5024 if (kwargs == Py_None) {
5025 kwargs = NULL;
5026 }
5027 else if (!PyDict_Check(kwargs)) {
5028 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5029 return NULL;
5030 }
5031
Petr Viktorinffd97532020-02-11 17:46:57 +01005032 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005033}
5034
5035
5036static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005037test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005038{
5039 PyObject *func, *func_args, *kwnames = NULL;
5040 PyObject **stack;
5041 Py_ssize_t nargs, nkw;
5042
5043 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5044 return NULL;
5045 }
5046
5047 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5048 return NULL;
5049 }
5050
5051 if (kwnames == Py_None) {
5052 kwnames = NULL;
5053 }
5054 else if (PyTuple_Check(kwnames)) {
5055 nkw = PyTuple_GET_SIZE(kwnames);
5056 if (nargs < nkw) {
5057 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5058 return NULL;
5059 }
5060 nargs -= nkw;
5061 }
5062 else {
5063 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5064 return NULL;
5065 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005066 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005067}
5068
5069
5070static PyObject *
5071test_pyvectorcall_call(PyObject *self, PyObject *args)
5072{
5073 PyObject *func;
5074 PyObject *argstuple;
5075 PyObject *kwargs = NULL;
5076
5077 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5078 return NULL;
5079 }
5080
5081 if (!PyTuple_Check(argstuple)) {
5082 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5083 return NULL;
5084 }
5085 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5086 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5087 return NULL;
5088 }
5089
5090 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005091}
5092
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005093
Victor Stinner64fa4492017-07-10 14:37:49 +02005094static PyObject*
5095stack_pointer(PyObject *self, PyObject *args)
5096{
5097 int v = 5;
5098 return PyLong_FromVoidPtr(&v);
5099}
5100
Victor Stinner3b5cf852017-06-09 16:48:45 +02005101
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005102#ifdef W_STOPCODE
5103static PyObject*
5104py_w_stopcode(PyObject *self, PyObject *args)
5105{
5106 int sig, status;
5107 if (!PyArg_ParseTuple(args, "i", &sig)) {
5108 return NULL;
5109 }
5110 status = W_STOPCODE(sig);
5111 return PyLong_FromLong(status);
5112}
5113#endif
5114
5115
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005116static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005117get_mapping_keys(PyObject* self, PyObject *obj)
5118{
5119 return PyMapping_Keys(obj);
5120}
5121
5122static PyObject *
5123get_mapping_values(PyObject* self, PyObject *obj)
5124{
5125 return PyMapping_Values(obj);
5126}
5127
5128static PyObject *
5129get_mapping_items(PyObject* self, PyObject *obj)
5130{
5131 return PyMapping_Items(obj);
5132}
5133
5134
5135static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005136test_pythread_tss_key_state(PyObject *self, PyObject *args)
5137{
5138 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5139 if (PyThread_tss_is_created(&tss_key)) {
5140 return raiseTestError("test_pythread_tss_key_state",
5141 "TSS key not in an uninitialized state at "
5142 "creation time");
5143 }
5144 if (PyThread_tss_create(&tss_key) != 0) {
5145 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5146 return NULL;
5147 }
5148 if (!PyThread_tss_is_created(&tss_key)) {
5149 return raiseTestError("test_pythread_tss_key_state",
5150 "PyThread_tss_create succeeded, "
5151 "but with TSS key in an uninitialized state");
5152 }
5153 if (PyThread_tss_create(&tss_key) != 0) {
5154 return raiseTestError("test_pythread_tss_key_state",
5155 "PyThread_tss_create unsuccessful with "
5156 "an already initialized key");
5157 }
5158#define CHECK_TSS_API(expr) \
5159 (void)(expr); \
5160 if (!PyThread_tss_is_created(&tss_key)) { \
5161 return raiseTestError("test_pythread_tss_key_state", \
5162 "TSS key initialization state was not " \
5163 "preserved after calling " #expr); }
5164 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5165 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5166#undef CHECK_TSS_API
5167 PyThread_tss_delete(&tss_key);
5168 if (PyThread_tss_is_created(&tss_key)) {
5169 return raiseTestError("test_pythread_tss_key_state",
5170 "PyThread_tss_delete called, but did not "
5171 "set the key state to uninitialized");
5172 }
5173
5174 Py_tss_t *ptr_key = PyThread_tss_alloc();
5175 if (ptr_key == NULL) {
5176 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5177 return NULL;
5178 }
5179 if (PyThread_tss_is_created(ptr_key)) {
5180 return raiseTestError("test_pythread_tss_key_state",
5181 "TSS key not in an uninitialized state at "
5182 "allocation time");
5183 }
5184 PyThread_tss_free(ptr_key);
5185 ptr_key = NULL;
5186 Py_RETURN_NONE;
5187}
5188
5189
Yury Selivanovf23746a2018-01-22 19:11:18 -05005190static PyObject*
5191new_hamt(PyObject *self, PyObject *args)
5192{
5193 return _PyContext_NewHamtForTests();
5194}
5195
5196
jdemeyer5a306202018-10-19 23:50:06 +02005197/* def bad_get(self, obj, cls):
5198 cls()
5199 return repr(self)
5200*/
5201static PyObject*
5202bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5203{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005204 PyObject *self, *obj, *cls;
5205 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005206 return NULL;
5207 }
5208
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005209 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005210 if (res == NULL) {
5211 return NULL;
5212 }
5213 Py_DECREF(res);
5214
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005215 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005216}
5217
5218
Victor Stinner3d4226a2018-08-29 22:21:32 +02005219static PyObject *
5220encode_locale_ex(PyObject *self, PyObject *args)
5221{
5222 PyObject *unicode;
5223 int current_locale = 0;
5224 wchar_t *wstr;
5225 PyObject *res = NULL;
5226 const char *errors = NULL;
5227
5228 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5229 return NULL;
5230 }
5231 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5232 if (wstr == NULL) {
5233 return NULL;
5234 }
5235 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5236
5237 char *str = NULL;
5238 size_t error_pos;
5239 const char *reason = NULL;
5240 int ret = _Py_EncodeLocaleEx(wstr,
5241 &str, &error_pos, &reason,
5242 current_locale, error_handler);
5243 PyMem_Free(wstr);
5244
5245 switch(ret) {
5246 case 0:
5247 res = PyBytes_FromString(str);
5248 PyMem_RawFree(str);
5249 break;
5250 case -1:
5251 PyErr_NoMemory();
5252 break;
5253 case -2:
5254 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5255 error_pos, reason);
5256 break;
5257 case -3:
5258 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5259 break;
5260 default:
5261 PyErr_SetString(PyExc_ValueError, "unknow error code");
5262 break;
5263 }
5264 return res;
5265}
5266
5267
5268static PyObject *
5269decode_locale_ex(PyObject *self, PyObject *args)
5270{
5271 char *str;
5272 int current_locale = 0;
5273 PyObject *res = NULL;
5274 const char *errors = NULL;
5275
5276 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5277 return NULL;
5278 }
5279 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5280
5281 wchar_t *wstr = NULL;
5282 size_t wlen = 0;
5283 const char *reason = NULL;
5284 int ret = _Py_DecodeLocaleEx(str,
5285 &wstr, &wlen, &reason,
5286 current_locale, error_handler);
5287
5288 switch(ret) {
5289 case 0:
5290 res = PyUnicode_FromWideChar(wstr, wlen);
5291 PyMem_RawFree(wstr);
5292 break;
5293 case -1:
5294 PyErr_NoMemory();
5295 break;
5296 case -2:
5297 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5298 wlen, reason);
5299 break;
5300 case -3:
5301 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5302 break;
5303 default:
5304 PyErr_SetString(PyExc_ValueError, "unknow error code");
5305 break;
5306 }
5307 return res;
5308}
5309
5310
Victor Stinner18618e652018-10-25 17:28:11 +02005311#ifdef Py_REF_DEBUG
5312static PyObject *
5313negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5314{
5315 PyObject *obj = PyUnicode_FromString("negative_refcount");
5316 if (obj == NULL) {
5317 return NULL;
5318 }
5319 assert(Py_REFCNT(obj) == 1);
5320
Victor Stinnerc86a1122020-02-07 01:24:29 +01005321 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005322 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5323 Py_DECREF(obj);
5324
5325 Py_RETURN_NONE;
5326}
5327#endif
5328
5329
Victor Stinneref9d9b62019-05-22 11:28:22 +02005330static PyObject*
5331test_write_unraisable_exc(PyObject *self, PyObject *args)
5332{
Victor Stinner71c52e32019-05-27 08:57:14 +02005333 PyObject *exc, *err_msg, *obj;
5334 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005335 return NULL;
5336 }
5337
Victor Stinner71c52e32019-05-27 08:57:14 +02005338 const char *err_msg_utf8;
5339 if (err_msg != Py_None) {
5340 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5341 if (err_msg_utf8 == NULL) {
5342 return NULL;
5343 }
5344 }
5345 else {
5346 err_msg_utf8 = NULL;
5347 }
5348
Victor Stinneref9d9b62019-05-22 11:28:22 +02005349 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005350 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005351 Py_RETURN_NONE;
5352}
5353
5354
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005355static PyObject *
5356sequence_getitem(PyObject *self, PyObject *args)
5357{
5358 PyObject *seq;
5359 Py_ssize_t i;
5360 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5361 return NULL;
5362 }
5363 return PySequence_GetItem(seq, i);
5364}
5365
5366
Petr Viktorinf9583772019-09-10 12:21:09 +01005367/* Functions for testing C calling conventions (METH_*) are named meth_*,
5368 * e.g. "meth_varargs" for METH_VARARGS.
5369 *
5370 * They all return a tuple of their C-level arguments, with None instead
5371 * of NULL and Python tuples instead of C arrays.
5372 */
5373
5374
5375static PyObject*
5376_null_to_none(PyObject* obj)
5377{
5378 if (obj == NULL) {
5379 Py_RETURN_NONE;
5380 }
5381 Py_INCREF(obj);
5382 return obj;
5383}
5384
5385static PyObject*
5386meth_varargs(PyObject* self, PyObject* args)
5387{
5388 return Py_BuildValue("NO", _null_to_none(self), args);
5389}
5390
5391static PyObject*
5392meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5393{
5394 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5395}
5396
5397static PyObject*
5398meth_o(PyObject* self, PyObject* obj)
5399{
5400 return Py_BuildValue("NO", _null_to_none(self), obj);
5401}
5402
5403static PyObject*
5404meth_noargs(PyObject* self, PyObject* ignored)
5405{
5406 return _null_to_none(self);
5407}
5408
5409static PyObject*
5410_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5411{
5412 PyObject *tuple = PyTuple_New(nargs);
5413 if (tuple == NULL) {
5414 return NULL;
5415 }
5416 for (Py_ssize_t i=0; i < nargs; i++) {
5417 Py_INCREF(args[i]);
5418 PyTuple_SET_ITEM(tuple, i, args[i]);
5419 }
5420 return tuple;
5421}
5422
5423static PyObject*
5424meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5425{
5426 return Py_BuildValue(
5427 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5428 );
5429}
5430
5431static PyObject*
5432meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5433 Py_ssize_t nargs, PyObject* kwargs)
5434{
5435 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5436 if (pyargs == NULL) {
5437 return NULL;
5438 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005439 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005440 args + nargs, 0, kwargs);
5441 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5442}
5443
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005444
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005445static PyObject*
5446pynumber_tobase(PyObject *module, PyObject *args)
5447{
5448 PyObject *obj;
5449 int base;
5450 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5451 &obj, &base)) {
5452 return NULL;
5453 }
5454 return PyNumber_ToBase(obj, base);
5455}
5456
5457
Victor Stinner0e2ac212020-11-18 18:48:06 +01005458static PyObject*
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005459test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0e2ac212020-11-18 18:48:06 +01005460{
5461 PyObject *obj = PyList_New(0);
5462 if (obj == NULL) {
5463 return NULL;
5464 }
5465
5466 // Ensure that following tests don't modify the object,
5467 // to ensure that Py_DECREF() will not crash.
5468 assert(Py_TYPE(obj) == &PyList_Type);
5469 assert(Py_SIZE(obj) == 0);
5470
5471 // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5472 // as l-values to set an object type and size.
5473 Py_TYPE(obj) = &PyList_Type;
5474 Py_SIZE(obj) = 0;
5475
5476 Py_DECREF(obj);
5477 Py_RETURN_NONE;
5478}
5479
5480
Victor Stinner09bbebe2021-04-11 00:17:39 +02005481#define TEST_REFCOUNT() \
5482 do { \
5483 PyObject *obj = PyList_New(0); \
5484 if (obj == NULL) { \
5485 return NULL; \
5486 } \
5487 assert(Py_REFCNT(obj) == 1); \
5488 \
5489 /* test Py_NewRef() */ \
5490 PyObject *ref = Py_NewRef(obj); \
5491 assert(ref == obj); \
5492 assert(Py_REFCNT(obj) == 2); \
5493 Py_DECREF(ref); \
5494 \
5495 /* test Py_XNewRef() */ \
5496 PyObject *xref = Py_XNewRef(obj); \
5497 assert(xref == obj); \
5498 assert(Py_REFCNT(obj) == 2); \
5499 Py_DECREF(xref); \
5500 \
5501 assert(Py_XNewRef(NULL) == NULL); \
5502 \
5503 Py_DECREF(obj); \
5504 Py_RETURN_NONE; \
5505 } while (0) \
5506
5507
5508// Test Py_NewRef() and Py_XNewRef() macros
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005509static PyObject*
Victor Stinner09bbebe2021-04-11 00:17:39 +02005510test_refcount_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005511{
Victor Stinner09bbebe2021-04-11 00:17:39 +02005512 TEST_REFCOUNT();
5513}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005514
Victor Stinner09bbebe2021-04-11 00:17:39 +02005515#undef Py_NewRef
5516#undef Py_XNewRef
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005517
Victor Stinner09bbebe2021-04-11 00:17:39 +02005518// Test Py_NewRef() and Py_XNewRef() functions, after undefining macros.
5519static PyObject*
5520test_refcount_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5521{
5522 TEST_REFCOUNT();
5523}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005524
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005525
Victor Stinner09bbebe2021-04-11 00:17:39 +02005526// Test Py_Is() function
5527#define TEST_PY_IS() \
5528 do { \
5529 PyObject *o_none = Py_None; \
5530 PyObject *o_true = Py_True; \
5531 PyObject *o_false = Py_False; \
5532 PyObject *obj = PyList_New(0); \
5533 if (obj == NULL) { \
5534 return NULL; \
5535 } \
5536 \
5537 /* test Py_Is() */ \
5538 assert(Py_Is(obj, obj)); \
5539 assert(!Py_Is(obj, o_none)); \
5540 \
5541 /* test Py_None */ \
5542 assert(Py_Is(o_none, o_none)); \
5543 assert(!Py_Is(obj, o_none)); \
5544 \
5545 /* test Py_True */ \
5546 assert(Py_Is(o_true, o_true)); \
5547 assert(!Py_Is(o_false, o_true)); \
5548 assert(!Py_Is(obj, o_true)); \
5549 \
5550 /* test Py_False */ \
5551 assert(Py_Is(o_false, o_false)); \
5552 assert(!Py_Is(o_true, o_false)); \
5553 assert(!Py_Is(obj, o_false)); \
5554 \
5555 Py_DECREF(obj); \
5556 Py_RETURN_NONE; \
5557 } while (0)
5558
5559// Test Py_Is() macro
5560static PyObject*
5561test_py_is_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
5562{
5563 TEST_PY_IS();
5564}
5565
5566#undef Py_Is
5567
5568// Test Py_Is() function, after undefining its macro.
5569static PyObject*
5570test_py_is_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5571{
5572 TEST_PY_IS();
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005573}
5574
5575
Victor Stinnere2320252021-01-18 18:24:29 +01005576static PyObject *
5577test_fatal_error(PyObject *self, PyObject *args)
5578{
5579 char *message;
5580 int release_gil = 0;
5581 if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
5582 return NULL;
5583 if (release_gil) {
5584 Py_BEGIN_ALLOW_THREADS
5585 Py_FatalError(message);
5586 Py_END_ALLOW_THREADS
5587 }
5588 else {
5589 Py_FatalError(message);
5590 }
5591 // Py_FatalError() does not return, but exits the process.
5592 Py_RETURN_NONE;
5593}
5594
5595
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005596static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5597static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
Victor Stinnere2320252021-01-18 18:24:29 +01005598
Tim Peters9ea17ac2001-02-02 05:57:15 +00005599static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305601 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005602 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305603 {"test_config", test_config, METH_NOARGS},
5604 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005605 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005606 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5607 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5608 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5609 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5610 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5611 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005612 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005613 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005614 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5615 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5616 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5617 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5618 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5619 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005620 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5621 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005622 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5623 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5624 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5625 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
scoder3cc481b2021-04-28 18:12:16 +02005626 {"test_gc_control", test_gc_control, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305627 {"test_list_api", test_list_api, METH_NOARGS},
5628 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005629 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005630 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305631 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5632 {"test_long_api", test_long_api, METH_NOARGS},
5633 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5634 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5635 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5636 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005637 {"test_structseq_newtype_doesnt_leak",
5638 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07005639 {"test_structseq_newtype_null_descr_doc",
5640 test_structseq_newtype_null_descr_doc, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305641 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5642 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5643 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5644 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005645 {"test_long_as_unsigned_long_long_mask",
5646 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305647 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5648 {"test_k_code", test_k_code, METH_NOARGS},
5649 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005650 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305651 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305653 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305655 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5656 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5657 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005659 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005660#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005661 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005662#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005663 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005664 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005665 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005666 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Hai Shia13b26c2020-11-11 04:53:46 +08005667 {"get_args", get_args, METH_VARARGS},
5668 {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
5669 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
5670 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005672 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005674 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005675 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005676 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005677 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005678 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 {"getargs_b", getargs_b, METH_VARARGS},
5680 {"getargs_B", getargs_B, METH_VARARGS},
5681 {"getargs_h", getargs_h, METH_VARARGS},
5682 {"getargs_H", getargs_H, METH_VARARGS},
5683 {"getargs_I", getargs_I, METH_VARARGS},
5684 {"getargs_k", getargs_k, METH_VARARGS},
5685 {"getargs_i", getargs_i, METH_VARARGS},
5686 {"getargs_l", getargs_l, METH_VARARGS},
5687 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005688 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005689 {"getargs_L", getargs_L, METH_VARARGS},
5690 {"getargs_K", getargs_K, METH_VARARGS},
5691 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305692 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5693 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005694 {"getargs_f", getargs_f, METH_VARARGS},
5695 {"getargs_d", getargs_d, METH_VARARGS},
5696 {"getargs_D", getargs_D, METH_VARARGS},
5697 {"getargs_S", getargs_S, METH_VARARGS},
5698 {"getargs_Y", getargs_Y, METH_VARARGS},
5699 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005700 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005701 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005702 {"getargs_s", getargs_s, METH_VARARGS},
5703 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5704 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005705 {"getargs_s_hash_int", (PyCFunction)(void(*)(void))getargs_s_hash_int,
5706 METH_VARARGS|METH_KEYWORDS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005707 {"getargs_z", getargs_z, METH_VARARGS},
5708 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5709 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5710 {"getargs_y", getargs_y, METH_VARARGS},
5711 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5712 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5713 {"getargs_u", getargs_u, METH_VARARGS},
5714 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5715 {"getargs_Z", getargs_Z, METH_VARARGS},
5716 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005717 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005718 {"getargs_es", getargs_es, METH_VARARGS},
5719 {"getargs_et", getargs_et, METH_VARARGS},
5720 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5721 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005723 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005725 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305726 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005727#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305728 {"test_u_code", test_u_code, METH_NOARGS},
5729 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005730#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305731 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005732 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5733 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005734 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005735 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5736 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005737 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005738 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005739#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005740 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5741 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005742 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005743#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005744 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005746#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005747 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005748#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005749 {"traceback_print", traceback_print, METH_VARARGS},
5750 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005751 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005752 {"argparsing", argparsing, METH_VARARGS},
5753 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005754 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305756 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005757 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305758 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005759 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005760 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5761 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005762 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005763 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005764 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305765 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5766 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5767 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5768 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005769 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5770 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305771 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005772 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005773 {"no_docstring",
5774 (PyCFunction)test_with_docstring, METH_NOARGS},
5775 {"docstring_empty",
5776 (PyCFunction)test_with_docstring, METH_NOARGS,
5777 docstring_empty},
5778 {"docstring_no_signature",
5779 (PyCFunction)test_with_docstring, METH_NOARGS,
5780 docstring_no_signature},
5781 {"docstring_with_invalid_signature",
5782 (PyCFunction)test_with_docstring, METH_NOARGS,
5783 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005784 {"docstring_with_invalid_signature2",
5785 (PyCFunction)test_with_docstring, METH_NOARGS,
5786 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005787 {"docstring_with_signature",
5788 (PyCFunction)test_with_docstring, METH_NOARGS,
5789 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005790 {"docstring_with_signature_but_no_doc",
5791 (PyCFunction)test_with_docstring, METH_NOARGS,
5792 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005793 {"docstring_with_signature_and_extra_newlines",
5794 (PyCFunction)test_with_docstring, METH_NOARGS,
5795 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005796 {"docstring_with_signature_with_defaults",
5797 (PyCFunction)test_with_docstring, METH_NOARGS,
5798 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005799 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5800 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005801 {"pymarshal_write_long_to_file",
5802 pymarshal_write_long_to_file, METH_VARARGS},
5803 {"pymarshal_write_object_to_file",
5804 pymarshal_write_object_to_file, METH_VARARGS},
5805 {"pymarshal_read_short_from_file",
5806 pymarshal_read_short_from_file, METH_VARARGS},
5807 {"pymarshal_read_long_from_file",
5808 pymarshal_read_long_from_file, METH_VARARGS},
5809 {"pymarshal_read_last_object_from_file",
5810 pymarshal_read_last_object_from_file, METH_VARARGS},
5811 {"pymarshal_read_object_from_file",
5812 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01005813 {"return_null_without_error", return_null_without_error, METH_NOARGS},
5814 {"return_result_with_error", return_result_with_error, METH_NOARGS},
5815 {"getitem_with_error", getitem_with_error, METH_VARARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005816 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005817 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5818 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005819 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005820#ifdef HAVE_CLOCK_GETTIME
5821 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5822#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005823 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5824 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005825 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5826 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005827 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005828 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005829 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005830 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5831 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5832 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005833 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005834 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5835 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5836 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005837 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005838 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005839 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5840 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005841 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5842 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005843 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005844#ifdef W_STOPCODE
5845 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5846#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005847 {"get_mapping_keys", get_mapping_keys, METH_O},
5848 {"get_mapping_values", get_mapping_values, METH_O},
5849 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005850 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005851 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005852 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005853 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5854 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005855#ifdef Py_REF_DEBUG
5856 {"negative_refcount", negative_refcount, METH_NOARGS},
5857#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005858 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005859 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005860 {"meth_varargs", meth_varargs, METH_VARARGS},
5861 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5862 {"meth_o", meth_o, METH_O},
5863 {"meth_noargs", meth_noargs, METH_NOARGS},
5864 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5865 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005866 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005867 {"without_gc", without_gc, METH_O},
Victor Stinner0e2ac212020-11-18 18:48:06 +01005868 {"test_set_type_size", test_set_type_size, METH_NOARGS},
Victor Stinner09bbebe2021-04-11 00:17:39 +02005869 {"test_refcount_macros", test_refcount_macros, METH_NOARGS},
5870 {"test_refcount_funcs", test_refcount_funcs, METH_NOARGS},
5871 {"test_py_is_macros", test_py_is_macros, METH_NOARGS},
5872 {"test_py_is_funcs", test_py_is_funcs, METH_NOARGS},
Victor Stinnere2320252021-01-18 18:24:29 +01005873 {"fatal_error", test_fatal_error, METH_VARARGS,
5874 PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005876};
5877
Thomas Hellera4ea6032003-04-17 18:55:45 +00005878#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5879
Thomas Wouters89f507f2006-12-13 04:49:30 +00005880typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 char bool_member;
5882 char byte_member;
5883 unsigned char ubyte_member;
5884 short short_member;
5885 unsigned short ushort_member;
5886 int int_member;
5887 unsigned int uint_member;
5888 long long_member;
5889 unsigned long ulong_member;
5890 Py_ssize_t pyssizet_member;
5891 float float_member;
5892 double double_member;
5893 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005894 long long longlong_member;
5895 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005896} all_structmembers;
5897
5898typedef struct {
5899 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005901} test_structmembers;
5902
5903static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5905 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5906 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5907 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5908 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5909 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5910 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5911 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5912 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5913 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5914 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5915 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5916 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5918 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005920};
5921
5922
Christian Heimes1af737c2008-01-23 08:24:23 +00005923static PyObject *
5924test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 static char *keywords[] = {
5927 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5928 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5929 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005932 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 test_structmembers *ob;
5934 const char *s = NULL;
5935 Py_ssize_t string_len = 0;
5936 ob = PyObject_New(test_structmembers, type);
5937 if (ob == NULL)
5938 return NULL;
5939 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5940 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5941 &ob->structmembers.bool_member,
5942 &ob->structmembers.byte_member,
5943 &ob->structmembers.ubyte_member,
5944 &ob->structmembers.short_member,
5945 &ob->structmembers.ushort_member,
5946 &ob->structmembers.int_member,
5947 &ob->structmembers.uint_member,
5948 &ob->structmembers.long_member,
5949 &ob->structmembers.ulong_member,
5950 &ob->structmembers.pyssizet_member,
5951 &ob->structmembers.float_member,
5952 &ob->structmembers.double_member,
5953 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 , &ob->structmembers.longlong_member,
5955 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 )) {
5957 Py_DECREF(ob);
5958 return NULL;
5959 }
5960 if (s != NULL) {
5961 if (string_len > 5) {
5962 Py_DECREF(ob);
5963 PyErr_SetString(PyExc_ValueError, "string too long");
5964 return NULL;
5965 }
5966 strcpy(ob->structmembers.inplace_member, s);
5967 }
5968 else {
5969 strcpy(ob->structmembers.inplace_member, "");
5970 }
5971 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005972}
5973
Christian Heimes1af737c2008-01-23 08:24:23 +00005974static void
5975test_structmembers_free(PyObject *ob)
5976{
Victor Stinner32bd68c2020-12-01 10:37:39 +01005977 PyObject_Free(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005978}
5979
5980static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005981 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 "test_structmembersType",
5983 sizeof(test_structmembers), /* tp_basicsize */
5984 0, /* tp_itemsize */
5985 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005986 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 0, /* tp_getattr */
5988 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005989 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 0, /* tp_repr */
5991 0, /* tp_as_number */
5992 0, /* tp_as_sequence */
5993 0, /* tp_as_mapping */
5994 0, /* tp_hash */
5995 0, /* tp_call */
5996 0, /* tp_str */
5997 PyObject_GenericGetAttr, /* tp_getattro */
5998 PyObject_GenericSetAttr, /* tp_setattro */
5999 0, /* tp_as_buffer */
6000 0, /* tp_flags */
6001 "Type containing all structmember types",
6002 0, /* traverseproc tp_traverse */
6003 0, /* tp_clear */
6004 0, /* tp_richcompare */
6005 0, /* tp_weaklistoffset */
6006 0, /* tp_iter */
6007 0, /* tp_iternext */
6008 0, /* tp_methods */
6009 test_members, /* tp_members */
6010 0,
6011 0,
6012 0,
6013 0,
6014 0,
6015 0,
6016 0,
6017 0,
6018 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00006019};
6020
6021
Benjamin Petersond51374e2014-04-09 23:55:56 -04006022typedef struct {
6023 PyObject_HEAD
6024} matmulObject;
6025
6026static PyObject *
6027matmulType_matmul(PyObject *self, PyObject *other)
6028{
6029 return Py_BuildValue("(sOO)", "matmul", self, other);
6030}
6031
6032static PyObject *
6033matmulType_imatmul(PyObject *self, PyObject *other)
6034{
6035 return Py_BuildValue("(sOO)", "imatmul", self, other);
6036}
6037
6038static void
6039matmulType_dealloc(PyObject *self)
6040{
Zachary Ware420dc562014-04-23 13:51:27 -05006041 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006042}
6043
6044static PyNumberMethods matmulType_as_number = {
6045 0, /* nb_add */
6046 0, /* nb_subtract */
6047 0, /* nb_multiply */
6048 0, /* nb_remainde r*/
6049 0, /* nb_divmod */
6050 0, /* nb_power */
6051 0, /* nb_negative */
6052 0, /* tp_positive */
6053 0, /* tp_absolute */
6054 0, /* tp_bool */
6055 0, /* nb_invert */
6056 0, /* nb_lshift */
6057 0, /* nb_rshift */
6058 0, /* nb_and */
6059 0, /* nb_xor */
6060 0, /* nb_or */
6061 0, /* nb_int */
6062 0, /* nb_reserved */
6063 0, /* nb_float */
6064 0, /* nb_inplace_add */
6065 0, /* nb_inplace_subtract */
6066 0, /* nb_inplace_multiply */
6067 0, /* nb_inplace_remainder */
6068 0, /* nb_inplace_power */
6069 0, /* nb_inplace_lshift */
6070 0, /* nb_inplace_rshift */
6071 0, /* nb_inplace_and */
6072 0, /* nb_inplace_xor */
6073 0, /* nb_inplace_or */
6074 0, /* nb_floor_divide */
6075 0, /* nb_true_divide */
6076 0, /* nb_inplace_floor_divide */
6077 0, /* nb_inplace_true_divide */
6078 0, /* nb_index */
6079 matmulType_matmul, /* nb_matrix_multiply */
6080 matmulType_imatmul /* nb_matrix_inplace_multiply */
6081};
6082
6083static PyTypeObject matmulType = {
6084 PyVarObject_HEAD_INIT(NULL, 0)
6085 "matmulType",
6086 sizeof(matmulObject), /* tp_basicsize */
6087 0, /* tp_itemsize */
6088 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006089 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006090 0, /* tp_getattr */
6091 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006092 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006093 0, /* tp_repr */
6094 &matmulType_as_number, /* tp_as_number */
6095 0, /* tp_as_sequence */
6096 0, /* tp_as_mapping */
6097 0, /* tp_hash */
6098 0, /* tp_call */
6099 0, /* tp_str */
6100 PyObject_GenericGetAttr, /* tp_getattro */
6101 PyObject_GenericSetAttr, /* tp_setattro */
6102 0, /* tp_as_buffer */
6103 0, /* tp_flags */
6104 "C level type with matrix operations defined",
6105 0, /* traverseproc tp_traverse */
6106 0, /* tp_clear */
6107 0, /* tp_richcompare */
6108 0, /* tp_weaklistoffset */
6109 0, /* tp_iter */
6110 0, /* tp_iternext */
6111 0, /* tp_methods */
6112 0, /* tp_members */
6113 0,
6114 0,
6115 0,
6116 0,
6117 0,
6118 0,
6119 0,
6120 0,
6121 PyType_GenericNew, /* tp_new */
6122 PyObject_Del, /* tp_free */
6123};
6124
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006125typedef struct {
6126 PyObject_HEAD
6127} ipowObject;
6128
6129static PyObject *
6130ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6131{
6132 return Py_BuildValue("OO", other, mod);
6133}
6134
6135static PyNumberMethods ipowType_as_number = {
6136 .nb_inplace_power = ipowType_ipow
6137};
6138
6139static PyTypeObject ipowType = {
6140 PyVarObject_HEAD_INIT(NULL, 0)
6141 .tp_name = "ipowType",
6142 .tp_basicsize = sizeof(ipowObject),
6143 .tp_as_number = &ipowType_as_number,
6144 .tp_new = PyType_GenericNew
6145};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006146
Yury Selivanov75445082015-05-11 22:57:16 -04006147typedef struct {
6148 PyObject_HEAD
6149 PyObject *ao_iterator;
6150} awaitObject;
6151
6152
6153static PyObject *
6154awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6155{
6156 PyObject *v;
6157 awaitObject *ao;
6158
6159 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6160 return NULL;
6161
6162 ao = (awaitObject *)type->tp_alloc(type, 0);
6163 if (ao == NULL) {
6164 return NULL;
6165 }
6166
6167 Py_INCREF(v);
6168 ao->ao_iterator = v;
6169
6170 return (PyObject *)ao;
6171}
6172
6173
6174static void
6175awaitObject_dealloc(awaitObject *ao)
6176{
6177 Py_CLEAR(ao->ao_iterator);
6178 Py_TYPE(ao)->tp_free(ao);
6179}
6180
6181
6182static PyObject *
6183awaitObject_await(awaitObject *ao)
6184{
6185 Py_INCREF(ao->ao_iterator);
6186 return ao->ao_iterator;
6187}
6188
6189static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006190 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006191 0, /* am_aiter */
Vladimir Matveev1e996c32020-11-10 12:09:55 -08006192 0, /* am_anext */
6193 0, /* am_send */
Yury Selivanov75445082015-05-11 22:57:16 -04006194};
6195
6196
6197static PyTypeObject awaitType = {
6198 PyVarObject_HEAD_INIT(NULL, 0)
6199 "awaitType",
6200 sizeof(awaitObject), /* tp_basicsize */
6201 0, /* tp_itemsize */
6202 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006203 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006204 0, /* tp_getattr */
6205 0, /* tp_setattr */
6206 &awaitType_as_async, /* tp_as_async */
6207 0, /* tp_repr */
6208 0, /* tp_as_number */
6209 0, /* tp_as_sequence */
6210 0, /* tp_as_mapping */
6211 0, /* tp_hash */
6212 0, /* tp_call */
6213 0, /* tp_str */
6214 PyObject_GenericGetAttr, /* tp_getattro */
6215 PyObject_GenericSetAttr, /* tp_setattro */
6216 0, /* tp_as_buffer */
6217 0, /* tp_flags */
6218 "C level type with tp_as_async",
6219 0, /* traverseproc tp_traverse */
6220 0, /* tp_clear */
6221 0, /* tp_richcompare */
6222 0, /* tp_weaklistoffset */
6223 0, /* tp_iter */
6224 0, /* tp_iternext */
6225 0, /* tp_methods */
6226 0, /* tp_members */
6227 0,
6228 0,
6229 0,
6230 0,
6231 0,
6232 0,
6233 0,
6234 0,
6235 awaitObject_new, /* tp_new */
6236 PyObject_Del, /* tp_free */
6237};
6238
6239
xdegaye56d1f5c2017-10-26 15:09:06 +02006240static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6241
6242static PyTypeObject PyRecursingInfinitelyError_Type = {
6243 PyVarObject_HEAD_INIT(NULL, 0)
6244 "RecursingInfinitelyError", /* tp_name */
6245 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6246 0, /* tp_itemsize */
6247 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006248 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006249 0, /* tp_getattr */
6250 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006251 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006252 0, /* tp_repr */
6253 0, /* tp_as_number */
6254 0, /* tp_as_sequence */
6255 0, /* tp_as_mapping */
6256 0, /* tp_hash */
6257 0, /* tp_call */
6258 0, /* tp_str */
6259 0, /* tp_getattro */
6260 0, /* tp_setattro */
6261 0, /* tp_as_buffer */
6262 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6263 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6264 0, /* tp_traverse */
6265 0, /* tp_clear */
6266 0, /* tp_richcompare */
6267 0, /* tp_weaklistoffset */
6268 0, /* tp_iter */
6269 0, /* tp_iternext */
6270 0, /* tp_methods */
6271 0, /* tp_members */
6272 0, /* tp_getset */
6273 0, /* tp_base */
6274 0, /* tp_dict */
6275 0, /* tp_descr_get */
6276 0, /* tp_descr_set */
6277 0, /* tp_dictoffset */
6278 (initproc)recurse_infinitely_error_init, /* tp_init */
6279 0, /* tp_alloc */
6280 0, /* tp_new */
6281};
6282
6283static int
6284recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6285{
6286 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6287
6288 /* Instantiating this exception starts infinite recursion. */
6289 Py_INCREF(type);
6290 PyErr_SetObject(type, NULL);
6291 return -1;
6292}
6293
6294
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006295/* Test bpo-35983: create a subclass of "list" which checks that instances
6296 * are not deallocated twice */
6297
6298typedef struct {
6299 PyListObject list;
6300 int deallocated;
6301} MyListObject;
6302
6303static PyObject *
6304MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6305{
6306 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6307 ((MyListObject*)op)->deallocated = 0;
6308 return op;
6309}
6310
6311void
6312MyList_dealloc(MyListObject* op)
6313{
6314 if (op->deallocated) {
6315 /* We cannot raise exceptions here but we still want the testsuite
6316 * to fail when we hit this */
6317 Py_FatalError("MyList instance deallocated twice");
6318 }
6319 op->deallocated = 1;
6320 PyList_Type.tp_dealloc((PyObject *)op);
6321}
6322
6323static PyTypeObject MyList_Type = {
6324 PyVarObject_HEAD_INIT(NULL, 0)
6325 "MyList",
6326 sizeof(MyListObject),
6327 0,
6328 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006329 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006330 0, /* tp_getattr */
6331 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006332 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006333 0, /* tp_repr */
6334 0, /* tp_as_number */
6335 0, /* tp_as_sequence */
6336 0, /* tp_as_mapping */
6337 0, /* tp_hash */
6338 0, /* tp_call */
6339 0, /* tp_str */
6340 0, /* tp_getattro */
6341 0, /* tp_setattro */
6342 0, /* tp_as_buffer */
6343 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6344 0, /* tp_doc */
6345 0, /* tp_traverse */
6346 0, /* tp_clear */
6347 0, /* tp_richcompare */
6348 0, /* tp_weaklistoffset */
6349 0, /* tp_iter */
6350 0, /* tp_iternext */
6351 0, /* tp_methods */
6352 0, /* tp_members */
6353 0, /* tp_getset */
6354 0, /* &PyList_Type */ /* tp_base */
6355 0, /* tp_dict */
6356 0, /* tp_descr_get */
6357 0, /* tp_descr_set */
6358 0, /* tp_dictoffset */
6359 0, /* tp_init */
6360 0, /* tp_alloc */
6361 MyList_new, /* tp_new */
6362};
6363
6364
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006365/* Test PEP 560 */
6366
6367typedef struct {
6368 PyObject_HEAD
6369 PyObject *item;
6370} PyGenericAliasObject;
6371
6372static void
6373generic_alias_dealloc(PyGenericAliasObject *self)
6374{
6375 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006376 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006377}
6378
6379static PyObject *
6380generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6381{
6382 return PyTuple_Pack(1, self->item);
6383}
6384
6385static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006386 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006387 {NULL} /* sentinel */
6388};
6389
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006390static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006391 PyVarObject_HEAD_INIT(NULL, 0)
6392 "GenericAlias",
6393 sizeof(PyGenericAliasObject),
6394 0,
6395 .tp_dealloc = (destructor)generic_alias_dealloc,
6396 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6397 .tp_methods = generic_alias_methods,
6398};
6399
6400static PyObject *
6401generic_alias_new(PyObject *item)
6402{
6403 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6404 if (o == NULL) {
6405 return NULL;
6406 }
6407 Py_INCREF(item);
6408 o->item = item;
6409 return (PyObject*) o;
6410}
6411
6412typedef struct {
6413 PyObject_HEAD
6414} PyGenericObject;
6415
6416static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006417generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006418{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006419 return generic_alias_new(item);
6420}
6421
6422static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006423 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006424 {NULL} /* sentinel */
6425};
6426
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006427static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006428 PyVarObject_HEAD_INIT(NULL, 0)
6429 "Generic",
6430 sizeof(PyGenericObject),
6431 0,
6432 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6433 .tp_methods = generic_methods,
6434};
6435
6436
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006437/* Test PEP 590 */
6438
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006439typedef struct {
6440 PyObject_HEAD
6441 vectorcallfunc vectorcall;
6442} MethodDescriptorObject;
6443
6444static PyObject *
6445MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6446 size_t nargsf, PyObject *kwnames)
6447{
6448 /* True if using the vectorcall function in MethodDescriptorObject
6449 * but False for MethodDescriptor2Object */
6450 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6451 return PyBool_FromLong(md->vectorcall != NULL);
6452}
6453
6454static PyObject *
6455MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6456{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006457 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006458 op->vectorcall = MethodDescriptor_vectorcall;
6459 return (PyObject *)op;
6460}
6461
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006462static PyObject *
6463func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6464{
6465 if (obj == Py_None || obj == NULL) {
6466 Py_INCREF(func);
6467 return func;
6468 }
6469 return PyMethod_New(func, obj);
6470}
6471
6472static PyObject *
6473nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6474{
6475 Py_INCREF(func);
6476 return func;
6477}
6478
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006479static PyObject *
6480call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6481{
6482 Py_INCREF(args);
6483 return args;
6484}
6485
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006486static PyTypeObject MethodDescriptorBase_Type = {
6487 PyVarObject_HEAD_INIT(NULL, 0)
6488 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006489 sizeof(MethodDescriptorObject),
6490 .tp_new = MethodDescriptor_new,
6491 .tp_call = PyVectorcall_Call,
6492 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6493 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006494 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006495 .tp_descr_get = func_descr_get,
6496};
6497
6498static PyTypeObject MethodDescriptorDerived_Type = {
6499 PyVarObject_HEAD_INIT(NULL, 0)
6500 "MethodDescriptorDerived",
6501 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6502};
6503
6504static PyTypeObject MethodDescriptorNopGet_Type = {
6505 PyVarObject_HEAD_INIT(NULL, 0)
6506 "MethodDescriptorNopGet",
6507 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006508 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006509 .tp_descr_get = nop_descr_get,
6510};
6511
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006512typedef struct {
6513 MethodDescriptorObject base;
6514 vectorcallfunc vectorcall;
6515} MethodDescriptor2Object;
6516
6517static PyObject *
6518MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6519{
6520 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6521 op->base.vectorcall = NULL;
6522 op->vectorcall = MethodDescriptor_vectorcall;
6523 return (PyObject *)op;
6524}
6525
6526static PyTypeObject MethodDescriptor2_Type = {
6527 PyVarObject_HEAD_INIT(NULL, 0)
6528 "MethodDescriptor2",
6529 sizeof(MethodDescriptor2Object),
6530 .tp_new = MethodDescriptor2_new,
6531 .tp_call = PyVectorcall_Call,
6532 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006533 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006534};
6535
Benjamin Peterson39403332020-09-02 11:29:06 -05006536PyDoc_STRVAR(heapdocctype__doc__,
6537"HeapDocCType(arg1, arg2)\n"
6538"--\n"
6539"\n"
6540"somedoc");
6541
6542typedef struct {
6543 PyObject_HEAD
6544} HeapDocCTypeObject;
6545
6546static PyType_Slot HeapDocCType_slots[] = {
6547 {Py_tp_doc, (char*)heapdocctype__doc__},
6548 {0},
6549};
6550
6551static PyType_Spec HeapDocCType_spec = {
6552 "_testcapi.HeapDocCType",
6553 sizeof(HeapDocCTypeObject),
6554 0,
6555 Py_TPFLAGS_DEFAULT,
6556 HeapDocCType_slots
6557};
6558
Hai Shi88c2cfd2020-11-07 00:04:47 +08006559typedef struct {
6560 PyObject_HEAD
6561} NullTpDocTypeObject;
6562
6563static PyType_Slot NullTpDocType_slots[] = {
6564 {Py_tp_doc, NULL},
6565 {0, 0},
6566};
6567
6568static PyType_Spec NullTpDocType_spec = {
6569 "_testcapi.NullTpDocType",
6570 sizeof(NullTpDocTypeObject),
6571 0,
6572 Py_TPFLAGS_DEFAULT,
6573 NullTpDocType_slots
6574};
6575
Benjamin Peterson39403332020-09-02 11:29:06 -05006576
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006577PyDoc_STRVAR(heapgctype__doc__,
6578"A heap type with GC, and with overridden dealloc.\n\n"
6579"The 'value' attribute is set to 10 in __init__.");
6580
6581typedef struct {
6582 PyObject_HEAD
6583 int value;
6584} HeapCTypeObject;
6585
6586static struct PyMemberDef heapctype_members[] = {
6587 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6588 {NULL} /* Sentinel */
6589};
6590
6591static int
6592heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6593{
6594 ((HeapCTypeObject *)self)->value = 10;
6595 return 0;
6596}
6597
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006598static int
6599heapgcctype_traverse(HeapCTypeObject *self, visitproc visit, void *arg)
6600{
6601 Py_VISIT(Py_TYPE(self));
6602 return 0;
6603}
6604
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006605static void
6606heapgcctype_dealloc(HeapCTypeObject *self)
6607{
6608 PyTypeObject *tp = Py_TYPE(self);
6609 PyObject_GC_UnTrack(self);
6610 PyObject_GC_Del(self);
6611 Py_DECREF(tp);
6612}
6613
6614static PyType_Slot HeapGcCType_slots[] = {
6615 {Py_tp_init, heapctype_init},
6616 {Py_tp_members, heapctype_members},
6617 {Py_tp_dealloc, heapgcctype_dealloc},
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006618 {Py_tp_traverse, heapgcctype_traverse},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006619 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006620 {0, 0},
6621};
6622
6623static PyType_Spec HeapGcCType_spec = {
6624 "_testcapi.HeapGcCType",
6625 sizeof(HeapCTypeObject),
6626 0,
6627 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6628 HeapGcCType_slots
6629};
6630
6631PyDoc_STRVAR(heapctype__doc__,
6632"A heap type without GC, but with overridden dealloc.\n\n"
6633"The 'value' attribute is set to 10 in __init__.");
6634
6635static void
6636heapctype_dealloc(HeapCTypeObject *self)
6637{
6638 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006639 PyObject_Free(self);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006640 Py_DECREF(tp);
6641}
6642
6643static PyType_Slot HeapCType_slots[] = {
6644 {Py_tp_init, heapctype_init},
6645 {Py_tp_members, heapctype_members},
6646 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006647 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006648 {0, 0},
6649};
6650
6651static PyType_Spec HeapCType_spec = {
6652 "_testcapi.HeapCType",
6653 sizeof(HeapCTypeObject),
6654 0,
6655 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6656 HeapCType_slots
6657};
6658
6659PyDoc_STRVAR(heapctypesubclass__doc__,
6660"Subclass of HeapCType, without GC.\n\n"
6661"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6662
6663typedef struct {
6664 HeapCTypeObject base;
6665 int value2;
6666} HeapCTypeSubclassObject;
6667
6668static int
6669heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6670{
6671 /* Call __init__ of the superclass */
6672 if (heapctype_init(self, args, kwargs) < 0) {
6673 return -1;
6674 }
6675 /* Initialize additional element */
6676 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6677 return 0;
6678}
6679
6680static struct PyMemberDef heapctypesubclass_members[] = {
6681 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6682 {NULL} /* Sentinel */
6683};
6684
6685static PyType_Slot HeapCTypeSubclass_slots[] = {
6686 {Py_tp_init, heapctypesubclass_init},
6687 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006688 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006689 {0, 0},
6690};
6691
6692static PyType_Spec HeapCTypeSubclass_spec = {
6693 "_testcapi.HeapCTypeSubclass",
6694 sizeof(HeapCTypeSubclassObject),
6695 0,
6696 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6697 HeapCTypeSubclass_slots
6698};
6699
scoderf7c4e232020-06-06 21:35:10 +02006700PyDoc_STRVAR(heapctypewithbuffer__doc__,
6701"Heap type with buffer support.\n\n"
6702"The buffer is set to [b'1', b'2', b'3', b'4']");
6703
6704typedef struct {
6705 HeapCTypeObject base;
6706 char buffer[4];
6707} HeapCTypeWithBufferObject;
6708
6709static int
6710heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6711{
6712 self->buffer[0] = '1';
6713 self->buffer[1] = '2';
6714 self->buffer[2] = '3';
6715 self->buffer[3] = '4';
6716 return PyBuffer_FillInfo(
6717 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6718}
6719
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006720static void
scoderf7c4e232020-06-06 21:35:10 +02006721heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6722{
6723 assert(view->obj == (void*) self);
6724}
6725
6726static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6727 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6728 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6729 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6730 {0, 0},
6731};
6732
6733static PyType_Spec HeapCTypeWithBuffer_spec = {
6734 "_testcapi.HeapCTypeWithBuffer",
6735 sizeof(HeapCTypeWithBufferObject),
6736 0,
6737 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6738 HeapCTypeWithBuffer_slots
6739};
6740
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006741PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6742"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6743"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6744"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6745
6746static int
6747heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6748{
6749 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6750 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6751 base_init(self, args, kwargs);
6752 return 0;
6753}
6754
6755static void
6756heapctypesubclasswithfinalizer_finalize(PyObject *self)
6757{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006758 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006759 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006760
6761 /* Save the current exception, if any. */
6762 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6763
6764 m = PyState_FindModule(&_testcapimodule);
6765 if (m == NULL) {
6766 goto cleanup_finalize;
6767 }
6768 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6769 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6770 if (oldtype == NULL || newtype == NULL) {
6771 goto cleanup_finalize;
6772 }
6773
6774 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6775 goto cleanup_finalize;
6776 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006777 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6778 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006779 goto cleanup_finalize;
6780 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006781 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6782 goto cleanup_finalize;
6783 }
6784 Py_DECREF(refcnt);
6785 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6786 if (refcnt == NULL) {
6787 goto cleanup_finalize;
6788 }
6789 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006790 goto cleanup_finalize;
6791 }
6792
6793cleanup_finalize:
6794 Py_XDECREF(oldtype);
6795 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006796 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006797
6798 /* Restore the saved exception. */
6799 PyErr_Restore(error_type, error_value, error_traceback);
6800}
6801
6802static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6803 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6804 {Py_tp_members, heapctypesubclass_members},
6805 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006806 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006807 {0, 0},
6808};
6809
6810static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6811 "_testcapi.HeapCTypeSubclassWithFinalizer",
6812 sizeof(HeapCTypeSubclassObject),
6813 0,
6814 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6815 HeapCTypeSubclassWithFinalizer_slots
6816};
6817
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006818typedef struct {
6819 PyObject_HEAD
6820 PyObject *dict;
6821} HeapCTypeWithDictObject;
6822
6823static void
6824heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6825{
6826
6827 PyTypeObject *tp = Py_TYPE(self);
6828 Py_XDECREF(self->dict);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006829 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006830 Py_DECREF(tp);
6831}
6832
6833static PyGetSetDef heapctypewithdict_getsetlist[] = {
6834 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6835 {NULL} /* Sentinel */
6836};
6837
6838static struct PyMemberDef heapctypewithdict_members[] = {
6839 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6840 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6841 {NULL} /* Sentinel */
6842};
6843
6844static PyType_Slot HeapCTypeWithDict_slots[] = {
6845 {Py_tp_members, heapctypewithdict_members},
6846 {Py_tp_getset, heapctypewithdict_getsetlist},
6847 {Py_tp_dealloc, heapctypewithdict_dealloc},
6848 {0, 0},
6849};
6850
6851static PyType_Spec HeapCTypeWithDict_spec = {
6852 "_testcapi.HeapCTypeWithDict",
6853 sizeof(HeapCTypeWithDictObject),
6854 0,
6855 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6856 HeapCTypeWithDict_slots
6857};
6858
6859static struct PyMemberDef heapctypewithnegativedict_members[] = {
6860 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006861 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006862 {NULL} /* Sentinel */
6863};
6864
6865static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6866 {Py_tp_members, heapctypewithnegativedict_members},
6867 {Py_tp_getset, heapctypewithdict_getsetlist},
6868 {Py_tp_dealloc, heapctypewithdict_dealloc},
6869 {0, 0},
6870};
6871
6872static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6873 "_testcapi.HeapCTypeWithNegativeDict",
6874 sizeof(HeapCTypeWithDictObject),
6875 0,
6876 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6877 HeapCTypeWithNegativeDict_slots
6878};
6879
6880typedef struct {
6881 PyObject_HEAD
6882 PyObject *weakreflist;
6883} HeapCTypeWithWeakrefObject;
6884
6885static struct PyMemberDef heapctypewithweakref_members[] = {
6886 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6887 {"__weaklistoffset__", T_PYSSIZET,
6888 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6889 {NULL} /* Sentinel */
6890};
6891
6892static void
6893heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6894{
6895
6896 PyTypeObject *tp = Py_TYPE(self);
6897 if (self->weakreflist != NULL)
6898 PyObject_ClearWeakRefs((PyObject *) self);
6899 Py_XDECREF(self->weakreflist);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006900 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006901 Py_DECREF(tp);
6902}
6903
6904static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6905 {Py_tp_members, heapctypewithweakref_members},
6906 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6907 {0, 0},
6908};
6909
6910static PyType_Spec HeapCTypeWithWeakref_spec = {
6911 "_testcapi.HeapCTypeWithWeakref",
6912 sizeof(HeapCTypeWithWeakrefObject),
6913 0,
6914 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6915 HeapCTypeWithWeakref_slots
6916};
6917
scoder148f3292020-07-03 02:09:28 +02006918PyDoc_STRVAR(heapctypesetattr__doc__,
6919"A heap type without GC, but with overridden __setattr__.\n\n"
6920"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6921
6922typedef struct {
6923 PyObject_HEAD
6924 long value;
6925} HeapCTypeSetattrObject;
6926
6927static struct PyMemberDef heapctypesetattr_members[] = {
6928 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6929 {NULL} /* Sentinel */
6930};
6931
6932static int
6933heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6934{
6935 ((HeapCTypeSetattrObject *)self)->value = 10;
6936 return 0;
6937}
6938
6939static void
6940heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6941{
6942 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006943 PyObject_Free(self);
scoder148f3292020-07-03 02:09:28 +02006944 Py_DECREF(tp);
6945}
6946
6947static int
6948heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6949{
6950 PyObject *svalue = PyUnicode_FromString("value");
6951 if (svalue == NULL)
6952 return -1;
6953 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6954 Py_DECREF(svalue);
6955 if (eq < 0)
6956 return -1;
6957 if (!eq) {
6958 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6959 }
6960 if (value == NULL) {
6961 self->value = 0;
6962 return 0;
6963 }
6964 PyObject *ivalue = PyNumber_Long(value);
6965 if (ivalue == NULL)
6966 return -1;
6967 long v = PyLong_AsLong(ivalue);
6968 Py_DECREF(ivalue);
6969 if (v == -1 && PyErr_Occurred())
6970 return -1;
6971 self->value = v;
6972 return 0;
6973}
6974
6975static PyType_Slot HeapCTypeSetattr_slots[] = {
6976 {Py_tp_init, heapctypesetattr_init},
6977 {Py_tp_members, heapctypesetattr_members},
6978 {Py_tp_setattro, heapctypesetattr_setattro},
6979 {Py_tp_dealloc, heapctypesetattr_dealloc},
6980 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6981 {0, 0},
6982};
6983
6984static PyType_Spec HeapCTypeSetattr_spec = {
6985 "_testcapi.HeapCTypeSetattr",
6986 sizeof(HeapCTypeSetattrObject),
6987 0,
6988 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6989 HeapCTypeSetattr_slots
6990};
6991
Petr Viktorinf9583772019-09-10 12:21:09 +01006992static PyMethodDef meth_instance_methods[] = {
6993 {"meth_varargs", meth_varargs, METH_VARARGS},
6994 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6995 {"meth_o", meth_o, METH_O},
6996 {"meth_noargs", meth_noargs, METH_NOARGS},
6997 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6998 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6999 {NULL, NULL} /* sentinel */
7000};
7001
7002
7003static PyTypeObject MethInstance_Type = {
7004 PyVarObject_HEAD_INIT(NULL, 0)
7005 "MethInstance",
7006 sizeof(PyObject),
7007 .tp_new = PyType_GenericNew,
7008 .tp_flags = Py_TPFLAGS_DEFAULT,
7009 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01007010 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01007011 "Class with normal (instance) methods to test calling conventions"),
7012};
7013
7014static PyMethodDef meth_class_methods[] = {
7015 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
7016 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
7017 {"meth_o", meth_o, METH_O|METH_CLASS},
7018 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
7019 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
7020 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
7021 {NULL, NULL} /* sentinel */
7022};
7023
7024
7025static PyTypeObject MethClass_Type = {
7026 PyVarObject_HEAD_INIT(NULL, 0)
7027 "MethClass",
7028 sizeof(PyObject),
7029 .tp_new = PyType_GenericNew,
7030 .tp_flags = Py_TPFLAGS_DEFAULT,
7031 .tp_methods = meth_class_methods,
7032 .tp_doc = PyDoc_STR(
7033 "Class with class methods to test calling conventions"),
7034};
7035
7036static PyMethodDef meth_static_methods[] = {
7037 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
7038 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
7039 {"meth_o", meth_o, METH_O|METH_STATIC},
7040 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
7041 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
7042 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
7043 {NULL, NULL} /* sentinel */
7044};
7045
7046
7047static PyTypeObject MethStatic_Type = {
7048 PyVarObject_HEAD_INIT(NULL, 0)
7049 "MethStatic",
7050 sizeof(PyObject),
7051 .tp_new = PyType_GenericNew,
7052 .tp_flags = Py_TPFLAGS_DEFAULT,
7053 .tp_methods = meth_static_methods,
7054 .tp_doc = PyDoc_STR(
7055 "Class with static methods to test calling conventions"),
7056};
7057
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007058/* ContainerNoGC -- a simple container without GC methods */
7059
7060typedef struct {
7061 PyObject_HEAD
7062 PyObject *value;
7063} ContainerNoGCobject;
7064
7065static PyObject *
7066ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
7067{
7068 PyObject *value;
7069 char *names[] = {"value", NULL};
7070 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
7071 return NULL;
7072 }
7073 PyObject *self = type->tp_alloc(type, 0);
7074 if (self == NULL) {
7075 return NULL;
7076 }
7077 Py_INCREF(value);
7078 ((ContainerNoGCobject *)self)->value = value;
7079 return self;
7080}
7081
7082static void
7083ContainerNoGC_dealloc(ContainerNoGCobject *self)
7084{
7085 Py_DECREF(self->value);
7086 Py_TYPE(self)->tp_free((PyObject *)self);
7087}
7088
7089static PyMemberDef ContainerNoGC_members[] = {
7090 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7091 PyDoc_STR("a container value for test purposes")},
7092 {0}
7093};
7094
7095static PyTypeObject ContainerNoGC_type = {
7096 PyVarObject_HEAD_INIT(NULL, 0)
7097 "_testcapi.ContainerNoGC",
7098 sizeof(ContainerNoGCobject),
7099 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7100 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7101 .tp_members = ContainerNoGC_members,
7102 .tp_new = ContainerNoGC_new,
7103};
7104
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007105
Martin v. Löwis1a214512008-06-11 05:26:20 +00007106static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 PyModuleDef_HEAD_INIT,
7108 "_testcapi",
7109 NULL,
7110 -1,
7111 TestMethods,
7112 NULL,
7113 NULL,
7114 NULL,
7115 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007116};
7117
Nick Coghland5cacbb2015-05-23 22:24:10 +10007118/* Per PEP 489, this module will not be converted to multi-phase initialization
7119 */
7120
Mark Hammond62b1ab12002-07-23 06:31:15 +00007121PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007122PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007124 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007126 m = PyModule_Create(&_testcapimodule);
7127 if (m == NULL)
7128 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007129
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007130 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007131
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007132 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133 Py_INCREF(&test_structmembersType);
7134 /* don't use a name starting with "test", since we don't want
7135 test_capi to automatically call this */
7136 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007137 if (PyType_Ready(&matmulType) < 0)
7138 return NULL;
7139 Py_INCREF(&matmulType);
7140 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007141 if (PyType_Ready(&ipowType) < 0) {
7142 return NULL;
7143 }
7144 Py_INCREF(&ipowType);
7145 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007146
Yury Selivanov75445082015-05-11 22:57:16 -04007147 if (PyType_Ready(&awaitType) < 0)
7148 return NULL;
7149 Py_INCREF(&awaitType);
7150 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7151
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007152 MyList_Type.tp_base = &PyList_Type;
7153 if (PyType_Ready(&MyList_Type) < 0)
7154 return NULL;
7155 Py_INCREF(&MyList_Type);
7156 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7157
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007158 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7159 return NULL;
7160 Py_INCREF(&MethodDescriptorBase_Type);
7161 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7162
7163 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7164 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7165 return NULL;
7166 Py_INCREF(&MethodDescriptorDerived_Type);
7167 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7168
7169 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7170 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7171 return NULL;
7172 Py_INCREF(&MethodDescriptorNopGet_Type);
7173 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7174
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007175 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7176 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7177 return NULL;
7178 Py_INCREF(&MethodDescriptor2_Type);
7179 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7180
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007181 if (PyType_Ready(&GenericAlias_Type) < 0)
7182 return NULL;
7183 Py_INCREF(&GenericAlias_Type);
7184 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7185
7186 if (PyType_Ready(&Generic_Type) < 0)
7187 return NULL;
7188 Py_INCREF(&Generic_Type);
7189 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7190
Petr Viktorinf9583772019-09-10 12:21:09 +01007191 if (PyType_Ready(&MethInstance_Type) < 0)
7192 return NULL;
7193 Py_INCREF(&MethInstance_Type);
7194 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7195
7196 if (PyType_Ready(&MethClass_Type) < 0)
7197 return NULL;
7198 Py_INCREF(&MethClass_Type);
7199 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7200
7201 if (PyType_Ready(&MethStatic_Type) < 0)
7202 return NULL;
7203 Py_INCREF(&MethStatic_Type);
7204 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7205
xdegaye56d1f5c2017-10-26 15:09:06 +02007206 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7207 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7208 return NULL;
7209 }
7210 Py_INCREF(&PyRecursingInfinitelyError_Type);
7211 PyModule_AddObject(m, "RecursingInfinitelyError",
7212 (PyObject *)&PyRecursingInfinitelyError_Type);
7213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7215 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7216 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7217 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7218 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7219 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7220 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7221 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7222 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7223 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7224 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7225 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7226 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7227 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7228 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7229 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007230 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7231 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7232 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007233 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7234 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007235 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236 Py_INCREF(&PyInstanceMethod_Type);
7237 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007238
Larry Hastings2a727912014-01-16 11:32:01 -08007239 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007240 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007241#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007242 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007243#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007244 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007245#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007246 Py_INCREF(v);
7247 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7250 Py_INCREF(TestError);
7251 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007252
Benjamin Peterson39403332020-09-02 11:29:06 -05007253 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7254 if (HeapDocCType == NULL) {
7255 return NULL;
7256 }
7257 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7258
Hai Shi88c2cfd2020-11-07 00:04:47 +08007259 /* bpo-41832: Add a new type to test PyType_FromSpec()
7260 now can accept a NULL tp_doc slot. */
7261 PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
7262 if (NullTpDocType == NULL) {
7263 return NULL;
7264 }
7265 PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
7266
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007267 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7268 if (HeapGcCType == NULL) {
7269 return NULL;
7270 }
7271 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7272
7273 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7274 if (HeapCType == NULL) {
7275 return NULL;
7276 }
7277 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7278 if (subclass_bases == NULL) {
7279 return NULL;
7280 }
7281 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7282 if (HeapCTypeSubclass == NULL) {
7283 return NULL;
7284 }
7285 Py_DECREF(subclass_bases);
7286 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7287
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007288 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7289 if (HeapCTypeWithDict == NULL) {
7290 return NULL;
7291 }
7292 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7293
7294 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7295 if (HeapCTypeWithNegativeDict == NULL) {
7296 return NULL;
7297 }
7298 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7299
7300 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7301 if (HeapCTypeWithWeakref == NULL) {
7302 return NULL;
7303 }
7304 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7305
scoderf7c4e232020-06-06 21:35:10 +02007306 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7307 if (HeapCTypeWithBuffer == NULL) {
7308 return NULL;
7309 }
7310 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7311
scoder148f3292020-07-03 02:09:28 +02007312 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7313 if (HeapCTypeSetattr == NULL) {
7314 return NULL;
7315 }
7316 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7317
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007318 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7319 if (subclass_with_finalizer_bases == NULL) {
7320 return NULL;
7321 }
7322 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7323 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7324 if (HeapCTypeSubclassWithFinalizer == NULL) {
7325 return NULL;
7326 }
7327 Py_DECREF(subclass_with_finalizer_bases);
7328 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7329
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007330 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7331 return NULL;
7332 }
7333 Py_INCREF(&ContainerNoGC_type);
7334 if (PyModule_AddObject(m, "ContainerNoGC",
7335 (PyObject *) &ContainerNoGC_type) < 0)
7336 return NULL;
7337
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007338 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007340}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007341
7342
7343/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7344
7345#undef Py_BuildValue
7346PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7347
7348static PyObject *
7349test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7350{
7351 PyObject *res;
7352 const char str[] = "string";
7353 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007354 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007355
7356 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7357 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007358 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007359 return NULL;
7360 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007361 PyErr_Clear();
7362
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007363 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7364 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007365 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007366 return NULL;
7367 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007368 PyErr_Clear();
7369
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007370 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7371 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007372 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007373 return NULL;
7374 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007375 PyErr_Clear();
7376
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007377 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7378 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007379 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007380 return NULL;
7381 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007382 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007383
7384
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007385 Py_RETURN_NONE;
7386}
Miss Islington (bot)569ca812021-05-06 20:18:42 -07007387
7388#undef PyArg_ParseTupleAndKeywords
7389PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
7390 const char *, char **, ...);
7391
7392static PyObject *
7393getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
7394{
7395 static char *keywords[] = {"", "x", NULL};
7396 const char *s;
7397 int len;
7398 int i = 0;
7399 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s#i", keywords, &s, &len, &i))
7400 return NULL;
7401 Py_RETURN_NONE;
7402}