blob: 9f25b64eb167134fedbc5d71eaaa38fed1cb2677 [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*
Pablo Galindo Salgadoe3aa9fd2021-11-17 23:17:18 +0000394pycompilestring(PyObject* self, PyObject *obj) {
395 if (PyBytes_CheckExact(obj) == 0) {
396 PyErr_SetString(PyExc_ValueError, "Argument must be a bytes object");
397 return NULL;
398 }
399 const char *the_string = PyBytes_AsString(obj);
400 if (the_string == NULL) {
401 return NULL;
402 }
403 return Py_CompileString(the_string, "blech", Py_file_input);
404}
405
406static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530407test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 PyTypeObject *type;
410 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000411 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 if (type->tp_dict != NULL)
416 /* The type has already been initialized. This probably means
417 -R is being used. */
418 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000419
420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 obj = PyObject_New(PyObject, type);
422 if (obj == NULL) {
423 PyErr_Clear();
424 PyErr_SetString(
425 TestError,
426 "test_lazy_hash_inheritance: failed to create object");
427 return NULL;
428 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 if (type->tp_dict != NULL) {
431 PyErr_SetString(
432 TestError,
433 "test_lazy_hash_inheritance: type initialised too soon");
434 Py_DECREF(obj);
435 return NULL;
436 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 hash = PyObject_Hash(obj);
439 if ((hash == -1) && PyErr_Occurred()) {
440 PyErr_Clear();
441 PyErr_SetString(
442 TestError,
443 "test_lazy_hash_inheritance: could not hash object");
444 Py_DECREF(obj);
445 return NULL;
446 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 if (type->tp_dict == NULL) {
449 PyErr_SetString(
450 TestError,
451 "test_lazy_hash_inheritance: type not initialised by hash()");
452 Py_DECREF(obj);
453 return NULL;
454 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 if (type->tp_hash != PyType_Type.tp_hash) {
457 PyErr_SetString(
458 TestError,
459 "test_lazy_hash_inheritance: unexpected hash function");
460 Py_DECREF(obj);
461 return NULL;
462 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000467}
468
469
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700470/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000471 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000472
473 Note that the meat of the test is contained in testcapi_long.h.
474 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700475 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000476 dependence on type names makes it impossible to use a parameterized
477 function. A giant macro would be even worse than this. A C++ template
478 would be perfect.
479
480 The "report an error" functions are deliberately not part of the #include
481 file: if the test fails, you can set a breakpoint in the appropriate
482 error function directly, and crawl back from there in the debugger.
483*/
484
485#define UNBIND(X) Py_DECREF(X); (X) = NULL
486
487static PyObject *
488raise_test_long_error(const char* msg)
489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000491}
492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493#define TESTNAME test_long_api_inner
494#define TYPENAME long
495#define F_S_TO_PY PyLong_FromLong
496#define F_PY_TO_S PyLong_AsLong
497#define F_U_TO_PY PyLong_FromUnsignedLong
498#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000499
500#include "testcapi_long.h"
501
502static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530503test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000506}
507
508#undef TESTNAME
509#undef TYPENAME
510#undef F_S_TO_PY
511#undef F_PY_TO_S
512#undef F_U_TO_PY
513#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000514
Tim Peters91621db2001-06-12 20:10:01 +0000515static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000516raise_test_longlong_error(const char* msg)
517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000519}
520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700522#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523#define F_S_TO_PY PyLong_FromLongLong
524#define F_PY_TO_S PyLong_AsLongLong
525#define F_U_TO_PY PyLong_FromUnsignedLongLong
526#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000527
528#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000529
530static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000531test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000534}
535
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000536#undef TESTNAME
537#undef TYPENAME
538#undef F_S_TO_PY
539#undef F_PY_TO_S
540#undef F_U_TO_PY
541#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000542
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000543/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
544 is tested by test_long_api_inner. This test will concentrate on proper
545 handling of overflow.
546*/
547
548static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530549test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 PyObject *num, *one, *temp;
552 long value;
553 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 /* Test that overflow is set properly for a large value. */
556 /* num is a number larger than LONG_MAX even on 64-bit platforms */
557 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
558 if (num == NULL)
559 return NULL;
560 overflow = 1234;
561 value = PyLong_AsLongAndOverflow(num, &overflow);
562 Py_DECREF(num);
563 if (value == -1 && PyErr_Occurred())
564 return NULL;
565 if (value != -1)
566 return raiseTestError("test_long_and_overflow",
567 "return value was not set to -1");
568 if (overflow != 1)
569 return raiseTestError("test_long_and_overflow",
570 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* Same again, with num = LONG_MAX + 1 */
573 num = PyLong_FromLong(LONG_MAX);
574 if (num == NULL)
575 return NULL;
576 one = PyLong_FromLong(1L);
577 if (one == NULL) {
578 Py_DECREF(num);
579 return NULL;
580 }
581 temp = PyNumber_Add(num, one);
582 Py_DECREF(one);
583 Py_DECREF(num);
584 num = temp;
585 if (num == NULL)
586 return NULL;
587 overflow = 0;
588 value = PyLong_AsLongAndOverflow(num, &overflow);
589 Py_DECREF(num);
590 if (value == -1 && PyErr_Occurred())
591 return NULL;
592 if (value != -1)
593 return raiseTestError("test_long_and_overflow",
594 "return value was not set to -1");
595 if (overflow != 1)
596 return raiseTestError("test_long_and_overflow",
597 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Test that overflow is set properly for a large negative value. */
600 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
601 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
602 if (num == NULL)
603 return NULL;
604 overflow = 1234;
605 value = PyLong_AsLongAndOverflow(num, &overflow);
606 Py_DECREF(num);
607 if (value == -1 && PyErr_Occurred())
608 return NULL;
609 if (value != -1)
610 return raiseTestError("test_long_and_overflow",
611 "return value was not set to -1");
612 if (overflow != -1)
613 return raiseTestError("test_long_and_overflow",
614 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* Same again, with num = LONG_MIN - 1 */
617 num = PyLong_FromLong(LONG_MIN);
618 if (num == NULL)
619 return NULL;
620 one = PyLong_FromLong(1L);
621 if (one == NULL) {
622 Py_DECREF(num);
623 return NULL;
624 }
625 temp = PyNumber_Subtract(num, one);
626 Py_DECREF(one);
627 Py_DECREF(num);
628 num = temp;
629 if (num == NULL)
630 return NULL;
631 overflow = 0;
632 value = PyLong_AsLongAndOverflow(num, &overflow);
633 Py_DECREF(num);
634 if (value == -1 && PyErr_Occurred())
635 return NULL;
636 if (value != -1)
637 return raiseTestError("test_long_and_overflow",
638 "return value was not set to -1");
639 if (overflow != -1)
640 return raiseTestError("test_long_and_overflow",
641 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Test that overflow is cleared properly for small values. */
644 num = PyLong_FromString("FF", NULL, 16);
645 if (num == NULL)
646 return NULL;
647 overflow = 1234;
648 value = PyLong_AsLongAndOverflow(num, &overflow);
649 Py_DECREF(num);
650 if (value == -1 && PyErr_Occurred())
651 return NULL;
652 if (value != 0xFF)
653 return raiseTestError("test_long_and_overflow",
654 "expected return value 0xFF");
655 if (overflow != 0)
656 return raiseTestError("test_long_and_overflow",
657 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 num = PyLong_FromString("-FF", NULL, 16);
660 if (num == NULL)
661 return NULL;
662 overflow = 0;
663 value = PyLong_AsLongAndOverflow(num, &overflow);
664 Py_DECREF(num);
665 if (value == -1 && PyErr_Occurred())
666 return NULL;
667 if (value != -0xFF)
668 return raiseTestError("test_long_and_overflow",
669 "expected return value 0xFF");
670 if (overflow != 0)
671 return raiseTestError("test_long_and_overflow",
672 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 num = PyLong_FromLong(LONG_MAX);
675 if (num == NULL)
676 return NULL;
677 overflow = 1234;
678 value = PyLong_AsLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != LONG_MAX)
683 return raiseTestError("test_long_and_overflow",
684 "expected return value LONG_MAX");
685 if (overflow != 0)
686 return raiseTestError("test_long_and_overflow",
687 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 num = PyLong_FromLong(LONG_MIN);
690 if (num == NULL)
691 return NULL;
692 overflow = 0;
693 value = PyLong_AsLongAndOverflow(num, &overflow);
694 Py_DECREF(num);
695 if (value == -1 && PyErr_Occurred())
696 return NULL;
697 if (value != LONG_MIN)
698 return raiseTestError("test_long_and_overflow",
699 "expected return value LONG_MIN");
700 if (overflow != 0)
701 return raiseTestError("test_long_and_overflow",
702 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000703
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200704 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000705}
706
Mark Dickinson93f562c2010-01-30 10:30:15 +0000707/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700708 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000709 concentrate on proper handling of overflow.
710*/
711
712static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530713test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700716 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500720 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
722 if (num == NULL)
723 return NULL;
724 overflow = 1234;
725 value = PyLong_AsLongLongAndOverflow(num, &overflow);
726 Py_DECREF(num);
727 if (value == -1 && PyErr_Occurred())
728 return NULL;
729 if (value != -1)
730 return raiseTestError("test_long_long_and_overflow",
731 "return value was not set to -1");
732 if (overflow != 1)
733 return raiseTestError("test_long_long_and_overflow",
734 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000735
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500736 /* Same again, with num = LLONG_MAX + 1 */
737 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 if (num == NULL)
739 return NULL;
740 one = PyLong_FromLong(1L);
741 if (one == NULL) {
742 Py_DECREF(num);
743 return NULL;
744 }
745 temp = PyNumber_Add(num, one);
746 Py_DECREF(one);
747 Py_DECREF(num);
748 num = temp;
749 if (num == NULL)
750 return NULL;
751 overflow = 0;
752 value = PyLong_AsLongLongAndOverflow(num, &overflow);
753 Py_DECREF(num);
754 if (value == -1 && PyErr_Occurred())
755 return NULL;
756 if (value != -1)
757 return raiseTestError("test_long_long_and_overflow",
758 "return value was not set to -1");
759 if (overflow != 1)
760 return raiseTestError("test_long_long_and_overflow",
761 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500764 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
766 if (num == NULL)
767 return NULL;
768 overflow = 1234;
769 value = PyLong_AsLongLongAndOverflow(num, &overflow);
770 Py_DECREF(num);
771 if (value == -1 && PyErr_Occurred())
772 return NULL;
773 if (value != -1)
774 return raiseTestError("test_long_long_and_overflow",
775 "return value was not set to -1");
776 if (overflow != -1)
777 return raiseTestError("test_long_long_and_overflow",
778 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000779
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500780 /* Same again, with num = LLONG_MIN - 1 */
781 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 if (num == NULL)
783 return NULL;
784 one = PyLong_FromLong(1L);
785 if (one == NULL) {
786 Py_DECREF(num);
787 return NULL;
788 }
789 temp = PyNumber_Subtract(num, one);
790 Py_DECREF(one);
791 Py_DECREF(num);
792 num = temp;
793 if (num == NULL)
794 return NULL;
795 overflow = 0;
796 value = PyLong_AsLongLongAndOverflow(num, &overflow);
797 Py_DECREF(num);
798 if (value == -1 && PyErr_Occurred())
799 return NULL;
800 if (value != -1)
801 return raiseTestError("test_long_long_and_overflow",
802 "return value was not set to -1");
803 if (overflow != -1)
804 return raiseTestError("test_long_long_and_overflow",
805 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 /* Test that overflow is cleared properly for small values. */
808 num = PyLong_FromString("FF", NULL, 16);
809 if (num == NULL)
810 return NULL;
811 overflow = 1234;
812 value = PyLong_AsLongLongAndOverflow(num, &overflow);
813 Py_DECREF(num);
814 if (value == -1 && PyErr_Occurred())
815 return NULL;
816 if (value != 0xFF)
817 return raiseTestError("test_long_long_and_overflow",
818 "expected return value 0xFF");
819 if (overflow != 0)
820 return raiseTestError("test_long_long_and_overflow",
821 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 num = PyLong_FromString("-FF", NULL, 16);
824 if (num == NULL)
825 return NULL;
826 overflow = 0;
827 value = PyLong_AsLongLongAndOverflow(num, &overflow);
828 Py_DECREF(num);
829 if (value == -1 && PyErr_Occurred())
830 return NULL;
831 if (value != -0xFF)
832 return raiseTestError("test_long_long_and_overflow",
833 "expected return value 0xFF");
834 if (overflow != 0)
835 return raiseTestError("test_long_long_and_overflow",
836 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000837
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500838 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (num == NULL)
840 return NULL;
841 overflow = 1234;
842 value = PyLong_AsLongLongAndOverflow(num, &overflow);
843 Py_DECREF(num);
844 if (value == -1 && PyErr_Occurred())
845 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500846 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500848 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 if (overflow != 0)
850 return raiseTestError("test_long_long_and_overflow",
851 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000852
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500853 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 if (num == NULL)
855 return NULL;
856 overflow = 0;
857 value = PyLong_AsLongLongAndOverflow(num, &overflow);
858 Py_DECREF(num);
859 if (value == -1 && PyErr_Occurred())
860 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500861 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500863 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 if (overflow != 0)
865 return raiseTestError("test_long_long_and_overflow",
866 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000867
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200868 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000869}
870
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200871/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
872 non-integer arguments are handled correctly. It should be extended to
873 test overflow handling.
874 */
875
876static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530877test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200878{
879 size_t out_u;
880 Py_ssize_t out_s;
881
882 Py_INCREF(Py_None);
883
884 out_u = PyLong_AsSize_t(Py_None);
885 if (out_u != (size_t)-1 || !PyErr_Occurred())
886 return raiseTestError("test_long_as_size_t",
887 "PyLong_AsSize_t(None) didn't complain");
888 if (!PyErr_ExceptionMatches(PyExc_TypeError))
889 return raiseTestError("test_long_as_size_t",
890 "PyLong_AsSize_t(None) raised "
891 "something other than TypeError");
892 PyErr_Clear();
893
894 out_s = PyLong_AsSsize_t(Py_None);
895 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
896 return raiseTestError("test_long_as_size_t",
897 "PyLong_AsSsize_t(None) didn't complain");
898 if (!PyErr_ExceptionMatches(PyExc_TypeError))
899 return raiseTestError("test_long_as_size_t",
900 "PyLong_AsSsize_t(None) raised "
901 "something other than TypeError");
902 PyErr_Clear();
903
904 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
905 return Py_None;
906}
907
Zackery Spytzdc247652019-06-06 14:39:23 -0600908static PyObject *
909test_long_as_unsigned_long_long_mask(PyObject *self,
910 PyObject *Py_UNUSED(ignored))
911{
912 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
913
914 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
915 return raiseTestError("test_long_as_unsigned_long_long_mask",
916 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
917 "complain");
918 }
919 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
920 return raiseTestError("test_long_as_unsigned_long_long_mask",
921 "PyLong_AsUnsignedLongLongMask(NULL) raised "
922 "something other than SystemError");
923 }
924 PyErr_Clear();
925 Py_RETURN_NONE;
926}
927
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200928/* Test the PyLong_AsDouble API. At present this just tests that
929 non-integer arguments are handled correctly.
930 */
931
932static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530933test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200934{
935 double out;
936
937 Py_INCREF(Py_None);
938
939 out = PyLong_AsDouble(Py_None);
940 if (out != -1.0 || !PyErr_Occurred())
941 return raiseTestError("test_long_as_double",
942 "PyLong_AsDouble(None) didn't complain");
943 if (!PyErr_ExceptionMatches(PyExc_TypeError))
944 return raiseTestError("test_long_as_double",
945 "PyLong_AsDouble(None) raised "
946 "something other than TypeError");
947 PyErr_Clear();
948
949 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
950 return Py_None;
951}
952
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700953/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000954 for both long and int arguments. The test may leak a little memory if
955 it fails.
956*/
957static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530958test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700961 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 tuple = PyTuple_New(1);
964 if (tuple == NULL)
965 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 num = PyLong_FromLong(42);
968 if (num == NULL)
969 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300974 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300976 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 if (value != 42)
978 return raiseTestError("test_L_code",
979 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 Py_DECREF(num);
982 num = PyLong_FromLong(42);
983 if (num == NULL)
984 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300989 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300991 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 if (value != 42)
993 return raiseTestError("test_L_code",
994 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200997 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000998}
999
Serhiy Storchakace412872016-05-08 23:36:44 +03001000static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03001001return_none(void *unused)
1002{
1003 Py_RETURN_NONE;
1004}
1005
1006static PyObject *
1007raise_error(void *unused)
1008{
1009 PyErr_SetNone(PyExc_ValueError);
1010 return NULL;
1011}
1012
1013static int
1014test_buildvalue_N_error(const char *fmt)
1015{
1016 PyObject *arg, *res;
1017
1018 arg = PyList_New(0);
1019 if (arg == NULL) {
1020 return -1;
1021 }
1022
1023 Py_INCREF(arg);
1024 res = Py_BuildValue(fmt, return_none, NULL, arg);
1025 if (res == NULL) {
1026 return -1;
1027 }
1028 Py_DECREF(res);
1029 if (Py_REFCNT(arg) != 1) {
1030 PyErr_Format(TestError, "test_buildvalue_N: "
1031 "arg was not decrefed in successful "
1032 "Py_BuildValue(\"%s\")", fmt);
1033 return -1;
1034 }
1035
1036 Py_INCREF(arg);
1037 res = Py_BuildValue(fmt, raise_error, NULL, arg);
1038 if (res != NULL || !PyErr_Occurred()) {
1039 PyErr_Format(TestError, "test_buildvalue_N: "
1040 "Py_BuildValue(\"%s\") didn't complain", fmt);
1041 return -1;
1042 }
1043 PyErr_Clear();
1044 if (Py_REFCNT(arg) != 1) {
1045 PyErr_Format(TestError, "test_buildvalue_N: "
1046 "arg was not decrefed in failed "
1047 "Py_BuildValue(\"%s\")", fmt);
1048 return -1;
1049 }
1050 Py_DECREF(arg);
1051 return 0;
1052}
1053
1054static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02001055test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03001056{
1057 PyObject *arg, *res;
1058
1059 arg = PyList_New(0);
1060 if (arg == NULL) {
1061 return NULL;
1062 }
1063 Py_INCREF(arg);
1064 res = Py_BuildValue("N", arg);
1065 if (res == NULL) {
1066 return NULL;
1067 }
1068 if (res != arg) {
1069 return raiseTestError("test_buildvalue_N",
1070 "Py_BuildValue(\"N\") returned wrong result");
1071 }
1072 if (Py_REFCNT(arg) != 2) {
1073 return raiseTestError("test_buildvalue_N",
1074 "arg was not decrefed in Py_BuildValue(\"N\")");
1075 }
1076 Py_DECREF(res);
1077 Py_DECREF(arg);
1078
1079 if (test_buildvalue_N_error("O&N") < 0)
1080 return NULL;
1081 if (test_buildvalue_N_error("(O&N)") < 0)
1082 return NULL;
1083 if (test_buildvalue_N_error("[O&N]") < 0)
1084 return NULL;
1085 if (test_buildvalue_N_error("{O&N}") < 0)
1086 return NULL;
1087 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1088 return NULL;
1089
1090 Py_RETURN_NONE;
1091}
1092
1093
1094static PyObject *
Hai Shia13b26c2020-11-11 04:53:46 +08001095test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1096{
1097 newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1098 if (PyLong_Type.tp_new != tp_new) {
1099 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1100 return NULL;
1101 }
1102
1103 reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1104 if (PyLong_Type.tp_repr != tp_repr) {
1105 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1106 return NULL;
1107 }
1108
1109 ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1110 if (tp_call != NULL) {
1111 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1112 return NULL;
1113 }
1114
1115 binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1116 if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1117 PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1118 return NULL;
1119 }
1120
1121 lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1122 if (mp_length != NULL) {
1123 PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1124 return NULL;
1125 }
1126
1127 void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1128 if (over_value != NULL) {
1129 PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1130 return NULL;
1131 }
1132
1133 tp_new = PyType_GetSlot(&PyLong_Type, 0);
1134 if (tp_new != NULL) {
1135 PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1136 return NULL;
1137 }
1138 if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1139 // This is the right exception
1140 PyErr_Clear();
1141 }
1142 else {
1143 return NULL;
1144 }
1145
1146 Py_RETURN_NONE;
1147}
1148
1149
1150static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001151get_args(PyObject *self, PyObject *args)
1152{
1153 if (args == NULL) {
1154 args = Py_None;
1155 }
1156 Py_INCREF(args);
1157 return args;
1158}
1159
1160static PyObject *
1161get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1162{
1163 if (kwargs == NULL) {
1164 kwargs = Py_None;
1165 }
1166 Py_INCREF(kwargs);
1167 return kwargs;
1168}
1169
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001170/* Test tuple argument processing */
1171static PyObject *
1172getargs_tuple(PyObject *self, PyObject *args)
1173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 int a, b, c;
1175 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1176 return NULL;
1177 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001178}
1179
Christian Heimes380f7f22008-02-28 11:19:05 +00001180/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001181static PyObject *
1182getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001185 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1189 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1190 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1191 return NULL;
1192 return Py_BuildValue("iiiiiiiiii",
1193 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1194 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001195}
1196
Larry Hastings83a9f482012-03-20 20:06:16 +00001197/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1198static PyObject *
1199getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1200{
1201 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1202 int required = -1;
1203 int optional = -1;
1204 int keyword_only = -1;
1205
1206 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1207 &required, &optional, &keyword_only))
1208 return NULL;
1209 return Py_BuildValue("iii", required, optional, keyword_only);
1210}
1211
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001212/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1213static PyObject *
1214getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1215{
1216 static char *keywords[] = {"", "", "keyword", NULL};
1217 int required = -1;
1218 int optional = -1;
1219 int keyword = -1;
1220
1221 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1222 &required, &optional, &keyword))
1223 return NULL;
1224 return Py_BuildValue("iii", required, optional, keyword);
1225}
1226
Thomas Heller3457e4b2003-04-24 16:14:27 +00001227/* Functions to call PyArg_ParseTuple with integer format codes,
1228 and return the result.
1229*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001230static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001231getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 unsigned char value;
1234 if (!PyArg_ParseTuple(args, "b", &value))
1235 return NULL;
1236 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001237}
1238
Thomas Heller3457e4b2003-04-24 16:14:27 +00001239static PyObject *
1240getargs_B(PyObject *self, PyObject *args)
1241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 unsigned char value;
1243 if (!PyArg_ParseTuple(args, "B", &value))
1244 return NULL;
1245 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001246}
1247
1248static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001249getargs_h(PyObject *self, PyObject *args)
1250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 short value;
1252 if (!PyArg_ParseTuple(args, "h", &value))
1253 return NULL;
1254 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001255}
1256
1257static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001258getargs_H(PyObject *self, PyObject *args)
1259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 unsigned short value;
1261 if (!PyArg_ParseTuple(args, "H", &value))
1262 return NULL;
1263 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001264}
1265
1266static PyObject *
1267getargs_I(PyObject *self, PyObject *args)
1268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 unsigned int value;
1270 if (!PyArg_ParseTuple(args, "I", &value))
1271 return NULL;
1272 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001273}
1274
1275static PyObject *
1276getargs_k(PyObject *self, PyObject *args)
1277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 unsigned long value;
1279 if (!PyArg_ParseTuple(args, "k", &value))
1280 return NULL;
1281 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001282}
1283
1284static PyObject *
1285getargs_i(PyObject *self, PyObject *args)
1286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 int value;
1288 if (!PyArg_ParseTuple(args, "i", &value))
1289 return NULL;
1290 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001291}
1292
Thomas Hellera4ea6032003-04-17 18:55:45 +00001293static PyObject *
1294getargs_l(PyObject *self, PyObject *args)
1295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 long value;
1297 if (!PyArg_ParseTuple(args, "l", &value))
1298 return NULL;
1299 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001300}
1301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001302static PyObject *
1303getargs_n(PyObject *self, PyObject *args)
1304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 Py_ssize_t value;
1306 if (!PyArg_ParseTuple(args, "n", &value))
1307 return NULL;
1308 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309}
1310
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001311static PyObject *
1312getargs_p(PyObject *self, PyObject *args)
1313{
1314 int value;
1315 if (!PyArg_ParseTuple(args, "p", &value))
1316 return NULL;
1317 return PyLong_FromLong(value);
1318}
1319
Thomas Hellera4ea6032003-04-17 18:55:45 +00001320static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001321getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001322{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001323 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 if (!PyArg_ParseTuple(args, "L", &value))
1325 return NULL;
1326 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001327}
1328
Thomas Hellera4ea6032003-04-17 18:55:45 +00001329static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001330getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001331{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001332 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 if (!PyArg_ParseTuple(args, "K", &value))
1334 return NULL;
1335 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001336}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001337
1338/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001339 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001340static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301341test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyObject *tuple, *num;
1344 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 tuple = PyTuple_New(1);
1347 if (tuple == NULL)
1348 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 /* a number larger than ULONG_MAX even on 64-bit platforms */
1351 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1352 if (num == NULL)
1353 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 value = PyLong_AsUnsignedLongMask(num);
1356 if (value != ULONG_MAX)
1357 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001358 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001363 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001365 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 if (value != ULONG_MAX)
1367 return raiseTestError("test_k_code",
1368 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 Py_DECREF(num);
1371 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1372 if (num == NULL)
1373 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 value = PyLong_AsUnsignedLongMask(num);
1376 if (value != (unsigned long)-0x42)
1377 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001378 "PyLong_AsUnsignedLongMask() returned wrong "
1379 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001384 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 if (value != (unsigned long)-0x42)
1388 return raiseTestError("test_k_code",
1389 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001392 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001393}
1394
Victor Stinner06e49dd2010-06-13 18:21:50 +00001395static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001396getargs_f(PyObject *self, PyObject *args)
1397{
1398 float f;
1399 if (!PyArg_ParseTuple(args, "f", &f))
1400 return NULL;
1401 return PyFloat_FromDouble(f);
1402}
1403
1404static PyObject *
1405getargs_d(PyObject *self, PyObject *args)
1406{
1407 double d;
1408 if (!PyArg_ParseTuple(args, "d", &d))
1409 return NULL;
1410 return PyFloat_FromDouble(d);
1411}
1412
1413static PyObject *
1414getargs_D(PyObject *self, PyObject *args)
1415{
1416 Py_complex cval;
1417 if (!PyArg_ParseTuple(args, "D", &cval))
1418 return NULL;
1419 return PyComplex_FromCComplex(cval);
1420}
1421
1422static PyObject *
1423getargs_S(PyObject *self, PyObject *args)
1424{
1425 PyObject *obj;
1426 if (!PyArg_ParseTuple(args, "S", &obj))
1427 return NULL;
1428 Py_INCREF(obj);
1429 return obj;
1430}
1431
1432static PyObject *
1433getargs_Y(PyObject *self, PyObject *args)
1434{
1435 PyObject *obj;
1436 if (!PyArg_ParseTuple(args, "Y", &obj))
1437 return NULL;
1438 Py_INCREF(obj);
1439 return obj;
1440}
1441
1442static PyObject *
1443getargs_U(PyObject *self, PyObject *args)
1444{
1445 PyObject *obj;
1446 if (!PyArg_ParseTuple(args, "U", &obj))
1447 return NULL;
1448 Py_INCREF(obj);
1449 return obj;
1450}
1451
1452static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001453getargs_c(PyObject *self, PyObject *args)
1454{
1455 char c;
1456 if (!PyArg_ParseTuple(args, "c", &c))
1457 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001458 return PyLong_FromLong((unsigned char)c);
1459}
1460
1461static PyObject *
1462getargs_C(PyObject *self, PyObject *args)
1463{
1464 int c;
1465 if (!PyArg_ParseTuple(args, "C", &c))
1466 return NULL;
1467 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001468}
1469
1470static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001471getargs_s(PyObject *self, PyObject *args)
1472{
1473 char *str;
1474 if (!PyArg_ParseTuple(args, "s", &str))
1475 return NULL;
1476 return PyBytes_FromString(str);
1477}
1478
1479static PyObject *
1480getargs_s_star(PyObject *self, PyObject *args)
1481{
1482 Py_buffer buffer;
1483 PyObject *bytes;
1484 if (!PyArg_ParseTuple(args, "s*", &buffer))
1485 return NULL;
1486 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1487 PyBuffer_Release(&buffer);
1488 return bytes;
1489}
1490
1491static PyObject *
1492getargs_s_hash(PyObject *self, PyObject *args)
1493{
1494 char *str;
1495 Py_ssize_t size;
1496 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1497 return NULL;
1498 return PyBytes_FromStringAndSize(str, size);
1499}
1500
1501static PyObject *
1502getargs_z(PyObject *self, PyObject *args)
1503{
1504 char *str;
1505 if (!PyArg_ParseTuple(args, "z", &str))
1506 return NULL;
1507 if (str != NULL)
1508 return PyBytes_FromString(str);
1509 else
1510 Py_RETURN_NONE;
1511}
1512
1513static PyObject *
1514getargs_z_star(PyObject *self, PyObject *args)
1515{
1516 Py_buffer buffer;
1517 PyObject *bytes;
1518 if (!PyArg_ParseTuple(args, "z*", &buffer))
1519 return NULL;
1520 if (buffer.buf != NULL)
1521 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1522 else {
1523 Py_INCREF(Py_None);
1524 bytes = Py_None;
1525 }
1526 PyBuffer_Release(&buffer);
1527 return bytes;
1528}
1529
1530static PyObject *
1531getargs_z_hash(PyObject *self, PyObject *args)
1532{
1533 char *str;
1534 Py_ssize_t size;
1535 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1536 return NULL;
1537 if (str != NULL)
1538 return PyBytes_FromStringAndSize(str, size);
1539 else
1540 Py_RETURN_NONE;
1541}
1542
1543static PyObject *
1544getargs_y(PyObject *self, PyObject *args)
1545{
1546 char *str;
1547 if (!PyArg_ParseTuple(args, "y", &str))
1548 return NULL;
1549 return PyBytes_FromString(str);
1550}
1551
1552static PyObject *
1553getargs_y_star(PyObject *self, PyObject *args)
1554{
1555 Py_buffer buffer;
1556 PyObject *bytes;
1557 if (!PyArg_ParseTuple(args, "y*", &buffer))
1558 return NULL;
1559 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1560 PyBuffer_Release(&buffer);
1561 return bytes;
1562}
1563
1564static PyObject *
1565getargs_y_hash(PyObject *self, PyObject *args)
1566{
1567 char *str;
1568 Py_ssize_t size;
1569 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1570 return NULL;
1571 return PyBytes_FromStringAndSize(str, size);
1572}
1573
1574static PyObject *
1575getargs_u(PyObject *self, PyObject *args)
1576{
1577 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001578 if (!PyArg_ParseTuple(args, "u", &str))
1579 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001580 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001581}
1582
1583static PyObject *
1584getargs_u_hash(PyObject *self, PyObject *args)
1585{
1586 Py_UNICODE *str;
1587 Py_ssize_t size;
1588 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1589 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001590 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001591}
1592
1593static PyObject *
1594getargs_Z(PyObject *self, PyObject *args)
1595{
1596 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001597 if (!PyArg_ParseTuple(args, "Z", &str))
1598 return NULL;
1599 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001600 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001601 } else
1602 Py_RETURN_NONE;
1603}
1604
1605static PyObject *
1606getargs_Z_hash(PyObject *self, PyObject *args)
1607{
1608 Py_UNICODE *str;
1609 Py_ssize_t size;
1610 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1611 return NULL;
1612 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001613 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001614 else
1615 Py_RETURN_NONE;
1616}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001617
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001618static PyObject *
1619getargs_es(PyObject *self, PyObject *args)
1620{
1621 PyObject *arg, *result;
1622 const char *encoding = NULL;
1623 char *str;
1624
1625 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1626 return NULL;
1627 if (!PyArg_Parse(arg, "es", encoding, &str))
1628 return NULL;
1629 result = PyBytes_FromString(str);
1630 PyMem_Free(str);
1631 return result;
1632}
1633
1634static PyObject *
1635getargs_et(PyObject *self, PyObject *args)
1636{
1637 PyObject *arg, *result;
1638 const char *encoding = NULL;
1639 char *str;
1640
1641 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1642 return NULL;
1643 if (!PyArg_Parse(arg, "et", encoding, &str))
1644 return NULL;
1645 result = PyBytes_FromString(str);
1646 PyMem_Free(str);
1647 return result;
1648}
1649
1650static PyObject *
1651getargs_es_hash(PyObject *self, PyObject *args)
1652{
1653 PyObject *arg, *result;
1654 const char *encoding = NULL;
1655 PyByteArrayObject *buffer = NULL;
1656 char *str = NULL;
1657 Py_ssize_t size;
1658
1659 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1660 return NULL;
1661 if (buffer != NULL) {
1662 str = PyByteArray_AS_STRING(buffer);
1663 size = PyByteArray_GET_SIZE(buffer);
1664 }
1665 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1666 return NULL;
1667 result = PyBytes_FromStringAndSize(str, size);
1668 if (buffer == NULL)
1669 PyMem_Free(str);
1670 return result;
1671}
1672
1673static PyObject *
1674getargs_et_hash(PyObject *self, PyObject *args)
1675{
1676 PyObject *arg, *result;
1677 const char *encoding = NULL;
1678 PyByteArrayObject *buffer = NULL;
1679 char *str = NULL;
1680 Py_ssize_t size;
1681
1682 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1683 return NULL;
1684 if (buffer != NULL) {
1685 str = PyByteArray_AS_STRING(buffer);
1686 size = PyByteArray_GET_SIZE(buffer);
1687 }
1688 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1689 return NULL;
1690 result = PyBytes_FromStringAndSize(str, size);
1691 if (buffer == NULL)
1692 PyMem_Free(str);
1693 return result;
1694}
1695
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001696/* Test the s and z codes for PyArg_ParseTuple.
1697*/
1698static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301699test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001700{
1701 /* Unicode strings should be accepted */
1702 PyObject *tuple, *obj;
1703 char *value;
1704
1705 tuple = PyTuple_New(1);
1706 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001708
1709 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001711 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001713
1714 PyTuple_SET_ITEM(tuple, 0, obj);
1715
1716 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001718 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001719 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1720 return NULL;
1721 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001722
Oren Milmanba7d7362017-08-29 11:58:27 +03001723 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1724 return NULL;
1725 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001726
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001727 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001728 Py_RETURN_NONE;
1729}
1730
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001731static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001732parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001733{
Larry Hastings8f904da2012-06-22 03:56:29 -07001734 PyObject *sub_args;
1735 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001736 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001737 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001738
Larry Hastings8f904da2012-06-22 03:56:29 -07001739 Py_ssize_t i, size;
1740 char *keywords[8 + 1]; /* space for NULL at end */
1741 PyObject *o;
1742 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001743
Larry Hastings8f904da2012-06-22 03:56:29 -07001744 int result;
1745 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001746
Larry Hastings22701e82012-08-08 14:52:22 -07001747 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001748
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001749 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001750 &sub_args, &sub_kwargs,
1751 &sub_format, &sub_keywords))
1752 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001753
Larry Hastings8f904da2012-06-22 03:56:29 -07001754 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1755 PyErr_SetString(PyExc_ValueError,
1756 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1757 return NULL;
1758 }
1759
1760 memset(buffers, 0, sizeof(buffers));
1761 memset(converted, 0, sizeof(converted));
1762 memset(keywords, 0, sizeof(keywords));
1763
1764 size = PySequence_Fast_GET_SIZE(sub_keywords);
1765 if (size > 8) {
1766 PyErr_SetString(PyExc_ValueError,
1767 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1768 goto exit;
1769 }
1770
1771 for (i = 0; i < size; i++) {
1772 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1773 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1774 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001775 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001776 goto exit;
1777 }
1778 keywords[i] = PyBytes_AS_STRING(converted[i]);
1779 }
1780
1781 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1782 sub_format, keywords,
1783 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1784 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1785
1786 if (result) {
1787 return_value = Py_None;
1788 Py_INCREF(Py_None);
1789 }
1790
1791exit:
1792 size = sizeof(converted) / sizeof(converted[0]);
1793 for (i = 0; i < size; i++) {
1794 Py_XDECREF(converted[i]);
1795 }
1796 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001797}
1798
Benjamin Peterson92035012008-12-27 16:00:54 +00001799static volatile int x;
1800
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001801#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001802/* Ignore use of deprecated APIs */
1803_Py_COMP_DIAG_PUSH
1804_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1805
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001806/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1807 of an error.
1808*/
1809static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301810test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 PyObject *tuple, *obj;
1813 Py_UNICODE *value;
1814 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1817 /* Just use the macro and check that it compiles */
1818 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 tuple = PyTuple_New(1);
1821 if (tuple == NULL)
1822 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 obj = PyUnicode_Decode("test", strlen("test"),
1825 "ascii", NULL);
1826 if (obj == NULL)
1827 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001832 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001834 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 if (value != PyUnicode_AS_UNICODE(obj))
1836 return raiseTestError("test_u_code",
1837 "u code returned wrong value for u'test'");
1838 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001839 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001841 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 if (value != PyUnicode_AS_UNICODE(obj) ||
1843 len != PyUnicode_GET_SIZE(obj))
1844 return raiseTestError("test_u_code",
1845 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001848 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001849}
1850
Guido van Rossumfb67be22007-08-29 18:38:11 +00001851/* Test Z and Z# codes for PyArg_ParseTuple */
1852static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301853test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001856 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 tuple = PyTuple_New(2);
1860 if (tuple == NULL)
1861 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 obj = PyUnicode_FromString("test");
1864 PyTuple_SET_ITEM(tuple, 0, obj);
1865 Py_INCREF(Py_None);
1866 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 /* swap values on purpose */
1869 value1 = NULL;
1870 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001873 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (value1 != PyUnicode_AS_UNICODE(obj))
1877 return raiseTestError("test_Z_code",
1878 "Z code returned wrong value for 'test'");
1879 if (value2 != NULL)
1880 return raiseTestError("test_Z_code",
1881 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 value1 = NULL;
1884 value2 = PyUnicode_AS_UNICODE(obj);
1885 len1 = -1;
1886 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001889 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1890 &value2, &len2))
1891 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001893 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1895 len1 != PyUnicode_GET_SIZE(obj))
1896 return raiseTestError("test_Z_code",
1897 "Z# code returned wrong values for 'test'");
1898 if (value2 != NULL ||
1899 len2 != 0)
1900 return raiseTestError("test_Z_code",
1901 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 Py_DECREF(tuple);
1904 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001905}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001906_Py_COMP_DIAG_POP
1907#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001908
Thomas Wouters477c8d52006-05-27 19:21:47 +00001909static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301910test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001911{
1912#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1914 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001915 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001916#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1918 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1923 if (wide == NULL)
1924 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1927 if (utf8 == NULL) {
1928 Py_DECREF(wide);
1929 return NULL;
1930 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001931
Victor Stinner8ef18872011-11-21 02:06:57 +01001932 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 Py_DECREF(wide);
1934 Py_DECREF(utf8);
1935 return raiseTestError("test_widechar",
1936 "wide string and utf8 string "
1937 "have different length");
1938 }
1939 if (PyUnicode_Compare(wide, utf8)) {
1940 Py_DECREF(wide);
1941 Py_DECREF(utf8);
1942 if (PyErr_Occurred())
1943 return NULL;
1944 return raiseTestError("test_widechar",
1945 "wide string and utf8 string "
1946 "are different");
1947 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 Py_DECREF(wide);
1950 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001951
1952#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1953 wide = PyUnicode_FromWideChar(invalid, 1);
1954 if (wide == NULL)
1955 PyErr_Clear();
1956 else
1957 return raiseTestError("test_widechar",
1958 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1959
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001960#if USE_UNICODE_WCHAR_CACHE
1961/* Ignore use of deprecated APIs */
1962_Py_COMP_DIAG_PUSH
1963_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001964 wide = PyUnicode_FromUnicode(invalid, 1);
1965 if (wide == NULL)
1966 PyErr_Clear();
1967 else
1968 return raiseTestError("test_widechar",
1969 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001970
1971 wide = PyUnicode_FromUnicode(NULL, 1);
1972 if (wide == NULL)
1973 return NULL;
1974 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001975 if (_PyUnicode_Ready(wide) < 0) {
1976 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001977 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001978 }
1979 else {
1980 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001981 return raiseTestError("test_widechar",
1982 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001983 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001984_Py_COMP_DIAG_POP
1985#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001986#endif
1987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001989}
1990
1991static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001992unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001993{
1994 PyObject *unicode, *result;
1995 Py_ssize_t buflen, size;
1996 wchar_t *buffer;
1997
1998 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1999 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02002000 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00002001 if (buffer == NULL)
2002 return PyErr_NoMemory();
2003
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002004 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00002005 if (size == -1) {
2006 PyMem_Free(buffer);
2007 return NULL;
2008 }
2009
2010 if (size < buflen)
2011 buflen = size + 1;
2012 else
2013 buflen = size;
2014 result = PyUnicode_FromWideChar(buffer, buflen);
2015 PyMem_Free(buffer);
2016 if (result == NULL)
2017 return NULL;
2018
2019 return Py_BuildValue("(Nn)", result, size);
2020}
2021
2022static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00002023unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00002024{
2025 PyObject *unicode, *result;
2026 Py_ssize_t size;
2027 wchar_t *buffer;
2028
2029 if (!PyArg_ParseTuple(args, "U", &unicode))
2030 return NULL;
2031
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00002032 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00002033 if (buffer == NULL)
2034 return NULL;
2035
2036 result = PyUnicode_FromWideChar(buffer, size + 1);
2037 PyMem_Free(buffer);
2038 if (result == NULL)
2039 return NULL;
2040 return Py_BuildValue("(Nn)", result, size);
2041}
2042
2043static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03002044unicode_asucs4(PyObject *self, PyObject *args)
2045{
2046 PyObject *unicode, *result;
2047 Py_UCS4 *buffer;
2048 int copy_null;
2049 Py_ssize_t str_len, buf_len;
2050
2051 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
2052 return NULL;
2053 }
2054
2055 buf_len = str_len + 1;
2056 buffer = PyMem_NEW(Py_UCS4, buf_len);
2057 if (buffer == NULL) {
2058 return PyErr_NoMemory();
2059 }
2060 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
2061 buffer[str_len] = 0xffffU;
2062
2063 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
Victor Stinner00d7abd2020-12-01 09:56:42 +01002064 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002065 return NULL;
2066 }
2067
2068 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
Victor Stinner00d7abd2020-12-01 09:56:42 +01002069 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002070 return result;
2071}
2072
2073static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05002074unicode_asutf8(PyObject *self, PyObject *args)
2075{
2076 PyObject *unicode;
2077 const char *buffer;
2078
2079 if (!PyArg_ParseTuple(args, "U", &unicode)) {
2080 return NULL;
2081 }
2082
2083 buffer = PyUnicode_AsUTF8(unicode);
2084 if (buffer == NULL) {
2085 return NULL;
2086 }
2087
2088 return PyBytes_FromString(buffer);
2089}
2090
2091static PyObject *
2092unicode_asutf8andsize(PyObject *self, PyObject *args)
2093{
2094 PyObject *unicode, *result;
2095 const char *buffer;
2096 Py_ssize_t utf8_len;
2097
2098 if(!PyArg_ParseTuple(args, "U", &unicode)) {
2099 return NULL;
2100 }
2101
Victor Stinneraca8c402019-09-30 21:14:26 +02002102 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05002103 if (buffer == NULL) {
2104 return NULL;
2105 }
2106
2107 result = PyBytes_FromString(buffer);
2108 if (result == NULL) {
2109 return NULL;
2110 }
2111
2112 return Py_BuildValue("(Nn)", result, utf8_len);
2113}
2114
2115static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08002116unicode_findchar(PyObject *self, PyObject *args)
2117{
2118 PyObject *str;
2119 int direction;
2120 unsigned int ch;
2121 Py_ssize_t result;
2122 Py_ssize_t start, end;
2123
2124 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2125 &start, &end, &direction)) {
2126 return NULL;
2127 }
2128
2129 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2130 if (result == -2)
2131 return NULL;
2132 else
2133 return PyLong_FromSsize_t(result);
2134}
2135
2136static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002137unicode_copycharacters(PyObject *self, PyObject *args)
2138{
2139 PyObject *from, *to, *to_copy;
2140 Py_ssize_t from_start, to_start, how_many, copied;
2141
2142 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2143 &from, &from_start, &how_many)) {
2144 return NULL;
2145 }
2146
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002147 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2148 PyUnicode_MAX_CHAR_VALUE(to)))) {
2149 return NULL;
2150 }
2151 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2152 Py_DECREF(to_copy);
2153 return NULL;
2154 }
2155
2156 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2157 from_start, how_many)) < 0) {
2158 Py_DECREF(to_copy);
2159 return NULL;
2160 }
2161
2162 return Py_BuildValue("(Nn)", to_copy, copied);
2163}
2164
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002165#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002166/* Ignore use of deprecated APIs */
2167_Py_COMP_DIAG_PUSH
2168_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2169
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002170static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002171unicode_encodedecimal(PyObject *self, PyObject *args)
2172{
2173 Py_UNICODE *unicode;
2174 Py_ssize_t length;
2175 char *errors = NULL;
2176 PyObject *decimal;
2177 Py_ssize_t decimal_length, new_length;
2178 int res;
2179
2180 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2181 return NULL;
2182
2183 decimal_length = length * 7; /* len('&#8364;') */
2184 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2185 if (decimal == NULL)
2186 return NULL;
2187
2188 res = PyUnicode_EncodeDecimal(unicode, length,
2189 PyBytes_AS_STRING(decimal),
2190 errors);
2191 if (res < 0) {
2192 Py_DECREF(decimal);
2193 return NULL;
2194 }
2195
2196 new_length = strlen(PyBytes_AS_STRING(decimal));
2197 assert(new_length <= decimal_length);
2198 res = _PyBytes_Resize(&decimal, new_length);
2199 if (res < 0)
2200 return NULL;
2201
2202 return decimal;
2203}
2204
2205static PyObject *
2206unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2207{
2208 Py_UNICODE *unicode;
2209 Py_ssize_t length;
2210 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2211 return NULL;
2212 return PyUnicode_TransformDecimalToASCII(unicode, length);
2213}
2214
2215static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002216unicode_legacy_string(PyObject *self, PyObject *args)
2217{
2218 Py_UNICODE *data;
2219 Py_ssize_t len;
2220 PyObject *u;
2221
2222 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2223 return NULL;
2224
2225 u = PyUnicode_FromUnicode(NULL, len);
2226 if (u == NULL)
2227 return NULL;
2228
2229 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2230
2231 if (len > 0) { /* The empty string is always ready. */
2232 assert(!PyUnicode_IS_READY(u));
2233 }
2234
2235 return u;
2236}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002237_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002238#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002239
2240static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002241getargs_w_star(PyObject *self, PyObject *args)
2242{
2243 Py_buffer buffer;
2244 PyObject *result;
2245 char *str;
2246
2247 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2248 return NULL;
2249
2250 if (2 <= buffer.len) {
2251 str = buffer.buf;
2252 str[0] = '[';
2253 str[buffer.len-1] = ']';
2254 }
2255
2256 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2257 PyBuffer_Release(&buffer);
2258 return result;
2259}
2260
2261
2262static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302263test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 /* Test that formats can begin with '|'. See issue #4720. */
2266 PyObject *tuple, *dict = NULL;
2267 static char *kwlist[] = {NULL};
2268 int result;
2269 tuple = PyTuple_New(0);
2270 if (!tuple)
2271 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002272 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 dict = PyDict_New();
2276 if (!dict)
2277 goto done;
2278 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002279 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 Py_DECREF(tuple);
2281 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002282 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002284 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 else {
2286 Py_RETURN_NONE;
2287 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002288}
2289
2290static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002291codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 const char *encoding, *errors = NULL;
2294 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2295 &encoding, &errors))
2296 return NULL;
2297 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002298}
2299
Thomas Wouters477c8d52006-05-27 19:21:47 +00002300static PyObject *
2301codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 const char *encoding, *errors = NULL;
2304 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2305 &encoding, &errors))
2306 return NULL;
2307 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002308}
2309
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002310
Tim Peters5b8132f2003-01-31 15:52:05 +00002311/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002312static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302313test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 struct triple {
2316 long input;
2317 size_t nbits;
2318 int sign;
2319 } testcases[] = {{0, 0, 0},
2320 {1L, 1, 1},
2321 {-1L, 1, -1},
2322 {2L, 2, 1},
2323 {-2L, 2, -1},
2324 {3L, 2, 1},
2325 {-3L, 2, -1},
2326 {4L, 3, 1},
2327 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002328 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 {-0x7fffL, 15, -1},
2330 {0xffffL, 16, 1},
2331 {-0xffffL, 16, -1},
2332 {0xfffffffL, 28, 1},
2333 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002334 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002335
Victor Stinner63941882011-09-29 00:42:28 +02002336 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002337 size_t nbits;
2338 int sign;
2339 PyObject *plong;
2340
2341 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002342 if (plong == NULL)
2343 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002344 nbits = _PyLong_NumBits(plong);
2345 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 Py_DECREF(plong);
2348 if (nbits != testcases[i].nbits)
2349 return raiseTestError("test_long_numbits",
2350 "wrong result for _PyLong_NumBits");
2351 if (sign != testcases[i].sign)
2352 return raiseTestError("test_long_numbits",
2353 "wrong result for _PyLong_Sign");
2354 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002355 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002356}
2357
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002358static PyObject *
2359pyobject_repr_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2360{
2361 return PyObject_Repr(NULL);
2362}
Thomas Woutersa9773292006-04-21 09:43:23 +00002363
2364static PyObject *
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002365pyobject_str_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002366{
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002367 return PyObject_Str(NULL);
2368}
2369
2370static PyObject *
2371pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2372{
2373 return PyObject_Bytes(NULL);
Thomas Woutersa9773292006-04-21 09:43:23 +00002374}
2375
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002376static PyObject *
2377raise_exception(PyObject *self, PyObject *args)
2378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 PyObject *exc;
2380 PyObject *exc_args, *v;
2381 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2384 &exc, &num_args))
2385 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 exc_args = PyTuple_New(num_args);
2388 if (exc_args == NULL)
2389 return NULL;
2390 for (i = 0; i < num_args; ++i) {
2391 v = PyLong_FromLong(i);
2392 if (v == NULL) {
2393 Py_DECREF(exc_args);
2394 return NULL;
2395 }
2396 PyTuple_SET_ITEM(exc_args, i, v);
2397 }
2398 PyErr_SetObject(exc, exc_args);
2399 Py_DECREF(exc_args);
2400 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002401}
Tim Peters91621db2001-06-12 20:10:01 +00002402
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002403static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002404set_errno(PyObject *self, PyObject *args)
2405{
2406 int new_errno;
2407
2408 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2409 return NULL;
2410
2411 errno = new_errno;
2412 Py_RETURN_NONE;
2413}
2414
2415static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002416test_set_exc_info(PyObject *self, PyObject *args)
2417{
2418 PyObject *orig_exc;
2419 PyObject *new_type, *new_value, *new_tb;
2420 PyObject *type, *value, *tb;
2421 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2422 &new_type, &new_value, &new_tb))
2423 return NULL;
2424
2425 PyErr_GetExcInfo(&type, &value, &tb);
2426
2427 Py_INCREF(new_type);
2428 Py_INCREF(new_value);
2429 Py_INCREF(new_tb);
2430 PyErr_SetExcInfo(new_type, new_value, new_tb);
2431
2432 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2433 Py_XDECREF(type);
2434 Py_XDECREF(value);
2435 Py_XDECREF(tb);
2436 return orig_exc;
2437}
Benjamin Peterson16323982010-02-03 01:13:41 +00002438
2439static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002440
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002441static PyObject *
2442test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 if (PyDateTimeAPI) {
2444 if (test_run_counter) {
2445 /* Probably regrtest.py -R */
2446 Py_RETURN_NONE;
2447 }
2448 else {
2449 PyErr_SetString(PyExc_AssertionError,
2450 "PyDateTime_CAPI somehow initialized");
2451 return NULL;
2452 }
2453 }
2454 test_run_counter++;
2455 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 if (PyDateTimeAPI)
2458 Py_RETURN_NONE;
2459 else
2460 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002461}
2462
Paul Ganssle04af5b12018-01-24 17:29:30 -05002463/* Functions exposing the C API type checking for testing */
2464#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2465 PyObject *obj; \
2466 int exact = 0; \
2467 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2468 return NULL; \
2469 } \
2470 int rv = exact?exact_method(obj):check_method(obj); \
2471 if (rv) { \
2472 Py_RETURN_TRUE; \
2473 } else { \
2474 Py_RETURN_FALSE; \
2475 }
2476
2477static PyObject *
2478datetime_check_date(PyObject *self, PyObject *args) {
2479 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2480}
2481
2482static PyObject *
2483datetime_check_time(PyObject *self, PyObject *args) {
2484 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2485}
2486
2487static PyObject *
2488datetime_check_datetime(PyObject *self, PyObject *args) {
2489 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2490}
2491
2492static PyObject *
2493datetime_check_delta(PyObject *self, PyObject *args) {
2494 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2495}
2496
2497static PyObject *
2498datetime_check_tzinfo(PyObject *self, PyObject *args) {
2499 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2500}
2501
2502
2503/* Makes three variations on timezone representing UTC-5:
2504 1. timezone with offset and name from PyDateTimeAPI
2505 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2506 3. timezone with offset (no name) from PyTimeZone_FromOffset
2507*/
2508static PyObject *
2509make_timezones_capi(PyObject *self, PyObject *args) {
2510 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2511 PyObject *name = PyUnicode_FromString("EST");
2512
2513 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2514 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2515 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2516
2517 Py_DecRef(offset);
2518 Py_DecRef(name);
2519
2520 PyObject *rv = PyTuple_New(3);
2521
2522 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2523 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2524 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2525
2526 return rv;
2527}
2528
2529static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002530get_timezones_offset_zero(PyObject *self, PyObject *args) {
2531 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2532 PyObject *name = PyUnicode_FromString("");
2533
2534 // These two should return the UTC singleton
2535 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2536 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2537
2538 // This one will return +00:00 zone, but not the UTC singleton
2539 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2540
2541 Py_DecRef(offset);
2542 Py_DecRef(name);
2543
2544 PyObject *rv = PyTuple_New(3);
2545 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2546 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2547 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2548
2549 return rv;
2550}
2551
2552static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002553get_timezone_utc_capi(PyObject* self, PyObject *args) {
2554 int macro = 0;
2555 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2556 return NULL;
2557 }
2558 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002559 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002560 return PyDateTime_TimeZone_UTC;
2561 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002562 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002563 return PyDateTimeAPI->TimeZone_UTC;
2564 }
2565}
2566
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002567static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002568get_date_fromdate(PyObject *self, PyObject *args)
2569{
2570 PyObject *rv = NULL;
2571 int macro;
2572 int year, month, day;
2573
2574 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2575 return NULL;
2576 }
2577
2578 if (macro) {
2579 rv = PyDate_FromDate(year, month, day);
2580 }
2581 else {
2582 rv = PyDateTimeAPI->Date_FromDate(
2583 year, month, day,
2584 PyDateTimeAPI->DateType);
2585 }
2586 return rv;
2587}
2588
2589static PyObject *
2590get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2591{
2592 PyObject *rv = NULL;
2593 int macro;
2594 int year, month, day;
2595 int hour, minute, second, microsecond;
2596
2597 if (!PyArg_ParseTuple(args, "piiiiiii",
2598 &macro,
2599 &year, &month, &day,
2600 &hour, &minute, &second, &microsecond)) {
2601 return NULL;
2602 }
2603
2604 if (macro) {
2605 rv = PyDateTime_FromDateAndTime(
2606 year, month, day,
2607 hour, minute, second, microsecond);
2608 }
2609 else {
2610 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2611 year, month, day,
2612 hour, minute, second, microsecond,
2613 Py_None,
2614 PyDateTimeAPI->DateTimeType);
2615 }
2616 return rv;
2617}
2618
2619static PyObject *
2620get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2621{
2622 PyObject *rv = NULL;
2623 int macro;
2624 int year, month, day;
2625 int hour, minute, second, microsecond, fold;
2626
2627 if (!PyArg_ParseTuple(args, "piiiiiiii",
2628 &macro,
2629 &year, &month, &day,
2630 &hour, &minute, &second, &microsecond,
2631 &fold)) {
2632 return NULL;
2633 }
2634
2635 if (macro) {
2636 rv = PyDateTime_FromDateAndTimeAndFold(
2637 year, month, day,
2638 hour, minute, second, microsecond,
2639 fold);
2640 }
2641 else {
2642 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2643 year, month, day,
2644 hour, minute, second, microsecond,
2645 Py_None,
2646 fold,
2647 PyDateTimeAPI->DateTimeType);
2648 }
2649 return rv;
2650}
2651
2652static PyObject *
2653get_time_fromtime(PyObject *self, PyObject *args)
2654{
2655 PyObject *rv = NULL;
2656 int macro;
2657 int hour, minute, second, microsecond;
2658
2659 if (!PyArg_ParseTuple(args, "piiii",
2660 &macro,
2661 &hour, &minute, &second, &microsecond)) {
2662 return NULL;
2663 }
2664
2665 if (macro) {
2666 rv = PyTime_FromTime(hour, minute, second, microsecond);
2667 }
2668 else {
2669 rv = PyDateTimeAPI->Time_FromTime(
2670 hour, minute, second, microsecond,
2671 Py_None,
2672 PyDateTimeAPI->TimeType);
2673 }
2674 return rv;
2675}
2676
2677static PyObject *
2678get_time_fromtimeandfold(PyObject *self, PyObject *args)
2679{
2680 PyObject *rv = NULL;
2681 int macro;
2682 int hour, minute, second, microsecond, fold;
2683
2684 if (!PyArg_ParseTuple(args, "piiiii",
2685 &macro,
2686 &hour, &minute, &second, &microsecond,
2687 &fold)) {
2688 return NULL;
2689 }
2690
2691 if (macro) {
2692 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2693 }
2694 else {
2695 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2696 hour, minute, second, microsecond,
2697 Py_None,
2698 fold,
2699 PyDateTimeAPI->TimeType);
2700 }
2701 return rv;
2702}
2703
2704static PyObject *
2705get_delta_fromdsu(PyObject *self, PyObject *args)
2706{
2707 PyObject *rv = NULL;
2708 int macro;
2709 int days, seconds, microseconds;
2710
2711 if (!PyArg_ParseTuple(args, "piii",
2712 &macro,
2713 &days, &seconds, &microseconds)) {
2714 return NULL;
2715 }
2716
2717 if (macro) {
2718 rv = PyDelta_FromDSU(days, seconds, microseconds);
2719 }
2720 else {
2721 rv = PyDateTimeAPI->Delta_FromDelta(
2722 days, seconds, microseconds, 1,
2723 PyDateTimeAPI->DeltaType);
2724 }
2725
2726 return rv;
2727}
2728
2729static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002730get_date_fromtimestamp(PyObject* self, PyObject *args)
2731{
2732 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2733 int macro = 0;
2734
2735 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2736 return NULL;
2737 }
2738
2739 // Construct the argument tuple
2740 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2741 return NULL;
2742 }
2743
2744 // Pass along to the API function
2745 if (macro) {
2746 rv = PyDate_FromTimestamp(tsargs);
2747 }
2748 else {
2749 rv = PyDateTimeAPI->Date_FromTimestamp(
2750 (PyObject *)PyDateTimeAPI->DateType, tsargs
2751 );
2752 }
2753
2754 Py_DECREF(tsargs);
2755 return rv;
2756}
2757
2758static PyObject *
2759get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2760{
2761 int macro = 0;
2762 int usetz = 0;
2763 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2764 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2765 return NULL;
2766 }
2767
2768 // Construct the argument tuple
2769 if (usetz) {
2770 tsargs = PyTuple_Pack(2, ts, tzinfo);
2771 }
2772 else {
2773 tsargs = PyTuple_Pack(1, ts);
2774 }
2775
2776 if (tsargs == NULL) {
2777 return NULL;
2778 }
2779
2780 // Pass along to the API function
2781 if (macro) {
2782 rv = PyDateTime_FromTimestamp(tsargs);
2783 }
2784 else {
2785 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2786 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2787 );
2788 }
2789
2790 Py_DECREF(tsargs);
2791 return rv;
2792}
2793
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002794static PyObject *
2795test_PyDateTime_GET(PyObject *self, PyObject *obj)
2796{
2797 int year, month, day;
2798
2799 year = PyDateTime_GET_YEAR(obj);
2800 month = PyDateTime_GET_MONTH(obj);
2801 day = PyDateTime_GET_DAY(obj);
2802
2803 return Py_BuildValue("(lll)", year, month, day);
2804}
2805
2806static PyObject *
2807test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2808{
2809 int hour, minute, second, microsecond;
2810
2811 hour = PyDateTime_DATE_GET_HOUR(obj);
2812 minute = PyDateTime_DATE_GET_MINUTE(obj);
2813 second = PyDateTime_DATE_GET_SECOND(obj);
2814 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002815 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002816
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002817 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002818}
2819
2820static PyObject *
2821test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2822{
2823 int hour, minute, second, microsecond;
2824
2825 hour = PyDateTime_TIME_GET_HOUR(obj);
2826 minute = PyDateTime_TIME_GET_MINUTE(obj);
2827 second = PyDateTime_TIME_GET_SECOND(obj);
2828 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002829 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002830
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002831 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002832}
2833
2834static PyObject *
2835test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2836{
2837 int days, seconds, microseconds;
2838
2839 days = PyDateTime_DELTA_GET_DAYS(obj);
2840 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2841 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2842
2843 return Py_BuildValue("(lll)", days, seconds, microseconds);
2844}
Benjamin Peterson16323982010-02-03 01:13:41 +00002845
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002846/* test_thread_state spawns a thread of its own, and that thread releases
2847 * `thread_done` when it's finished. The driver code has to know when the
2848 * thread finishes, because the thread uses a PyObject (the callable) that
2849 * may go away when the driver finishes. The former lack of this explicit
2850 * synchronization caused rare segfaults, so rare that they were seen only
2851 * on a Mac buildbot (although they were possible on any box).
2852 */
2853static PyThread_type_lock thread_done = NULL;
2854
Benjamin Petersona786b022008-08-25 21:05:21 +00002855static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002856_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 PyObject *rc;
2859 int success;
2860 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002861 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 success = (rc != NULL);
2863 Py_XDECREF(rc);
2864 PyGILState_Release(s);
2865 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002866}
2867
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002868/* Same thing, but releases `thread_done` when it returns. This variant
2869 * should be called only from threads spawned by test_thread_state().
2870 */
2871static void
2872_make_call_from_thread(void *callable)
2873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 _make_call(callable);
2875 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002876}
2877
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002878static PyObject *
2879test_thread_state(PyObject *self, PyObject *args)
2880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 PyObject *fn;
2882 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2885 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 if (!PyCallable_Check(fn)) {
2888 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002889 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 return NULL;
2891 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 thread_done = PyThread_allocate_lock();
2894 if (thread_done == NULL)
2895 return PyErr_NoMemory();
2896 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 /* Start a new thread with our callback. */
2899 PyThread_start_new_thread(_make_call_from_thread, fn);
2900 /* Make the callback with the thread lock held by this thread */
2901 success &= _make_call(fn);
2902 /* Do it all again, but this time with the thread-lock released */
2903 Py_BEGIN_ALLOW_THREADS
2904 success &= _make_call(fn);
2905 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2906 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 /* And once more with and without a thread
2909 XXX - should use a lock and work out exactly what we are trying
2910 to test <wink>
2911 */
2912 Py_BEGIN_ALLOW_THREADS
2913 PyThread_start_new_thread(_make_call_from_thread, fn);
2914 success &= _make_call(fn);
2915 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2916 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 /* Release lock we acquired above. This is required on HP-UX. */
2919 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 PyThread_free_lock(thread_done);
2922 if (!success)
2923 return NULL;
2924 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002925}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002926
2927/* test Py_AddPendingCalls using threads */
2928static int _pending_callback(void *arg)
2929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 /* we assume the argument is callable object to which we own a reference */
2931 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002932 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 Py_DECREF(callable);
2934 Py_XDECREF(r);
2935 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002936}
2937
2938/* The following requests n callbacks to _pending_callback. It can be
2939 * run from any python thread.
2940 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002941static PyObject *
2942pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 PyObject *callable;
2945 int r;
2946 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2947 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 /* create the reference for the callbackwhile we hold the lock */
2950 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 Py_BEGIN_ALLOW_THREADS
2953 r = Py_AddPendingCall(&_pending_callback, callable);
2954 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 if (r<0) {
2957 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002958 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002960 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002961}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002962
Neal Norwitzb0d26332007-08-25 00:49:05 +00002963/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002964static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002965test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 PyObject *result;
2968 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002969
Alexander Belopolskye239d232010-12-08 23:31:48 +00002970#define CHECK_1_FORMAT(FORMAT, TYPE) \
2971 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2972 if (result == NULL) \
2973 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002974 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002975 msg = FORMAT " failed at 1"; \
2976 goto Fail; \
2977 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 CHECK_1_FORMAT("%d", int);
2981 CHECK_1_FORMAT("%ld", long);
2982 /* The z width modifier was added in Python 2.5. */
2983 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 /* The u type code was added in Python 2.5. */
2986 CHECK_1_FORMAT("%u", unsigned int);
2987 CHECK_1_FORMAT("%lu", unsigned long);
2988 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002991 CHECK_1_FORMAT("%llu", unsigned long long);
2992 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002995
2996 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 Py_XDECREF(result);
2998 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002999
3000#undef CHECK_1_FORMAT
3001}
3002
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003003
3004static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303005test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3007 int result;
3008 if (py_s == NULL)
3009 return NULL;
3010 result = PyUnicode_CompareWithASCIIString(py_s, "str");
3011 Py_DECREF(py_s);
3012 if (!result) {
3013 PyErr_SetString(TestError, "Python string ending in NULL "
3014 "should not compare equal to c string.");
3015 return NULL;
3016 }
3017 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003018}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003019
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003020/* This is here to provide a docstring for test_descr. */
3021static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303022test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003024 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003025}
3026
Mark Dickinson725bfd82009-05-03 20:33:40 +00003027/* Test PyOS_string_to_double. */
3028static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303029test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003031 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033#define CHECK_STRING(STR, expected) \
3034 result = PyOS_string_to_double(STR, NULL, NULL); \
3035 if (result == -1.0 && PyErr_Occurred()) \
3036 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003037 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 msg = "conversion of " STR " to float failed"; \
3039 goto fail; \
3040 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042#define CHECK_INVALID(STR) \
3043 result = PyOS_string_to_double(STR, NULL, NULL); \
3044 if (result == -1.0 && PyErr_Occurred()) { \
3045 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3046 PyErr_Clear(); \
3047 else \
3048 return NULL; \
3049 } \
3050 else { \
3051 msg = "conversion of " STR " didn't raise ValueError"; \
3052 goto fail; \
3053 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 CHECK_STRING("0.1", 0.1);
3056 CHECK_STRING("1.234", 1.234);
3057 CHECK_STRING("-1.35", -1.35);
3058 CHECK_STRING(".1e01", 1.0);
3059 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 CHECK_INVALID(" 0.1");
3062 CHECK_INVALID("\t\n-3");
3063 CHECK_INVALID(".123 ");
3064 CHECK_INVALID("3\n");
3065 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003068 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003070#undef CHECK_STRING
3071#undef CHECK_INVALID
3072}
3073
3074
Benjamin Petersonb173f782009-05-05 22:31:58 +00003075/* Coverage testing of capsule objects. */
3076
3077static const char *capsule_name = "capsule name";
3078static char *capsule_pointer = "capsule pointer";
3079static char *capsule_context = "capsule context";
3080static const char *capsule_error = NULL;
3081static int
3082capsule_destructor_call_count = 0;
3083
3084static void
3085capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 capsule_destructor_call_count++;
3087 if (PyCapsule_GetContext(o) != capsule_context) {
3088 capsule_error = "context did not match in destructor!";
3089 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3090 capsule_error = "destructor did not match in destructor! (woah!)";
3091 } else if (PyCapsule_GetName(o) != capsule_name) {
3092 capsule_error = "name did not match in destructor!";
3093 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3094 capsule_error = "pointer did not match in destructor!";
3095 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003096}
3097
3098typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 char *name;
3100 char *module;
3101 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003102} known_capsule;
3103
3104static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003105test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 PyObject *object;
3108 const char *error = NULL;
3109 void *pointer;
3110 void *pointer2;
3111 known_capsule known_capsules[] = {
3112 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3113 KNOWN_CAPSULE("_socket", "CAPI"),
3114 KNOWN_CAPSULE("_curses", "_C_API"),
3115 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3116 { NULL, NULL },
3117 };
3118 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003119
3120#define FAIL(x) { error = (x); goto exit; }
3121
3122#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 if (capsule_error) { \
3124 FAIL(capsule_error); \
3125 } \
3126 else if (!capsule_destructor_call_count) { \
3127 FAIL("destructor not called!"); \
3128 } \
3129 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3132 PyCapsule_SetContext(object, capsule_context);
3133 capsule_destructor(object);
3134 CHECK_DESTRUCTOR;
3135 Py_DECREF(object);
3136 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 object = PyCapsule_New(known, "ignored", NULL);
3139 PyCapsule_SetPointer(object, capsule_pointer);
3140 PyCapsule_SetName(object, capsule_name);
3141 PyCapsule_SetDestructor(object, capsule_destructor);
3142 PyCapsule_SetContext(object, capsule_context);
3143 capsule_destructor(object);
3144 CHECK_DESTRUCTOR;
3145 /* intentionally access using the wrong name */
3146 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3147 if (!PyErr_Occurred()) {
3148 FAIL("PyCapsule_GetPointer should have failed but did not!");
3149 }
3150 PyErr_Clear();
3151 if (pointer2) {
3152 if (pointer2 == capsule_pointer) {
3153 FAIL("PyCapsule_GetPointer should not have"
3154 " returned the internal pointer!");
3155 } else {
3156 FAIL("PyCapsule_GetPointer should have "
3157 "returned NULL pointer but did not!");
3158 }
3159 }
3160 PyCapsule_SetDestructor(object, NULL);
3161 Py_DECREF(object);
3162 if (capsule_destructor_call_count) {
3163 FAIL("destructor called when it should not have been!");
3164 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 for (known = &known_capsules[0]; known->module != NULL; known++) {
3167 /* yeah, ordinarily I wouldn't do this either,
3168 but it's fine for this test harness.
3169 */
3170 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003171#undef FAIL
3172#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 { \
3174 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3175 x, known->module, known->attribute); \
3176 error = buffer; \
3177 goto exit; \
3178 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 PyObject *module = PyImport_ImportModule(known->module);
3181 if (module) {
3182 pointer = PyCapsule_Import(known->name, 0);
3183 if (!pointer) {
3184 Py_DECREF(module);
3185 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3186 }
3187 object = PyObject_GetAttrString(module, known->attribute);
3188 if (!object) {
3189 Py_DECREF(module);
3190 return NULL;
3191 }
3192 pointer2 = PyCapsule_GetPointer(object,
3193 "weebles wobble but they don't fall down");
3194 if (!PyErr_Occurred()) {
3195 Py_DECREF(object);
3196 Py_DECREF(module);
3197 FAIL("PyCapsule_GetPointer should have failed but did not!");
3198 }
3199 PyErr_Clear();
3200 if (pointer2) {
3201 Py_DECREF(module);
3202 Py_DECREF(object);
3203 if (pointer2 == pointer) {
3204 FAIL("PyCapsule_GetPointer should not have"
3205 " returned its internal pointer!");
3206 } else {
3207 FAIL("PyCapsule_GetPointer should have"
3208 " returned NULL pointer but did not!");
3209 }
3210 }
3211 Py_DECREF(object);
3212 Py_DECREF(module);
3213 }
3214 else
3215 PyErr_Clear();
3216 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003217
3218 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 if (error) {
3220 return raiseTestError("test_capsule", error);
3221 }
3222 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003223#undef FAIL
3224}
3225
Guido van Rossumddefaf32007-01-14 03:31:43 +00003226#ifdef HAVE_GETTIMEOFDAY
3227/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003228static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 e->tv_sec -= s->tv_sec;
3231 e->tv_usec -= s->tv_usec;
3232 if (e->tv_usec < 0) {
3233 e->tv_sec -=1;
3234 e->tv_usec += 1000000;
3235 }
3236 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003237}
3238
3239static PyObject *
3240profile_int(PyObject *self, PyObject* args)
3241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 int i, k;
3243 struct timeval start, stop;
3244 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 /* Test 1: Allocate and immediately deallocate
3247 many small integers */
3248 gettimeofday(&start, NULL);
3249 for(k=0; k < 20000; k++)
3250 for(i=0; i < 1000; i++) {
3251 single = PyLong_FromLong(i);
3252 Py_DECREF(single);
3253 }
3254 gettimeofday(&stop, NULL);
3255 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 /* Test 2: Allocate and immediately deallocate
3258 many large integers */
3259 gettimeofday(&start, NULL);
3260 for(k=0; k < 20000; k++)
3261 for(i=0; i < 1000; i++) {
3262 single = PyLong_FromLong(i+1000000);
3263 Py_DECREF(single);
3264 }
3265 gettimeofday(&stop, NULL);
3266 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 /* Test 3: Allocate a few integers, then release
3269 them all simultaneously. */
3270 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003271 if (multiple == NULL)
3272 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 gettimeofday(&start, NULL);
3274 for(k=0; k < 20000; k++) {
3275 for(i=0; i < 1000; i++) {
3276 multiple[i] = PyLong_FromLong(i+1000000);
3277 }
3278 for(i=0; i < 1000; i++) {
3279 Py_DECREF(multiple[i]);
3280 }
3281 }
3282 gettimeofday(&stop, NULL);
3283 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003284 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 /* Test 4: Allocate many integers, then release
3287 them all simultaneously. */
3288 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003289 if (multiple == NULL)
3290 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 gettimeofday(&start, NULL);
3292 for(k=0; k < 20; k++) {
3293 for(i=0; i < 1000000; i++) {
3294 multiple[i] = PyLong_FromLong(i+1000000);
3295 }
3296 for(i=0; i < 1000000; i++) {
3297 Py_DECREF(multiple[i]);
3298 }
3299 }
3300 gettimeofday(&stop, NULL);
3301 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003302 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 /* Test 5: Allocate many integers < 32000 */
3305 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003306 if (multiple == NULL)
3307 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 gettimeofday(&start, NULL);
3309 for(k=0; k < 10; k++) {
3310 for(i=0; i < 1000000; i++) {
3311 multiple[i] = PyLong_FromLong(i+1000);
3312 }
3313 for(i=0; i < 1000000; i++) {
3314 Py_DECREF(multiple[i]);
3315 }
3316 }
3317 gettimeofday(&stop, NULL);
3318 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003319 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 /* Test 6: Perform small int addition */
3322 op1 = PyLong_FromLong(1);
3323 gettimeofday(&start, NULL);
3324 for(i=0; i < 10000000; i++) {
3325 result = PyNumber_Add(op1, op1);
3326 Py_DECREF(result);
3327 }
3328 gettimeofday(&stop, NULL);
3329 Py_DECREF(op1);
3330 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 /* Test 7: Perform medium int addition */
3333 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003334 if (op1 == NULL)
3335 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 gettimeofday(&start, NULL);
3337 for(i=0; i < 10000000; i++) {
3338 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003339 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 }
3341 gettimeofday(&stop, NULL);
3342 Py_DECREF(op1);
3343 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003344
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003345 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003346}
3347#endif
3348
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003349/* To test the format of tracebacks as printed out. */
3350static PyObject *
3351traceback_print(PyObject *self, PyObject *args)
3352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 PyObject *file;
3354 PyObject *traceback;
3355 int result;
3356
3357 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3358 &traceback, &file))
3359 return NULL;
3360
3361 result = PyTraceBack_Print(traceback, file);
3362 if (result < 0)
3363 return NULL;
3364 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003365}
3366
Benjamin Petersone6528212008-07-15 15:32:09 +00003367/* To test the format of exceptions as printed out. */
3368static PyObject *
3369exception_print(PyObject *self, PyObject *args)
3370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 PyObject *value;
3372 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 if (!PyArg_ParseTuple(args, "O:exception_print",
3375 &value))
3376 return NULL;
3377 if (!PyExceptionInstance_Check(value)) {
3378 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3379 return NULL;
3380 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 tb = PyException_GetTraceback(value);
3383 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3384 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003387}
3388
3389
3390
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003391
3392/* reliably raise a MemoryError */
3393static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303394raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 PyErr_NoMemory();
3397 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003398}
3399
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003400/* Issue 6012 */
3401static PyObject *str1, *str2;
3402static int
3403failing_converter(PyObject *obj, void *arg)
3404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 /* Clone str1, then let the conversion fail. */
3406 assert(str1);
3407 str2 = str1;
3408 Py_INCREF(str2);
3409 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003410}
3411static PyObject*
3412argparsing(PyObject *o, PyObject *args)
3413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 PyObject *res;
3415 str1 = str2 = NULL;
3416 if (!PyArg_ParseTuple(args, "O&O&",
3417 PyUnicode_FSConverter, &str1,
3418 failing_converter, &str2)) {
3419 if (!str2)
3420 /* argument converter not called? */
3421 return NULL;
3422 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003423 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 Py_DECREF(str2);
3425 PyErr_Clear();
3426 return res;
3427 }
3428 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003429}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003430
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003431/* To test that the result of PyCode_NewEmpty has the right members. */
3432static PyObject *
3433code_newempty(PyObject *self, PyObject *args)
3434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 const char *filename;
3436 const char *funcname;
3437 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3440 &filename, &funcname, &firstlineno))
3441 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003444}
3445
Georg Brandl1e28a272009-12-28 08:41:01 +00003446/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3447 Run via Lib/test/test_exceptions.py */
3448static PyObject *
3449make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 const char *name;
3452 const char *doc = NULL;
3453 PyObject *base = NULL;
3454 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3459 "s|sOO:make_exception_with_doc", kwlist,
3460 &name, &doc, &base, &dict))
3461 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003464}
3465
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003466static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303467make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003468{
3469 Py_buffer info;
3470 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3471 return NULL;
3472 return PyMemoryView_FromBuffer(&info);
3473}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003474
Stefan Krah7213fcc2015-02-01 16:19:23 +01003475static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003476test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003477{
3478 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3479 int init[5] = {0, 1, 2, 3, 4};
3480 Py_ssize_t itemsize = sizeof(int);
3481 Py_ssize_t shape = 5;
3482 Py_ssize_t strides = 2 * itemsize;
3483 Py_buffer view = {
3484 data,
3485 NULL,
3486 5 * itemsize,
3487 itemsize,
3488 1,
3489 1,
3490 NULL,
3491 &shape,
3492 &strides,
3493 NULL,
3494 NULL
3495 };
3496 int *ptr;
3497 int i;
3498
3499 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3500 ptr = view.buf;
3501 for (i = 0; i < 5; i++) {
3502 if (ptr[2*i] != i) {
3503 PyErr_SetString(TestError,
3504 "test_from_contiguous: incorrect result");
3505 return NULL;
3506 }
3507 }
3508
3509 view.buf = &data[8];
3510 view.strides[0] = -2 * itemsize;
3511
3512 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3513 ptr = view.buf;
3514 for (i = 0; i < 5; i++) {
3515 if (*(ptr-2*i) != i) {
3516 PyErr_SetString(TestError,
3517 "test_from_contiguous: incorrect result");
3518 return NULL;
3519 }
3520 }
3521
3522 Py_RETURN_NONE;
3523}
Stefan Krah650c1e82015-02-03 21:43:23 +01003524
Stefan Kraha7559c02015-02-03 22:27:21 +01003525#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003526extern PyTypeObject _PyBytesIOBuffer_Type;
3527
Stefan Krah5178d912015-02-03 16:57:21 +01003528static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003529test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003530{
Stefan Krah650c1e82015-02-03 21:43:23 +01003531 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003532 PyObject *b;
3533 char *dummy[1];
3534 int ret, match;
3535
Stefan Krah650c1e82015-02-03 21:43:23 +01003536 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003537 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3538 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3539 PyErr_Clear();
3540 if (ret != -1 || match == 0)
3541 goto error;
3542
Stefan Krah650c1e82015-02-03 21:43:23 +01003543 /* bytesiobuf_getbuffer() */
3544 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003545 if (b == NULL) {
3546 return NULL;
3547 }
3548
3549 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3550 Py_DECREF(b);
3551 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3552 PyErr_Clear();
3553 if (ret != -1 || match == 0)
3554 goto error;
3555
3556 Py_RETURN_NONE;
3557
3558error:
3559 PyErr_SetString(TestError,
3560 "test_pep3118_obsolete_write_locks: failure");
3561 return NULL;
3562}
Stefan Kraha7559c02015-02-03 22:27:21 +01003563#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003564
Stefan Krah650c1e82015-02-03 21:43:23 +01003565/* This tests functions that historically supported write locks. It is
3566 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3567 is entitled to segfault in that case. */
3568static PyObject *
3569getbuffer_with_null_view(PyObject* self, PyObject *obj)
3570{
3571 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3572 return NULL;
3573
3574 Py_RETURN_NONE;
3575}
3576
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003577/* PyBuffer_SizeFromFormat() */
3578static PyObject *
3579test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3580{
3581 const char *format;
3582 Py_ssize_t result;
3583
3584 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3585 &format)) {
3586 return NULL;
3587 }
3588
3589 result = PyBuffer_SizeFromFormat(format);
3590 if (result == -1) {
3591 return NULL;
3592 }
3593
3594 return PyLong_FromSsize_t(result);
3595}
3596
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003597/* Test that the fatal error from not having a current thread doesn't
3598 cause an infinite loop. Run via Lib/test/test_capi.py */
3599static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303600crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003601{
3602 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003603 /* Using PyThreadState_Get() directly allows the test to pass in
3604 !pydebug mode. However, the test only actually tests anything
3605 in pydebug mode, since that's where the infinite loop was in
3606 the first place. */
3607 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003608 Py_END_ALLOW_THREADS
3609 return NULL;
3610}
3611
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003612/* To run some code in a sub-interpreter. */
3613static PyObject *
3614run_in_subinterp(PyObject *self, PyObject *args)
3615{
3616 const char *code;
3617 int r;
3618 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003619 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3620 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003621
3622 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3623 &code))
3624 return NULL;
3625
3626 mainstate = PyThreadState_Get();
3627
3628 PyThreadState_Swap(NULL);
3629
3630 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003631 if (substate == NULL) {
3632 /* Since no new thread state was created, there is no exception to
3633 propagate; raise a fresh one after swapping in the old thread
3634 state. */
3635 PyThreadState_Swap(mainstate);
3636 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3637 return NULL;
3638 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003639 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003640 Py_EndInterpreter(substate);
3641
3642 PyThreadState_Swap(mainstate);
3643
3644 return PyLong_FromLong(r);
3645}
3646
Victor Stinner3c1b3792014-02-17 00:02:43 +01003647static int
3648check_time_rounding(int round)
3649{
Victor Stinner74474232015-09-02 01:43:56 +02003650 if (round != _PyTime_ROUND_FLOOR
3651 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003652 && round != _PyTime_ROUND_HALF_EVEN
3653 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003654 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3655 return -1;
3656 }
3657 return 0;
3658}
3659
Victor Stinner5d272cc2012-03-13 13:35:55 +01003660static PyObject *
3661test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3662{
3663 PyObject *obj;
3664 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003665 int round;
3666 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003667 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003668 if (check_time_rounding(round) < 0)
3669 return NULL;
3670 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003671 return NULL;
3672 return _PyLong_FromTime_t(sec);
3673}
3674
3675static PyObject *
3676test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3677{
3678 PyObject *obj;
3679 time_t sec;
3680 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003681 int round;
3682 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003683 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003684 if (check_time_rounding(round) < 0)
3685 return NULL;
3686 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003687 return NULL;
3688 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3689}
3690
Victor Stinner643cd682012-03-02 22:54:03 +01003691static PyObject *
3692test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3693{
3694 PyObject *obj;
3695 time_t sec;
3696 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003697 int round;
3698 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003699 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003700 if (check_time_rounding(round) < 0)
3701 return NULL;
3702 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003703 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003704 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003705}
3706
Antoine Pitrou796564c2013-07-30 19:59:21 +02003707static void
3708slot_tp_del(PyObject *self)
3709{
3710 _Py_IDENTIFIER(__tp_del__);
3711 PyObject *del, *res;
3712 PyObject *error_type, *error_value, *error_traceback;
3713
3714 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003715 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003716 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003717
3718 /* Save the current exception, if any. */
3719 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3720
3721 /* Execute __del__ method, if any. */
3722 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3723 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003724 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003725 if (res == NULL)
3726 PyErr_WriteUnraisable(del);
3727 else
3728 Py_DECREF(res);
3729 Py_DECREF(del);
3730 }
3731
3732 /* Restore the saved exception. */
3733 PyErr_Restore(error_type, error_value, error_traceback);
3734
3735 /* Undo the temporary resurrection; can't use DECREF here, it would
3736 * cause a recursive call.
3737 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003738 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003739 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3740 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003741 /* this is the normal path out */
3742 return;
3743 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003744
3745 /* __del__ resurrected it! Make it look like the original Py_DECREF
3746 * never happened.
3747 */
3748 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003749 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003750 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003751 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003752 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003753 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003754 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3755 _Py_RefTotal, so we need to undo that. */
3756#ifdef Py_REF_DEBUG
3757 _Py_RefTotal--;
3758#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003759}
3760
3761static PyObject *
3762with_tp_del(PyObject *self, PyObject *args)
3763{
3764 PyObject *obj;
3765 PyTypeObject *tp;
3766
3767 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3768 return NULL;
3769 tp = (PyTypeObject *) obj;
3770 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3771 PyErr_Format(PyExc_TypeError,
3772 "heap type expected, got %R", obj);
3773 return NULL;
3774 }
3775 tp->tp_del = slot_tp_del;
3776 Py_INCREF(obj);
3777 return obj;
3778}
3779
Brandt Bucherc13b8472020-10-14 18:44:07 -07003780static PyObject *
3781without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3782{
3783 PyTypeObject *tp = (PyTypeObject*)obj;
3784 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3785 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3786 }
3787 if (PyType_IS_GC(tp)) {
3788 // Don't try this at home, kids:
3789 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3790 tp->tp_free = PyObject_Del;
3791 tp->tp_traverse = NULL;
3792 tp->tp_clear = NULL;
3793 }
3794 assert(!PyType_IS_GC(tp));
3795 Py_INCREF(obj);
3796 return obj;
3797}
3798
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003799static PyMethodDef ml;
3800
3801static PyObject *
3802create_cfunction(PyObject *self, PyObject *args)
3803{
3804 return PyCFunction_NewEx(&ml, self, NULL);
3805}
3806
3807static PyMethodDef ml = {
3808 "create_cfunction",
3809 create_cfunction,
3810 METH_NOARGS,
3811 NULL
3812};
3813
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003814static PyObject *
3815_test_incref(PyObject *ob)
3816{
3817 Py_INCREF(ob);
3818 return ob;
3819}
3820
3821static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303822test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003823{
3824 PyObject *obj = PyLong_FromLong(0);
3825 Py_XINCREF(_test_incref(obj));
3826 Py_DECREF(obj);
3827 Py_DECREF(obj);
3828 Py_DECREF(obj);
3829 Py_RETURN_NONE;
3830}
3831
3832static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303833test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003834{
3835 PyObject *obj = PyLong_FromLong(0);
3836 Py_INCREF(_test_incref(obj));
3837 Py_DECREF(obj);
3838 Py_DECREF(obj);
3839 Py_DECREF(obj);
3840 Py_RETURN_NONE;
3841}
3842
3843static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303844test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003845{
3846 Py_XDECREF(PyLong_FromLong(0));
3847 Py_RETURN_NONE;
3848}
3849
3850static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303851test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003852{
3853 Py_DECREF(PyLong_FromLong(0));
3854 Py_RETURN_NONE;
3855}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003856
Victor Stinner0507bf52013-07-07 02:05:46 +02003857static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003858test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3859 PyObject *Py_UNUSED(args))
3860{
3861 PyStructSequence_Desc descr;
3862 PyStructSequence_Field descr_fields[3];
3863
3864 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3865 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3866 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3867
3868 descr.name = "_testcapi.test_descr";
3869 descr.doc = "This is used to test for memory leaks in NewType";
3870 descr.fields = descr_fields;
3871 descr.n_in_sequence = 1;
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 *
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07003883test_structseq_newtype_null_descr_doc(PyObject *Py_UNUSED(self),
3884 PyObject *Py_UNUSED(args))
3885{
3886 PyStructSequence_Field descr_fields[1] = {
3887 (PyStructSequence_Field){NULL, NULL}
3888 };
3889 // Test specifically for NULL .doc field.
3890 PyStructSequence_Desc descr = {"_testcapi.test_descr", NULL, &descr_fields[0], 0};
3891
3892 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3893 assert(structseq_type != NULL);
3894 assert(PyType_Check(structseq_type));
3895 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3896 Py_DECREF(structseq_type);
3897
3898 Py_RETURN_NONE;
3899}
3900
3901static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303902test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003903{
3904 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003905 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003906 Py_DecRef(obj);
3907 Py_DecRef(obj);
3908 Py_RETURN_NONE;
3909}
3910
3911static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303912test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003913{
3914 void *ptr;
3915
Victor Stinnerdb067af2014-05-02 22:31:14 +02003916 ptr = PyMem_RawMalloc(0);
3917 if (ptr == NULL) {
3918 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3919 return NULL;
3920 }
3921 PyMem_RawFree(ptr);
3922
3923 ptr = PyMem_RawCalloc(0, 0);
3924 if (ptr == NULL) {
3925 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3926 return NULL;
3927 }
3928 PyMem_RawFree(ptr);
3929
Victor Stinner0507bf52013-07-07 02:05:46 +02003930 ptr = PyMem_Malloc(0);
3931 if (ptr == NULL) {
3932 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3933 return NULL;
3934 }
3935 PyMem_Free(ptr);
3936
Victor Stinnerdb067af2014-05-02 22:31:14 +02003937 ptr = PyMem_Calloc(0, 0);
3938 if (ptr == NULL) {
3939 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3940 return NULL;
3941 }
3942 PyMem_Free(ptr);
3943
Victor Stinner0507bf52013-07-07 02:05:46 +02003944 ptr = PyObject_Malloc(0);
3945 if (ptr == NULL) {
3946 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3947 return NULL;
3948 }
3949 PyObject_Free(ptr);
3950
Victor Stinnerdb067af2014-05-02 22:31:14 +02003951 ptr = PyObject_Calloc(0, 0);
3952 if (ptr == NULL) {
3953 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3954 return NULL;
3955 }
3956 PyObject_Free(ptr);
3957
Victor Stinner0507bf52013-07-07 02:05:46 +02003958 Py_RETURN_NONE;
3959}
3960
3961typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003962 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003963
3964 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003965 size_t calloc_nelem;
3966 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003967 void *realloc_ptr;
3968 size_t realloc_new_size;
3969 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003970 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003971} alloc_hook_t;
3972
Victor Stinner9ed83c42017-10-31 12:18:10 -07003973static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003974{
3975 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003976 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003977 hook->malloc_size = size;
3978 return hook->alloc.malloc(hook->alloc.ctx, size);
3979}
3980
Victor Stinner9ed83c42017-10-31 12:18:10 -07003981static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003982{
3983 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003984 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003985 hook->calloc_nelem = nelem;
3986 hook->calloc_elsize = elsize;
3987 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3988}
3989
Victor Stinner9ed83c42017-10-31 12:18:10 -07003990static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003991{
3992 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003993 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003994 hook->realloc_ptr = ptr;
3995 hook->realloc_new_size = new_size;
3996 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3997}
3998
Victor Stinner9ed83c42017-10-31 12:18:10 -07003999static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02004000{
4001 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004002 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004003 hook->free_ptr = ptr;
4004 hook->alloc.free(hook->alloc.ctx, ptr);
4005}
4006
4007static PyObject *
4008test_setallocators(PyMemAllocatorDomain domain)
4009{
4010 PyObject *res = NULL;
4011 const char *error_msg;
4012 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004013 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004014 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004015 void *ptr, *ptr2;
4016
Victor Stinnerdb067af2014-05-02 22:31:14 +02004017 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004018
4019 alloc.ctx = &hook;
4020 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004021 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004022 alloc.realloc = &hook_realloc;
4023 alloc.free = &hook_free;
4024 PyMem_GetAllocator(domain, &hook.alloc);
4025 PyMem_SetAllocator(domain, &alloc);
4026
Victor Stinner9ed83c42017-10-31 12:18:10 -07004027 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004028 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004029 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004030 switch(domain)
4031 {
4032 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4033 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4034 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4035 default: ptr = NULL; break;
4036 }
4037
Victor Stinner9ed83c42017-10-31 12:18:10 -07004038#define CHECK_CTX(FUNC) \
4039 if (hook.ctx != &hook) { \
4040 error_msg = FUNC " wrong context"; \
4041 goto fail; \
4042 } \
4043 hook.ctx = NULL; /* reset for next check */
4044
Victor Stinner0507bf52013-07-07 02:05:46 +02004045 if (ptr == NULL) {
4046 error_msg = "malloc failed";
4047 goto fail;
4048 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004049 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004050 if (hook.malloc_size != size) {
4051 error_msg = "malloc invalid size";
4052 goto fail;
4053 }
4054
4055 size2 = 200;
4056 switch(domain)
4057 {
4058 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4059 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4060 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004061 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004062 }
4063
4064 if (ptr2 == NULL) {
4065 error_msg = "realloc failed";
4066 goto fail;
4067 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004068 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004069 if (hook.realloc_ptr != ptr
4070 || hook.realloc_new_size != size2) {
4071 error_msg = "realloc invalid parameters";
4072 goto fail;
4073 }
4074
4075 switch(domain)
4076 {
4077 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4078 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4079 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4080 }
4081
Victor Stinner9ed83c42017-10-31 12:18:10 -07004082 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004083 if (hook.free_ptr != ptr2) {
4084 error_msg = "free invalid pointer";
4085 goto fail;
4086 }
4087
Victor Stinner9ed83c42017-10-31 12:18:10 -07004088 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004089 nelem = 2;
4090 elsize = 5;
4091 switch(domain)
4092 {
4093 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4094 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4095 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4096 default: ptr = NULL; break;
4097 }
4098
4099 if (ptr == NULL) {
4100 error_msg = "calloc failed";
4101 goto fail;
4102 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004103 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004104 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4105 error_msg = "calloc invalid nelem or elsize";
4106 goto fail;
4107 }
4108
Victor Stinner9ed83c42017-10-31 12:18:10 -07004109 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004110 switch(domain)
4111 {
4112 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4113 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4114 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4115 }
4116
Victor Stinner9ed83c42017-10-31 12:18:10 -07004117 CHECK_CTX("calloc free");
4118 if (hook.free_ptr != ptr) {
4119 error_msg = "calloc free invalid pointer";
4120 goto fail;
4121 }
4122
Victor Stinner0507bf52013-07-07 02:05:46 +02004123 Py_INCREF(Py_None);
4124 res = Py_None;
4125 goto finally;
4126
4127fail:
4128 PyErr_SetString(PyExc_RuntimeError, error_msg);
4129
4130finally:
4131 PyMem_SetAllocator(domain, &hook.alloc);
4132 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004133
4134#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004135}
4136
4137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304138test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004139{
4140 return test_setallocators(PYMEM_DOMAIN_RAW);
4141}
4142
4143static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304144test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004145{
4146 return test_setallocators(PYMEM_DOMAIN_MEM);
4147}
4148
4149static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304150test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004151{
4152 return test_setallocators(PYMEM_DOMAIN_OBJ);
4153}
4154
xdegaye85f64302017-07-01 14:14:45 +02004155/* Most part of the following code is inherited from the pyfailmalloc project
4156 * written by Victor Stinner. */
4157static struct {
4158 int installed;
4159 PyMemAllocatorEx raw;
4160 PyMemAllocatorEx mem;
4161 PyMemAllocatorEx obj;
4162} FmHook;
4163
4164static struct {
4165 int start;
4166 int stop;
4167 Py_ssize_t count;
4168} FmData;
4169
4170static int
4171fm_nomemory(void)
4172{
4173 FmData.count++;
4174 if (FmData.count > FmData.start &&
4175 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4176 return 1;
4177 }
4178 return 0;
4179}
4180
4181static void *
4182hook_fmalloc(void *ctx, size_t size)
4183{
4184 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4185 if (fm_nomemory()) {
4186 return NULL;
4187 }
4188 return alloc->malloc(alloc->ctx, size);
4189}
4190
4191static void *
4192hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4193{
4194 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4195 if (fm_nomemory()) {
4196 return NULL;
4197 }
4198 return alloc->calloc(alloc->ctx, nelem, elsize);
4199}
4200
4201static void *
4202hook_frealloc(void *ctx, void *ptr, size_t new_size)
4203{
4204 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4205 if (fm_nomemory()) {
4206 return NULL;
4207 }
4208 return alloc->realloc(alloc->ctx, ptr, new_size);
4209}
4210
4211static void
4212hook_ffree(void *ctx, void *ptr)
4213{
4214 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4215 alloc->free(alloc->ctx, ptr);
4216}
4217
4218static void
4219fm_setup_hooks(void)
4220{
4221 PyMemAllocatorEx alloc;
4222
4223 if (FmHook.installed) {
4224 return;
4225 }
4226 FmHook.installed = 1;
4227
4228 alloc.malloc = hook_fmalloc;
4229 alloc.calloc = hook_fcalloc;
4230 alloc.realloc = hook_frealloc;
4231 alloc.free = hook_ffree;
4232 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4233 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4234 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4235
4236 alloc.ctx = &FmHook.raw;
4237 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4238
4239 alloc.ctx = &FmHook.mem;
4240 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4241
4242 alloc.ctx = &FmHook.obj;
4243 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4244}
4245
4246static void
4247fm_remove_hooks(void)
4248{
4249 if (FmHook.installed) {
4250 FmHook.installed = 0;
4251 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4252 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4253 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4254 }
4255}
4256
4257static PyObject*
4258set_nomemory(PyObject *self, PyObject *args)
4259{
4260 /* Memory allocation fails after 'start' allocation requests, and until
4261 * 'stop' allocation requests except when 'stop' is negative or equal
4262 * to 0 (default) in which case allocation failures never stop. */
4263 FmData.count = 0;
4264 FmData.stop = 0;
4265 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4266 return NULL;
4267 }
4268 fm_setup_hooks();
4269 Py_RETURN_NONE;
4270}
4271
4272static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304273remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004274{
4275 fm_remove_hooks();
4276 Py_RETURN_NONE;
4277}
4278
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004279PyDoc_STRVAR(docstring_empty,
4280""
4281);
4282
4283PyDoc_STRVAR(docstring_no_signature,
4284"This docstring has no signature."
4285);
4286
4287PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004288"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004289"\n"
4290"This docstring has an invalid signature."
4291);
4292
Larry Hastings2623c8c2014-02-08 22:15:29 -08004293PyDoc_STRVAR(docstring_with_invalid_signature2,
4294"docstring_with_invalid_signature2($module, /, boo)\n"
4295"\n"
4296"--\n"
4297"\n"
4298"This docstring also has an invalid signature."
4299);
4300
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004301PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004302"docstring_with_signature($module, /, sig)\n"
4303"--\n"
4304"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004305"This docstring has a valid signature."
4306);
4307
Zachary Ware8ef887c2015-04-13 18:22:35 -05004308PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4309"docstring_with_signature_but_no_doc($module, /, sig)\n"
4310"--\n"
4311"\n"
4312);
4313
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004314PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004315"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4316"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004317"\n"
4318"\n"
4319"This docstring has a valid signature and some extra newlines."
4320);
4321
Larry Hastings16c51912014-01-07 11:53:01 -08004322PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004323"docstring_with_signature_with_defaults(module, s='avocado',\n"
4324" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4325" local=the_number_three, sys=sys.maxsize,\n"
4326" exp=sys.maxsize - 1)\n"
4327"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004328"\n"
4329"\n"
4330"\n"
4331"This docstring has a valid signature with parameters,\n"
4332"and the parameters take defaults of varying types."
4333);
4334
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004335typedef struct {
4336 PyThread_type_lock start_event;
4337 PyThread_type_lock exit_event;
4338 PyObject *callback;
4339} test_c_thread_t;
4340
4341static void
4342temporary_c_thread(void *data)
4343{
4344 test_c_thread_t *test_c_thread = data;
4345 PyGILState_STATE state;
4346 PyObject *res;
4347
4348 PyThread_release_lock(test_c_thread->start_event);
4349
4350 /* Allocate a Python thread state for this thread */
4351 state = PyGILState_Ensure();
4352
Victor Stinner3466bde2016-09-05 18:16:01 -07004353 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004354 Py_CLEAR(test_c_thread->callback);
4355
4356 if (res == NULL) {
4357 PyErr_Print();
4358 }
4359 else {
4360 Py_DECREF(res);
4361 }
4362
4363 /* Destroy the Python thread state for this thread */
4364 PyGILState_Release(state);
4365
4366 PyThread_release_lock(test_c_thread->exit_event);
4367
4368 PyThread_exit_thread();
4369}
4370
4371static PyObject *
4372call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4373{
4374 PyObject *res = NULL;
4375 test_c_thread_t test_c_thread;
4376 long thread;
4377
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004378 test_c_thread.start_event = PyThread_allocate_lock();
4379 test_c_thread.exit_event = PyThread_allocate_lock();
4380 test_c_thread.callback = NULL;
4381 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4382 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4383 goto exit;
4384 }
4385
4386 Py_INCREF(callback);
4387 test_c_thread.callback = callback;
4388
4389 PyThread_acquire_lock(test_c_thread.start_event, 1);
4390 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4391
4392 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4393 if (thread == -1) {
4394 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4395 PyThread_release_lock(test_c_thread.start_event);
4396 PyThread_release_lock(test_c_thread.exit_event);
4397 goto exit;
4398 }
4399
4400 PyThread_acquire_lock(test_c_thread.start_event, 1);
4401 PyThread_release_lock(test_c_thread.start_event);
4402
4403 Py_BEGIN_ALLOW_THREADS
4404 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4405 PyThread_release_lock(test_c_thread.exit_event);
4406 Py_END_ALLOW_THREADS
4407
4408 Py_INCREF(Py_None);
4409 res = Py_None;
4410
4411exit:
4412 Py_CLEAR(test_c_thread.callback);
4413 if (test_c_thread.start_event)
4414 PyThread_free_lock(test_c_thread.start_event);
4415 if (test_c_thread.exit_event)
4416 PyThread_free_lock(test_c_thread.exit_event);
4417 return res;
4418}
Victor Stinner13105102013-12-13 02:17:29 +01004419
Serhiy Storchakab5181342015-02-06 08:58:56 +02004420/* marshal */
4421
4422static PyObject*
4423pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4424{
4425 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004426 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004427 int version;
4428 FILE *fp;
4429
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004430 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004431 &value, &filename, &version))
4432 return NULL;
4433
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004434 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004435 if (fp == NULL) {
4436 PyErr_SetFromErrno(PyExc_OSError);
4437 return NULL;
4438 }
4439
4440 PyMarshal_WriteLongToFile(value, fp, version);
4441
4442 fclose(fp);
4443 if (PyErr_Occurred())
4444 return NULL;
4445 Py_RETURN_NONE;
4446}
4447
4448static PyObject*
4449pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4450{
4451 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004452 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004453 int version;
4454 FILE *fp;
4455
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004456 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004457 &obj, &filename, &version))
4458 return NULL;
4459
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004460 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004461 if (fp == NULL) {
4462 PyErr_SetFromErrno(PyExc_OSError);
4463 return NULL;
4464 }
4465
4466 PyMarshal_WriteObjectToFile(obj, fp, version);
4467
4468 fclose(fp);
4469 if (PyErr_Occurred())
4470 return NULL;
4471 Py_RETURN_NONE;
4472}
4473
4474static PyObject*
4475pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4476{
4477 int value;
4478 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004479 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004480 FILE *fp;
4481
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004482 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004483 return NULL;
4484
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004485 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004486 if (fp == NULL) {
4487 PyErr_SetFromErrno(PyExc_OSError);
4488 return NULL;
4489 }
4490
4491 value = PyMarshal_ReadShortFromFile(fp);
4492 pos = ftell(fp);
4493
4494 fclose(fp);
4495 if (PyErr_Occurred())
4496 return NULL;
4497 return Py_BuildValue("il", value, pos);
4498}
4499
4500static PyObject*
4501pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4502{
4503 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004504 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004505 FILE *fp;
4506
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004507 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004508 return NULL;
4509
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004510 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004511 if (fp == NULL) {
4512 PyErr_SetFromErrno(PyExc_OSError);
4513 return NULL;
4514 }
4515
4516 value = PyMarshal_ReadLongFromFile(fp);
4517 pos = ftell(fp);
4518
4519 fclose(fp);
4520 if (PyErr_Occurred())
4521 return NULL;
4522 return Py_BuildValue("ll", value, pos);
4523}
4524
4525static PyObject*
4526pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4527{
4528 PyObject *obj;
4529 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004530 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004531 FILE *fp;
4532
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004533 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004534 return NULL;
4535
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004536 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004537 if (fp == NULL) {
4538 PyErr_SetFromErrno(PyExc_OSError);
4539 return NULL;
4540 }
4541
4542 obj = PyMarshal_ReadLastObjectFromFile(fp);
4543 pos = ftell(fp);
4544
4545 fclose(fp);
4546 return Py_BuildValue("Nl", obj, pos);
4547}
4548
4549static PyObject*
4550pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4551{
4552 PyObject *obj;
4553 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004554 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004555 FILE *fp;
4556
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004557 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004558 return NULL;
4559
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004560 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004561 if (fp == NULL) {
4562 PyErr_SetFromErrno(PyExc_OSError);
4563 return NULL;
4564 }
4565
4566 obj = PyMarshal_ReadObjectFromFile(fp);
4567 pos = ftell(fp);
4568
4569 fclose(fp);
4570 return Py_BuildValue("Nl", obj, pos);
4571}
4572
Victor Stinnerefde1462015-03-21 15:04:43 +01004573static PyObject*
4574return_null_without_error(PyObject *self, PyObject *args)
4575{
4576 /* invalid call: return NULL without setting an error,
4577 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4578 PyErr_Clear();
4579 return NULL;
4580}
4581
4582static PyObject*
4583return_result_with_error(PyObject *self, PyObject *args)
4584{
4585 /* invalid call: return a result with an error set,
4586 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4587 PyErr_SetNone(PyExc_ValueError);
4588 Py_RETURN_NONE;
4589}
4590
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01004591static PyObject*
4592getitem_with_error(PyObject *self, PyObject *args)
4593{
4594 PyObject *map, *key;
4595 if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
4596 return NULL;
4597 }
4598
4599 PyErr_SetString(PyExc_ValueError, "bug");
4600 return PyObject_GetItem(map, key);
4601}
4602
Victor Stinner992c43f2015-03-27 17:12:45 +01004603static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004604test_pytime_fromseconds(PyObject *self, PyObject *args)
4605{
4606 int seconds;
4607 _PyTime_t ts;
4608
4609 if (!PyArg_ParseTuple(args, "i", &seconds))
4610 return NULL;
4611 ts = _PyTime_FromSeconds(seconds);
4612 return _PyTime_AsNanosecondsObject(ts);
4613}
4614
4615static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004616test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4617{
4618 PyObject *obj;
4619 int round;
4620 _PyTime_t ts;
4621
4622 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4623 return NULL;
4624 if (check_time_rounding(round) < 0)
4625 return NULL;
4626 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4627 return NULL;
4628 return _PyTime_AsNanosecondsObject(ts);
4629}
4630
Victor Stinner4bfb4602015-03-27 22:27:24 +01004631static PyObject *
4632test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4633{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004634 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004635 _PyTime_t ts;
4636 double d;
4637
Victor Stinnerc29b5852017-11-02 07:28:27 -07004638 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004639 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004640 }
4641 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4642 return NULL;
4643 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004644 d = _PyTime_AsSecondsDouble(ts);
4645 return PyFloat_FromDouble(d);
4646}
4647
Victor Stinner95e9cef2015-03-28 01:26:47 +01004648static PyObject *
4649test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4650{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004651 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004652 int round;
4653 _PyTime_t t;
4654 struct timeval tv;
4655 PyObject *seconds;
4656
Victor Stinnerc29b5852017-11-02 07:28:27 -07004657 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004658 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004659 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004660 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004661 }
4662 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004663 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004664 }
4665 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4666 return NULL;
4667 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004668
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004669 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004670 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004671 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004672 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004673 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4674}
4675
Victor Stinner34dc0f42015-03-27 18:19:03 +01004676#ifdef HAVE_CLOCK_GETTIME
4677static PyObject *
4678test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4679{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004680 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004681 _PyTime_t t;
4682 struct timespec ts;
4683
Victor Stinnerc29b5852017-11-02 07:28:27 -07004684 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004685 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004686 }
4687 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004688 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004689 }
4690 if (_PyTime_AsTimespec(t, &ts) == -1) {
4691 return NULL;
4692 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004693 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4694}
4695#endif
4696
Victor Stinner62d1c702015-04-01 17:47:07 +02004697static PyObject *
4698test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4699{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004700 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004701 int round;
4702 _PyTime_t t, ms;
4703
Victor Stinnerc29b5852017-11-02 07:28:27 -07004704 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004705 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004706 }
4707 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004708 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004709 }
4710 if (check_time_rounding(round) < 0) {
4711 return NULL;
4712 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004713 ms = _PyTime_AsMilliseconds(t, round);
4714 /* This conversion rely on the fact that _PyTime_t is a number of
4715 nanoseconds */
4716 return _PyTime_AsNanosecondsObject(ms);
4717}
4718
4719static PyObject *
4720test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4721{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004722 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004723 int round;
4724 _PyTime_t t, ms;
4725
Victor Stinnerc29b5852017-11-02 07:28:27 -07004726 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004727 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004728 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004729 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004730 }
4731 if (check_time_rounding(round) < 0) {
4732 return NULL;
4733 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004734 ms = _PyTime_AsMicroseconds(t, round);
4735 /* This conversion rely on the fact that _PyTime_t is a number of
4736 nanoseconds */
4737 return _PyTime_AsNanosecondsObject(ms);
4738}
4739
Victor Stinner50856d52015-10-13 00:11:21 +02004740static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004741pymem_buffer_overflow(PyObject *self, PyObject *args)
4742{
4743 char *buffer;
4744
4745 /* Deliberate buffer overflow to check that PyMem_Free() detects
4746 the overflow when debug hooks are installed. */
4747 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004748 if (buffer == NULL) {
4749 PyErr_NoMemory();
4750 return NULL;
4751 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004752 buffer[16] = 'x';
4753 PyMem_Free(buffer);
4754
4755 Py_RETURN_NONE;
4756}
4757
4758static PyObject*
4759pymem_api_misuse(PyObject *self, PyObject *args)
4760{
4761 char *buffer;
4762
4763 /* Deliberate misusage of Python allocators:
4764 allococate with PyMem but release with PyMem_Raw. */
4765 buffer = PyMem_Malloc(16);
4766 PyMem_RawFree(buffer);
4767
4768 Py_RETURN_NONE;
4769}
4770
Victor Stinnerc4aec362016-03-14 22:26:53 +01004771static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004772pymem_malloc_without_gil(PyObject *self, PyObject *args)
4773{
4774 char *buffer;
4775
4776 /* Deliberate bug to test debug hooks on Python memory allocators:
4777 call PyMem_Malloc() without holding the GIL */
4778 Py_BEGIN_ALLOW_THREADS
4779 buffer = PyMem_Malloc(10);
4780 Py_END_ALLOW_THREADS
4781
4782 PyMem_Free(buffer);
4783
4784 Py_RETURN_NONE;
4785}
4786
Victor Stinner5d39e042017-11-29 17:20:38 +01004787
4788static PyObject*
4789test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4790{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004791 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004792 if (name == NULL) {
4793 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4794 return NULL;
4795 }
4796 return PyUnicode_FromString(name);
4797}
4798
4799
Victor Stinnerad524372016-03-16 12:12:53 +01004800static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004801test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004802{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004803 if (!_PyObject_IsFreed(op)) {
4804 return raiseTestError(test_name, "object is not seen as freed");
4805 }
4806 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004807}
4808
4809
4810static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004811check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4812{
4813 PyObject *op = NULL;
4814 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4815}
4816
4817
4818static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004819check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004820{
4821 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4822 if (op == NULL) {
4823 return NULL;
4824 }
4825 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004826 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004827 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004828 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004829}
4830
4831
4832static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004833check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004834{
4835 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4836 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4837 if (op == NULL) {
4838 return NULL;
4839 }
4840 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004841 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004842 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004843 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004844 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004845}
4846
4847
4848static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004849check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004850{
Miss Islington (bot)0895e62c2021-06-10 05:02:22 -07004851 /* This test would fail if run with the address sanitizer */
4852#ifdef _Py_ADDRESS_SANITIZER
4853 Py_RETURN_NONE;
4854#else
Victor Stinner2b00db62019-04-11 11:33:27 +02004855 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4856 if (op == NULL) {
4857 return NULL;
4858 }
4859 Py_TYPE(op)->tp_dealloc(op);
4860 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004861 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004862 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004863 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Miss Islington (bot)0895e62c2021-06-10 05:02:22 -07004864#endif
Victor Stinner2b00db62019-04-11 11:33:27 +02004865}
4866
4867
4868static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004869pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4870{
4871 char *buffer;
4872
Victor Stinnerad524372016-03-16 12:12:53 +01004873 /* Deliberate bug to test debug hooks on Python memory allocators:
4874 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004875 Py_BEGIN_ALLOW_THREADS
4876 buffer = PyObject_Malloc(10);
4877 Py_END_ALLOW_THREADS
4878
4879 PyObject_Free(buffer);
4880
4881 Py_RETURN_NONE;
4882}
4883
Victor Stinner10b73e12016-03-22 13:39:05 +01004884static PyObject *
4885tracemalloc_track(PyObject *self, PyObject *args)
4886{
4887 unsigned int domain;
4888 PyObject *ptr_obj;
4889 void *ptr;
4890 Py_ssize_t size;
4891 int release_gil = 0;
4892 int res;
4893
4894 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4895 return NULL;
4896 ptr = PyLong_AsVoidPtr(ptr_obj);
4897 if (PyErr_Occurred())
4898 return NULL;
4899
4900 if (release_gil) {
4901 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004902 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004903 Py_END_ALLOW_THREADS
4904 }
4905 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004906 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004907 }
4908
4909 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004910 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004911 return NULL;
4912 }
4913
4914 Py_RETURN_NONE;
4915}
4916
4917static PyObject *
4918tracemalloc_untrack(PyObject *self, PyObject *args)
4919{
4920 unsigned int domain;
4921 PyObject *ptr_obj;
4922 void *ptr;
4923 int res;
4924
4925 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4926 return NULL;
4927 ptr = PyLong_AsVoidPtr(ptr_obj);
4928 if (PyErr_Occurred())
4929 return NULL;
4930
Victor Stinner5ea4c062017-06-20 17:46:36 +02004931 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004932 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004933 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004934 return NULL;
4935 }
4936
4937 Py_RETURN_NONE;
4938}
4939
4940static PyObject *
4941tracemalloc_get_traceback(PyObject *self, PyObject *args)
4942{
4943 unsigned int domain;
4944 PyObject *ptr_obj;
4945 void *ptr;
4946
4947 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4948 return NULL;
4949 ptr = PyLong_AsVoidPtr(ptr_obj);
4950 if (PyErr_Occurred())
4951 return NULL;
4952
Benjamin Petersonca470632016-09-06 13:47:26 -07004953 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004954}
4955
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004956static PyObject *
4957dict_get_version(PyObject *self, PyObject *args)
4958{
4959 PyDictObject *dict;
4960 uint64_t version;
4961
4962 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4963 return NULL;
4964
4965 version = dict->ma_version_tag;
4966
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004967 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4968 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004969}
4970
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004971
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004972static PyObject *
4973raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4974{
Vladimir Matveev037245c2020-10-09 17:15:15 -07004975 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004976 PyGenObject *gen;
4977
4978 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4979 return NULL;
4980
4981 /* This is used in a test to check what happens if a signal arrives just
4982 as we're in the process of entering a yield from chain (see
4983 bpo-30039).
4984
4985 Needs to be done in C, because:
4986 - we don't have a Python wrapper for raise()
4987 - we need to make sure that the Python-level signal handler doesn't run
4988 *before* we enter the generator frame, which is impossible in Python
4989 because we check for signals before every bytecode operation.
4990 */
4991 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07004992 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004993}
4994
4995
Victor Stinner3b5cf852017-06-09 16:48:45 +02004996static int
4997fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4998{
4999 if (args == Py_None) {
5000 *stack = NULL;
5001 *nargs = 0;
5002 }
5003 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01005004 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02005005 *nargs = PyTuple_GET_SIZE(args);
5006 }
5007 else {
5008 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5009 return -1;
5010 }
5011 return 0;
5012}
5013
5014
5015static PyObject *
5016test_pyobject_fastcall(PyObject *self, PyObject *args)
5017{
5018 PyObject *func, *func_args;
5019 PyObject **stack;
5020 Py_ssize_t nargs;
5021
5022 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5023 return NULL;
5024 }
5025
5026 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5027 return NULL;
5028 }
5029 return _PyObject_FastCall(func, stack, nargs);
5030}
5031
5032
5033static PyObject *
5034test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5035{
5036 PyObject *func, *func_args, *kwargs;
5037 PyObject **stack;
5038 Py_ssize_t nargs;
5039
5040 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5041 return NULL;
5042 }
5043
5044 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5045 return NULL;
5046 }
5047
5048 if (kwargs == Py_None) {
5049 kwargs = NULL;
5050 }
5051 else if (!PyDict_Check(kwargs)) {
5052 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5053 return NULL;
5054 }
5055
Petr Viktorinffd97532020-02-11 17:46:57 +01005056 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005057}
5058
5059
5060static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005061test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005062{
5063 PyObject *func, *func_args, *kwnames = NULL;
5064 PyObject **stack;
5065 Py_ssize_t nargs, nkw;
5066
5067 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5068 return NULL;
5069 }
5070
5071 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5072 return NULL;
5073 }
5074
5075 if (kwnames == Py_None) {
5076 kwnames = NULL;
5077 }
5078 else if (PyTuple_Check(kwnames)) {
5079 nkw = PyTuple_GET_SIZE(kwnames);
5080 if (nargs < nkw) {
5081 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5082 return NULL;
5083 }
5084 nargs -= nkw;
5085 }
5086 else {
5087 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5088 return NULL;
5089 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005090 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005091}
5092
5093
5094static PyObject *
5095test_pyvectorcall_call(PyObject *self, PyObject *args)
5096{
5097 PyObject *func;
5098 PyObject *argstuple;
5099 PyObject *kwargs = NULL;
5100
5101 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5102 return NULL;
5103 }
5104
5105 if (!PyTuple_Check(argstuple)) {
5106 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5107 return NULL;
5108 }
5109 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5110 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5111 return NULL;
5112 }
5113
5114 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005115}
5116
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005117
Victor Stinner64fa4492017-07-10 14:37:49 +02005118static PyObject*
5119stack_pointer(PyObject *self, PyObject *args)
5120{
5121 int v = 5;
5122 return PyLong_FromVoidPtr(&v);
5123}
5124
Victor Stinner3b5cf852017-06-09 16:48:45 +02005125
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005126#ifdef W_STOPCODE
5127static PyObject*
5128py_w_stopcode(PyObject *self, PyObject *args)
5129{
5130 int sig, status;
5131 if (!PyArg_ParseTuple(args, "i", &sig)) {
5132 return NULL;
5133 }
5134 status = W_STOPCODE(sig);
5135 return PyLong_FromLong(status);
5136}
5137#endif
5138
5139
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005140static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005141get_mapping_keys(PyObject* self, PyObject *obj)
5142{
5143 return PyMapping_Keys(obj);
5144}
5145
5146static PyObject *
5147get_mapping_values(PyObject* self, PyObject *obj)
5148{
5149 return PyMapping_Values(obj);
5150}
5151
5152static PyObject *
5153get_mapping_items(PyObject* self, PyObject *obj)
5154{
5155 return PyMapping_Items(obj);
5156}
5157
5158
5159static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005160test_pythread_tss_key_state(PyObject *self, PyObject *args)
5161{
5162 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5163 if (PyThread_tss_is_created(&tss_key)) {
5164 return raiseTestError("test_pythread_tss_key_state",
5165 "TSS key not in an uninitialized state at "
5166 "creation time");
5167 }
5168 if (PyThread_tss_create(&tss_key) != 0) {
5169 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5170 return NULL;
5171 }
5172 if (!PyThread_tss_is_created(&tss_key)) {
5173 return raiseTestError("test_pythread_tss_key_state",
5174 "PyThread_tss_create succeeded, "
5175 "but with TSS key in an uninitialized state");
5176 }
5177 if (PyThread_tss_create(&tss_key) != 0) {
5178 return raiseTestError("test_pythread_tss_key_state",
5179 "PyThread_tss_create unsuccessful with "
5180 "an already initialized key");
5181 }
5182#define CHECK_TSS_API(expr) \
5183 (void)(expr); \
5184 if (!PyThread_tss_is_created(&tss_key)) { \
5185 return raiseTestError("test_pythread_tss_key_state", \
5186 "TSS key initialization state was not " \
5187 "preserved after calling " #expr); }
5188 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5189 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5190#undef CHECK_TSS_API
5191 PyThread_tss_delete(&tss_key);
5192 if (PyThread_tss_is_created(&tss_key)) {
5193 return raiseTestError("test_pythread_tss_key_state",
5194 "PyThread_tss_delete called, but did not "
5195 "set the key state to uninitialized");
5196 }
5197
5198 Py_tss_t *ptr_key = PyThread_tss_alloc();
5199 if (ptr_key == NULL) {
5200 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5201 return NULL;
5202 }
5203 if (PyThread_tss_is_created(ptr_key)) {
5204 return raiseTestError("test_pythread_tss_key_state",
5205 "TSS key not in an uninitialized state at "
5206 "allocation time");
5207 }
5208 PyThread_tss_free(ptr_key);
5209 ptr_key = NULL;
5210 Py_RETURN_NONE;
5211}
5212
5213
Yury Selivanovf23746a2018-01-22 19:11:18 -05005214static PyObject*
5215new_hamt(PyObject *self, PyObject *args)
5216{
5217 return _PyContext_NewHamtForTests();
5218}
5219
5220
jdemeyer5a306202018-10-19 23:50:06 +02005221/* def bad_get(self, obj, cls):
5222 cls()
5223 return repr(self)
5224*/
5225static PyObject*
5226bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5227{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005228 PyObject *self, *obj, *cls;
5229 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005230 return NULL;
5231 }
5232
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005233 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005234 if (res == NULL) {
5235 return NULL;
5236 }
5237 Py_DECREF(res);
5238
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005239 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005240}
5241
5242
Victor Stinner3d4226a2018-08-29 22:21:32 +02005243static PyObject *
5244encode_locale_ex(PyObject *self, PyObject *args)
5245{
5246 PyObject *unicode;
5247 int current_locale = 0;
5248 wchar_t *wstr;
5249 PyObject *res = NULL;
5250 const char *errors = NULL;
5251
5252 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5253 return NULL;
5254 }
5255 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5256 if (wstr == NULL) {
5257 return NULL;
5258 }
5259 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5260
5261 char *str = NULL;
5262 size_t error_pos;
5263 const char *reason = NULL;
5264 int ret = _Py_EncodeLocaleEx(wstr,
5265 &str, &error_pos, &reason,
5266 current_locale, error_handler);
5267 PyMem_Free(wstr);
5268
5269 switch(ret) {
5270 case 0:
5271 res = PyBytes_FromString(str);
5272 PyMem_RawFree(str);
5273 break;
5274 case -1:
5275 PyErr_NoMemory();
5276 break;
5277 case -2:
5278 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5279 error_pos, reason);
5280 break;
5281 case -3:
5282 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5283 break;
5284 default:
Miss Islington (bot)5afc5bb2021-10-07 01:55:18 -07005285 PyErr_SetString(PyExc_ValueError, "unknown error code");
Victor Stinner3d4226a2018-08-29 22:21:32 +02005286 break;
5287 }
5288 return res;
5289}
5290
5291
5292static PyObject *
5293decode_locale_ex(PyObject *self, PyObject *args)
5294{
5295 char *str;
5296 int current_locale = 0;
5297 PyObject *res = NULL;
5298 const char *errors = NULL;
5299
5300 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5301 return NULL;
5302 }
5303 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5304
5305 wchar_t *wstr = NULL;
5306 size_t wlen = 0;
5307 const char *reason = NULL;
5308 int ret = _Py_DecodeLocaleEx(str,
5309 &wstr, &wlen, &reason,
5310 current_locale, error_handler);
5311
5312 switch(ret) {
5313 case 0:
5314 res = PyUnicode_FromWideChar(wstr, wlen);
5315 PyMem_RawFree(wstr);
5316 break;
5317 case -1:
5318 PyErr_NoMemory();
5319 break;
5320 case -2:
5321 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5322 wlen, reason);
5323 break;
5324 case -3:
5325 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5326 break;
5327 default:
Miss Islington (bot)5afc5bb2021-10-07 01:55:18 -07005328 PyErr_SetString(PyExc_ValueError, "unknown error code");
Victor Stinner3d4226a2018-08-29 22:21:32 +02005329 break;
5330 }
5331 return res;
5332}
5333
5334
Victor Stinner18618e652018-10-25 17:28:11 +02005335#ifdef Py_REF_DEBUG
5336static PyObject *
5337negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5338{
5339 PyObject *obj = PyUnicode_FromString("negative_refcount");
5340 if (obj == NULL) {
5341 return NULL;
5342 }
5343 assert(Py_REFCNT(obj) == 1);
5344
Victor Stinnerc86a1122020-02-07 01:24:29 +01005345 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005346 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5347 Py_DECREF(obj);
5348
5349 Py_RETURN_NONE;
5350}
5351#endif
5352
5353
Victor Stinneref9d9b62019-05-22 11:28:22 +02005354static PyObject*
5355test_write_unraisable_exc(PyObject *self, PyObject *args)
5356{
Victor Stinner71c52e32019-05-27 08:57:14 +02005357 PyObject *exc, *err_msg, *obj;
5358 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005359 return NULL;
5360 }
5361
Victor Stinner71c52e32019-05-27 08:57:14 +02005362 const char *err_msg_utf8;
5363 if (err_msg != Py_None) {
5364 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5365 if (err_msg_utf8 == NULL) {
5366 return NULL;
5367 }
5368 }
5369 else {
5370 err_msg_utf8 = NULL;
5371 }
5372
Victor Stinneref9d9b62019-05-22 11:28:22 +02005373 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005374 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005375 Py_RETURN_NONE;
5376}
5377
5378
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005379static PyObject *
5380sequence_getitem(PyObject *self, PyObject *args)
5381{
5382 PyObject *seq;
5383 Py_ssize_t i;
5384 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5385 return NULL;
5386 }
5387 return PySequence_GetItem(seq, i);
5388}
5389
5390
Petr Viktorinf9583772019-09-10 12:21:09 +01005391/* Functions for testing C calling conventions (METH_*) are named meth_*,
5392 * e.g. "meth_varargs" for METH_VARARGS.
5393 *
5394 * They all return a tuple of their C-level arguments, with None instead
5395 * of NULL and Python tuples instead of C arrays.
5396 */
5397
5398
5399static PyObject*
5400_null_to_none(PyObject* obj)
5401{
5402 if (obj == NULL) {
5403 Py_RETURN_NONE;
5404 }
5405 Py_INCREF(obj);
5406 return obj;
5407}
5408
5409static PyObject*
5410meth_varargs(PyObject* self, PyObject* args)
5411{
5412 return Py_BuildValue("NO", _null_to_none(self), args);
5413}
5414
5415static PyObject*
5416meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5417{
5418 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5419}
5420
5421static PyObject*
5422meth_o(PyObject* self, PyObject* obj)
5423{
5424 return Py_BuildValue("NO", _null_to_none(self), obj);
5425}
5426
5427static PyObject*
5428meth_noargs(PyObject* self, PyObject* ignored)
5429{
5430 return _null_to_none(self);
5431}
5432
5433static PyObject*
5434_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5435{
5436 PyObject *tuple = PyTuple_New(nargs);
5437 if (tuple == NULL) {
5438 return NULL;
5439 }
5440 for (Py_ssize_t i=0; i < nargs; i++) {
5441 Py_INCREF(args[i]);
5442 PyTuple_SET_ITEM(tuple, i, args[i]);
5443 }
5444 return tuple;
5445}
5446
5447static PyObject*
5448meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5449{
5450 return Py_BuildValue(
5451 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5452 );
5453}
5454
5455static PyObject*
5456meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5457 Py_ssize_t nargs, PyObject* kwargs)
5458{
5459 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5460 if (pyargs == NULL) {
5461 return NULL;
5462 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005463 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005464 args + nargs, 0, kwargs);
5465 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5466}
5467
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005468
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005469static PyObject*
5470pynumber_tobase(PyObject *module, PyObject *args)
5471{
5472 PyObject *obj;
5473 int base;
5474 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5475 &obj, &base)) {
5476 return NULL;
5477 }
5478 return PyNumber_ToBase(obj, base);
5479}
5480
5481
Victor Stinner0e2ac212020-11-18 18:48:06 +01005482static PyObject*
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005483test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0e2ac212020-11-18 18:48:06 +01005484{
5485 PyObject *obj = PyList_New(0);
5486 if (obj == NULL) {
5487 return NULL;
5488 }
5489
5490 // Ensure that following tests don't modify the object,
5491 // to ensure that Py_DECREF() will not crash.
5492 assert(Py_TYPE(obj) == &PyList_Type);
5493 assert(Py_SIZE(obj) == 0);
5494
5495 // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5496 // as l-values to set an object type and size.
5497 Py_TYPE(obj) = &PyList_Type;
5498 Py_SIZE(obj) = 0;
5499
5500 Py_DECREF(obj);
5501 Py_RETURN_NONE;
5502}
5503
5504
Victor Stinner09bbebe2021-04-11 00:17:39 +02005505#define TEST_REFCOUNT() \
5506 do { \
5507 PyObject *obj = PyList_New(0); \
5508 if (obj == NULL) { \
5509 return NULL; \
5510 } \
5511 assert(Py_REFCNT(obj) == 1); \
5512 \
5513 /* test Py_NewRef() */ \
5514 PyObject *ref = Py_NewRef(obj); \
5515 assert(ref == obj); \
5516 assert(Py_REFCNT(obj) == 2); \
5517 Py_DECREF(ref); \
5518 \
5519 /* test Py_XNewRef() */ \
5520 PyObject *xref = Py_XNewRef(obj); \
5521 assert(xref == obj); \
5522 assert(Py_REFCNT(obj) == 2); \
5523 Py_DECREF(xref); \
5524 \
5525 assert(Py_XNewRef(NULL) == NULL); \
5526 \
5527 Py_DECREF(obj); \
5528 Py_RETURN_NONE; \
5529 } while (0) \
5530
5531
5532// Test Py_NewRef() and Py_XNewRef() macros
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005533static PyObject*
Victor Stinner09bbebe2021-04-11 00:17:39 +02005534test_refcount_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005535{
Victor Stinner09bbebe2021-04-11 00:17:39 +02005536 TEST_REFCOUNT();
5537}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005538
Victor Stinner09bbebe2021-04-11 00:17:39 +02005539#undef Py_NewRef
5540#undef Py_XNewRef
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005541
Victor Stinner09bbebe2021-04-11 00:17:39 +02005542// Test Py_NewRef() and Py_XNewRef() functions, after undefining macros.
5543static PyObject*
5544test_refcount_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5545{
5546 TEST_REFCOUNT();
5547}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005548
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005549
Victor Stinner09bbebe2021-04-11 00:17:39 +02005550// Test Py_Is() function
5551#define TEST_PY_IS() \
5552 do { \
5553 PyObject *o_none = Py_None; \
5554 PyObject *o_true = Py_True; \
5555 PyObject *o_false = Py_False; \
5556 PyObject *obj = PyList_New(0); \
5557 if (obj == NULL) { \
5558 return NULL; \
5559 } \
5560 \
5561 /* test Py_Is() */ \
5562 assert(Py_Is(obj, obj)); \
5563 assert(!Py_Is(obj, o_none)); \
5564 \
5565 /* test Py_None */ \
5566 assert(Py_Is(o_none, o_none)); \
5567 assert(!Py_Is(obj, o_none)); \
5568 \
5569 /* test Py_True */ \
5570 assert(Py_Is(o_true, o_true)); \
5571 assert(!Py_Is(o_false, o_true)); \
5572 assert(!Py_Is(obj, o_true)); \
5573 \
5574 /* test Py_False */ \
5575 assert(Py_Is(o_false, o_false)); \
5576 assert(!Py_Is(o_true, o_false)); \
5577 assert(!Py_Is(obj, o_false)); \
5578 \
5579 Py_DECREF(obj); \
5580 Py_RETURN_NONE; \
5581 } while (0)
5582
5583// Test Py_Is() macro
5584static PyObject*
5585test_py_is_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
5586{
5587 TEST_PY_IS();
5588}
5589
5590#undef Py_Is
5591
5592// Test Py_Is() function, after undefining its macro.
5593static PyObject*
5594test_py_is_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5595{
5596 TEST_PY_IS();
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005597}
5598
5599
Victor Stinnere2320252021-01-18 18:24:29 +01005600static PyObject *
5601test_fatal_error(PyObject *self, PyObject *args)
5602{
5603 char *message;
5604 int release_gil = 0;
5605 if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
5606 return NULL;
5607 if (release_gil) {
5608 Py_BEGIN_ALLOW_THREADS
5609 Py_FatalError(message);
5610 Py_END_ALLOW_THREADS
5611 }
5612 else {
5613 Py_FatalError(message);
5614 }
5615 // Py_FatalError() does not return, but exits the process.
5616 Py_RETURN_NONE;
5617}
5618
5619
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005620static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5621static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
Victor Stinnere2320252021-01-18 18:24:29 +01005622
Tim Peters9ea17ac2001-02-02 05:57:15 +00005623static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305625 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005626 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305627 {"test_config", test_config, METH_NOARGS},
5628 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005629 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005630 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5631 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5632 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5633 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5634 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5635 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005636 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005637 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005638 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5639 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5640 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5641 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5642 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5643 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005644 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5645 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005646 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5647 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5648 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5649 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
scoder3cc481b2021-04-28 18:12:16 +02005650 {"test_gc_control", test_gc_control, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305651 {"test_list_api", test_list_api, METH_NOARGS},
5652 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005653 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005654 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305655 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5656 {"test_long_api", test_long_api, METH_NOARGS},
5657 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5658 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5659 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5660 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005661 {"test_structseq_newtype_doesnt_leak",
5662 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07005663 {"test_structseq_newtype_null_descr_doc",
5664 test_structseq_newtype_null_descr_doc, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305665 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5666 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5667 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5668 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005669 {"test_long_as_unsigned_long_long_mask",
5670 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305671 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5672 {"test_k_code", test_k_code, METH_NOARGS},
5673 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005674 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07005675 {"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
5676 {"pyobject_str_from_null", pyobject_str_from_null, METH_NOARGS},
5677 {"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305679 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305681 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5682 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5683 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005685 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005686#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005687 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005688#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005689 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005690 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005691 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005692 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Hai Shia13b26c2020-11-11 04:53:46 +08005693 {"get_args", get_args, METH_VARARGS},
5694 {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
5695 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
5696 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005698 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005700 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005701 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005702 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005703 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005704 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 {"getargs_b", getargs_b, METH_VARARGS},
5706 {"getargs_B", getargs_B, METH_VARARGS},
5707 {"getargs_h", getargs_h, METH_VARARGS},
5708 {"getargs_H", getargs_H, METH_VARARGS},
5709 {"getargs_I", getargs_I, METH_VARARGS},
5710 {"getargs_k", getargs_k, METH_VARARGS},
5711 {"getargs_i", getargs_i, METH_VARARGS},
5712 {"getargs_l", getargs_l, METH_VARARGS},
5713 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005714 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 {"getargs_L", getargs_L, METH_VARARGS},
5716 {"getargs_K", getargs_K, METH_VARARGS},
5717 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305718 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5719 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005720 {"getargs_f", getargs_f, METH_VARARGS},
5721 {"getargs_d", getargs_d, METH_VARARGS},
5722 {"getargs_D", getargs_D, METH_VARARGS},
5723 {"getargs_S", getargs_S, METH_VARARGS},
5724 {"getargs_Y", getargs_Y, METH_VARARGS},
5725 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005726 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005727 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005728 {"getargs_s", getargs_s, METH_VARARGS},
5729 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5730 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005731 {"getargs_s_hash_int", (PyCFunction)(void(*)(void))getargs_s_hash_int,
5732 METH_VARARGS|METH_KEYWORDS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005733 {"getargs_z", getargs_z, METH_VARARGS},
5734 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5735 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5736 {"getargs_y", getargs_y, METH_VARARGS},
5737 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5738 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5739 {"getargs_u", getargs_u, METH_VARARGS},
5740 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5741 {"getargs_Z", getargs_Z, METH_VARARGS},
5742 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005743 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005744 {"getargs_es", getargs_es, METH_VARARGS},
5745 {"getargs_et", getargs_et, METH_VARARGS},
5746 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5747 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005749 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005751 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305752 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005753#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305754 {"test_u_code", test_u_code, METH_NOARGS},
5755 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005756#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305757 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005758 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5759 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005760 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005761 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5762 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005763 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005764 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005765#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005766 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5767 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005768 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005769#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005770 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005771 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005772#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005773 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005774#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005775 {"traceback_print", traceback_print, METH_VARARGS},
5776 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005777 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005778 {"argparsing", argparsing, METH_VARARGS},
5779 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005780 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305782 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005783 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305784 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005785 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005786 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5787 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005788 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005789 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005790 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305791 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5792 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5793 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5794 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005795 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5796 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305797 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005798 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005799 {"no_docstring",
5800 (PyCFunction)test_with_docstring, METH_NOARGS},
5801 {"docstring_empty",
5802 (PyCFunction)test_with_docstring, METH_NOARGS,
5803 docstring_empty},
5804 {"docstring_no_signature",
5805 (PyCFunction)test_with_docstring, METH_NOARGS,
5806 docstring_no_signature},
5807 {"docstring_with_invalid_signature",
5808 (PyCFunction)test_with_docstring, METH_NOARGS,
5809 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005810 {"docstring_with_invalid_signature2",
5811 (PyCFunction)test_with_docstring, METH_NOARGS,
5812 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005813 {"docstring_with_signature",
5814 (PyCFunction)test_with_docstring, METH_NOARGS,
5815 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005816 {"docstring_with_signature_but_no_doc",
5817 (PyCFunction)test_with_docstring, METH_NOARGS,
5818 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005819 {"docstring_with_signature_and_extra_newlines",
5820 (PyCFunction)test_with_docstring, METH_NOARGS,
5821 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005822 {"docstring_with_signature_with_defaults",
5823 (PyCFunction)test_with_docstring, METH_NOARGS,
5824 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005825 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5826 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005827 {"pymarshal_write_long_to_file",
5828 pymarshal_write_long_to_file, METH_VARARGS},
5829 {"pymarshal_write_object_to_file",
5830 pymarshal_write_object_to_file, METH_VARARGS},
5831 {"pymarshal_read_short_from_file",
5832 pymarshal_read_short_from_file, METH_VARARGS},
5833 {"pymarshal_read_long_from_file",
5834 pymarshal_read_long_from_file, METH_VARARGS},
5835 {"pymarshal_read_last_object_from_file",
5836 pymarshal_read_last_object_from_file, METH_VARARGS},
5837 {"pymarshal_read_object_from_file",
5838 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01005839 {"return_null_without_error", return_null_without_error, METH_NOARGS},
5840 {"return_result_with_error", return_result_with_error, METH_NOARGS},
5841 {"getitem_with_error", getitem_with_error, METH_VARARGS},
Pablo Galindo Salgadoe3aa9fd2021-11-17 23:17:18 +00005842 {"Py_CompileString", pycompilestring, METH_O},
Victor Stinner13019fd2015-04-03 13:10:54 +02005843 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005844 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5845 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005846 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005847#ifdef HAVE_CLOCK_GETTIME
5848 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5849#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005850 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5851 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005852 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5853 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005854 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005855 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005856 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005857 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5858 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5859 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005860 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005861 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5862 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5863 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005864 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005865 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005866 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5867 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005868 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5869 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005870 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005871#ifdef W_STOPCODE
5872 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5873#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005874 {"get_mapping_keys", get_mapping_keys, METH_O},
5875 {"get_mapping_values", get_mapping_values, METH_O},
5876 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005877 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005878 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005879 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005880 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5881 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005882#ifdef Py_REF_DEBUG
5883 {"negative_refcount", negative_refcount, METH_NOARGS},
5884#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005885 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005886 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005887 {"meth_varargs", meth_varargs, METH_VARARGS},
5888 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5889 {"meth_o", meth_o, METH_O},
5890 {"meth_noargs", meth_noargs, METH_NOARGS},
5891 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5892 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005893 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005894 {"without_gc", without_gc, METH_O},
Victor Stinner0e2ac212020-11-18 18:48:06 +01005895 {"test_set_type_size", test_set_type_size, METH_NOARGS},
Victor Stinner09bbebe2021-04-11 00:17:39 +02005896 {"test_refcount_macros", test_refcount_macros, METH_NOARGS},
5897 {"test_refcount_funcs", test_refcount_funcs, METH_NOARGS},
5898 {"test_py_is_macros", test_py_is_macros, METH_NOARGS},
5899 {"test_py_is_funcs", test_py_is_funcs, METH_NOARGS},
Victor Stinnere2320252021-01-18 18:24:29 +01005900 {"fatal_error", test_fatal_error, METH_VARARGS,
5901 PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005903};
5904
Thomas Hellera4ea6032003-04-17 18:55:45 +00005905#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5906
Thomas Wouters89f507f2006-12-13 04:49:30 +00005907typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 char bool_member;
5909 char byte_member;
5910 unsigned char ubyte_member;
5911 short short_member;
5912 unsigned short ushort_member;
5913 int int_member;
5914 unsigned int uint_member;
5915 long long_member;
5916 unsigned long ulong_member;
5917 Py_ssize_t pyssizet_member;
5918 float float_member;
5919 double double_member;
5920 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005921 long long longlong_member;
5922 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005923} all_structmembers;
5924
5925typedef struct {
5926 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005928} test_structmembers;
5929
5930static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5932 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5933 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5934 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5935 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5936 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5937 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5938 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5939 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5940 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5941 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5942 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5943 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5945 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005947};
5948
5949
Christian Heimes1af737c2008-01-23 08:24:23 +00005950static PyObject *
5951test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 static char *keywords[] = {
5954 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5955 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5956 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005959 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 test_structmembers *ob;
5961 const char *s = NULL;
5962 Py_ssize_t string_len = 0;
5963 ob = PyObject_New(test_structmembers, type);
5964 if (ob == NULL)
5965 return NULL;
5966 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5967 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5968 &ob->structmembers.bool_member,
5969 &ob->structmembers.byte_member,
5970 &ob->structmembers.ubyte_member,
5971 &ob->structmembers.short_member,
5972 &ob->structmembers.ushort_member,
5973 &ob->structmembers.int_member,
5974 &ob->structmembers.uint_member,
5975 &ob->structmembers.long_member,
5976 &ob->structmembers.ulong_member,
5977 &ob->structmembers.pyssizet_member,
5978 &ob->structmembers.float_member,
5979 &ob->structmembers.double_member,
5980 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 , &ob->structmembers.longlong_member,
5982 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 )) {
5984 Py_DECREF(ob);
5985 return NULL;
5986 }
5987 if (s != NULL) {
5988 if (string_len > 5) {
5989 Py_DECREF(ob);
5990 PyErr_SetString(PyExc_ValueError, "string too long");
5991 return NULL;
5992 }
5993 strcpy(ob->structmembers.inplace_member, s);
5994 }
5995 else {
5996 strcpy(ob->structmembers.inplace_member, "");
5997 }
5998 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005999}
6000
Christian Heimes1af737c2008-01-23 08:24:23 +00006001static void
6002test_structmembers_free(PyObject *ob)
6003{
Victor Stinner32bd68c2020-12-01 10:37:39 +01006004 PyObject_Free(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006005}
6006
6007static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00006008 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 "test_structmembersType",
6010 sizeof(test_structmembers), /* tp_basicsize */
6011 0, /* tp_itemsize */
6012 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006013 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 0, /* tp_getattr */
6015 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006016 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 0, /* tp_repr */
6018 0, /* tp_as_number */
6019 0, /* tp_as_sequence */
6020 0, /* tp_as_mapping */
6021 0, /* tp_hash */
6022 0, /* tp_call */
6023 0, /* tp_str */
6024 PyObject_GenericGetAttr, /* tp_getattro */
6025 PyObject_GenericSetAttr, /* tp_setattro */
6026 0, /* tp_as_buffer */
6027 0, /* tp_flags */
6028 "Type containing all structmember types",
6029 0, /* traverseproc tp_traverse */
6030 0, /* tp_clear */
6031 0, /* tp_richcompare */
6032 0, /* tp_weaklistoffset */
6033 0, /* tp_iter */
6034 0, /* tp_iternext */
6035 0, /* tp_methods */
6036 test_members, /* tp_members */
6037 0,
6038 0,
6039 0,
6040 0,
6041 0,
6042 0,
6043 0,
6044 0,
6045 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00006046};
6047
6048
Benjamin Petersond51374e2014-04-09 23:55:56 -04006049typedef struct {
6050 PyObject_HEAD
6051} matmulObject;
6052
6053static PyObject *
6054matmulType_matmul(PyObject *self, PyObject *other)
6055{
6056 return Py_BuildValue("(sOO)", "matmul", self, other);
6057}
6058
6059static PyObject *
6060matmulType_imatmul(PyObject *self, PyObject *other)
6061{
6062 return Py_BuildValue("(sOO)", "imatmul", self, other);
6063}
6064
6065static void
6066matmulType_dealloc(PyObject *self)
6067{
Zachary Ware420dc562014-04-23 13:51:27 -05006068 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006069}
6070
6071static PyNumberMethods matmulType_as_number = {
6072 0, /* nb_add */
6073 0, /* nb_subtract */
6074 0, /* nb_multiply */
6075 0, /* nb_remainde r*/
6076 0, /* nb_divmod */
6077 0, /* nb_power */
6078 0, /* nb_negative */
6079 0, /* tp_positive */
6080 0, /* tp_absolute */
6081 0, /* tp_bool */
6082 0, /* nb_invert */
6083 0, /* nb_lshift */
6084 0, /* nb_rshift */
6085 0, /* nb_and */
6086 0, /* nb_xor */
6087 0, /* nb_or */
6088 0, /* nb_int */
6089 0, /* nb_reserved */
6090 0, /* nb_float */
6091 0, /* nb_inplace_add */
6092 0, /* nb_inplace_subtract */
6093 0, /* nb_inplace_multiply */
6094 0, /* nb_inplace_remainder */
6095 0, /* nb_inplace_power */
6096 0, /* nb_inplace_lshift */
6097 0, /* nb_inplace_rshift */
6098 0, /* nb_inplace_and */
6099 0, /* nb_inplace_xor */
6100 0, /* nb_inplace_or */
6101 0, /* nb_floor_divide */
6102 0, /* nb_true_divide */
6103 0, /* nb_inplace_floor_divide */
6104 0, /* nb_inplace_true_divide */
6105 0, /* nb_index */
6106 matmulType_matmul, /* nb_matrix_multiply */
6107 matmulType_imatmul /* nb_matrix_inplace_multiply */
6108};
6109
6110static PyTypeObject matmulType = {
6111 PyVarObject_HEAD_INIT(NULL, 0)
6112 "matmulType",
6113 sizeof(matmulObject), /* tp_basicsize */
6114 0, /* tp_itemsize */
6115 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006116 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006117 0, /* tp_getattr */
6118 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006119 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006120 0, /* tp_repr */
6121 &matmulType_as_number, /* tp_as_number */
6122 0, /* tp_as_sequence */
6123 0, /* tp_as_mapping */
6124 0, /* tp_hash */
6125 0, /* tp_call */
6126 0, /* tp_str */
6127 PyObject_GenericGetAttr, /* tp_getattro */
6128 PyObject_GenericSetAttr, /* tp_setattro */
6129 0, /* tp_as_buffer */
6130 0, /* tp_flags */
6131 "C level type with matrix operations defined",
6132 0, /* traverseproc tp_traverse */
6133 0, /* tp_clear */
6134 0, /* tp_richcompare */
6135 0, /* tp_weaklistoffset */
6136 0, /* tp_iter */
6137 0, /* tp_iternext */
6138 0, /* tp_methods */
6139 0, /* tp_members */
6140 0,
6141 0,
6142 0,
6143 0,
6144 0,
6145 0,
6146 0,
6147 0,
6148 PyType_GenericNew, /* tp_new */
6149 PyObject_Del, /* tp_free */
6150};
6151
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006152typedef struct {
6153 PyObject_HEAD
6154} ipowObject;
6155
6156static PyObject *
6157ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6158{
6159 return Py_BuildValue("OO", other, mod);
6160}
6161
6162static PyNumberMethods ipowType_as_number = {
6163 .nb_inplace_power = ipowType_ipow
6164};
6165
6166static PyTypeObject ipowType = {
6167 PyVarObject_HEAD_INIT(NULL, 0)
6168 .tp_name = "ipowType",
6169 .tp_basicsize = sizeof(ipowObject),
6170 .tp_as_number = &ipowType_as_number,
6171 .tp_new = PyType_GenericNew
6172};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006173
Yury Selivanov75445082015-05-11 22:57:16 -04006174typedef struct {
6175 PyObject_HEAD
6176 PyObject *ao_iterator;
6177} awaitObject;
6178
6179
6180static PyObject *
6181awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6182{
6183 PyObject *v;
6184 awaitObject *ao;
6185
6186 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6187 return NULL;
6188
6189 ao = (awaitObject *)type->tp_alloc(type, 0);
6190 if (ao == NULL) {
6191 return NULL;
6192 }
6193
6194 Py_INCREF(v);
6195 ao->ao_iterator = v;
6196
6197 return (PyObject *)ao;
6198}
6199
6200
6201static void
6202awaitObject_dealloc(awaitObject *ao)
6203{
6204 Py_CLEAR(ao->ao_iterator);
6205 Py_TYPE(ao)->tp_free(ao);
6206}
6207
6208
6209static PyObject *
6210awaitObject_await(awaitObject *ao)
6211{
6212 Py_INCREF(ao->ao_iterator);
6213 return ao->ao_iterator;
6214}
6215
6216static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006217 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006218 0, /* am_aiter */
Vladimir Matveev1e996c32020-11-10 12:09:55 -08006219 0, /* am_anext */
6220 0, /* am_send */
Yury Selivanov75445082015-05-11 22:57:16 -04006221};
6222
6223
6224static PyTypeObject awaitType = {
6225 PyVarObject_HEAD_INIT(NULL, 0)
6226 "awaitType",
6227 sizeof(awaitObject), /* tp_basicsize */
6228 0, /* tp_itemsize */
6229 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006230 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006231 0, /* tp_getattr */
6232 0, /* tp_setattr */
6233 &awaitType_as_async, /* tp_as_async */
6234 0, /* tp_repr */
6235 0, /* tp_as_number */
6236 0, /* tp_as_sequence */
6237 0, /* tp_as_mapping */
6238 0, /* tp_hash */
6239 0, /* tp_call */
6240 0, /* tp_str */
6241 PyObject_GenericGetAttr, /* tp_getattro */
6242 PyObject_GenericSetAttr, /* tp_setattro */
6243 0, /* tp_as_buffer */
6244 0, /* tp_flags */
6245 "C level type with tp_as_async",
6246 0, /* traverseproc tp_traverse */
6247 0, /* tp_clear */
6248 0, /* tp_richcompare */
6249 0, /* tp_weaklistoffset */
6250 0, /* tp_iter */
6251 0, /* tp_iternext */
6252 0, /* tp_methods */
6253 0, /* tp_members */
6254 0,
6255 0,
6256 0,
6257 0,
6258 0,
6259 0,
6260 0,
6261 0,
6262 awaitObject_new, /* tp_new */
6263 PyObject_Del, /* tp_free */
6264};
6265
6266
xdegaye56d1f5c2017-10-26 15:09:06 +02006267static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6268
6269static PyTypeObject PyRecursingInfinitelyError_Type = {
6270 PyVarObject_HEAD_INIT(NULL, 0)
6271 "RecursingInfinitelyError", /* tp_name */
6272 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6273 0, /* tp_itemsize */
6274 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006275 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006276 0, /* tp_getattr */
6277 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006278 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006279 0, /* tp_repr */
6280 0, /* tp_as_number */
6281 0, /* tp_as_sequence */
6282 0, /* tp_as_mapping */
6283 0, /* tp_hash */
6284 0, /* tp_call */
6285 0, /* tp_str */
6286 0, /* tp_getattro */
6287 0, /* tp_setattro */
6288 0, /* tp_as_buffer */
6289 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6290 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6291 0, /* tp_traverse */
6292 0, /* tp_clear */
6293 0, /* tp_richcompare */
6294 0, /* tp_weaklistoffset */
6295 0, /* tp_iter */
6296 0, /* tp_iternext */
6297 0, /* tp_methods */
6298 0, /* tp_members */
6299 0, /* tp_getset */
6300 0, /* tp_base */
6301 0, /* tp_dict */
6302 0, /* tp_descr_get */
6303 0, /* tp_descr_set */
6304 0, /* tp_dictoffset */
6305 (initproc)recurse_infinitely_error_init, /* tp_init */
6306 0, /* tp_alloc */
6307 0, /* tp_new */
6308};
6309
6310static int
6311recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6312{
6313 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6314
6315 /* Instantiating this exception starts infinite recursion. */
6316 Py_INCREF(type);
6317 PyErr_SetObject(type, NULL);
6318 return -1;
6319}
6320
6321
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006322/* Test bpo-35983: create a subclass of "list" which checks that instances
6323 * are not deallocated twice */
6324
6325typedef struct {
6326 PyListObject list;
6327 int deallocated;
6328} MyListObject;
6329
6330static PyObject *
6331MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6332{
6333 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6334 ((MyListObject*)op)->deallocated = 0;
6335 return op;
6336}
6337
6338void
6339MyList_dealloc(MyListObject* op)
6340{
6341 if (op->deallocated) {
6342 /* We cannot raise exceptions here but we still want the testsuite
6343 * to fail when we hit this */
6344 Py_FatalError("MyList instance deallocated twice");
6345 }
6346 op->deallocated = 1;
6347 PyList_Type.tp_dealloc((PyObject *)op);
6348}
6349
6350static PyTypeObject MyList_Type = {
6351 PyVarObject_HEAD_INIT(NULL, 0)
6352 "MyList",
6353 sizeof(MyListObject),
6354 0,
6355 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006356 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006357 0, /* tp_getattr */
6358 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006359 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006360 0, /* tp_repr */
6361 0, /* tp_as_number */
6362 0, /* tp_as_sequence */
6363 0, /* tp_as_mapping */
6364 0, /* tp_hash */
6365 0, /* tp_call */
6366 0, /* tp_str */
6367 0, /* tp_getattro */
6368 0, /* tp_setattro */
6369 0, /* tp_as_buffer */
6370 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6371 0, /* tp_doc */
6372 0, /* tp_traverse */
6373 0, /* tp_clear */
6374 0, /* tp_richcompare */
6375 0, /* tp_weaklistoffset */
6376 0, /* tp_iter */
6377 0, /* tp_iternext */
6378 0, /* tp_methods */
6379 0, /* tp_members */
6380 0, /* tp_getset */
6381 0, /* &PyList_Type */ /* tp_base */
6382 0, /* tp_dict */
6383 0, /* tp_descr_get */
6384 0, /* tp_descr_set */
6385 0, /* tp_dictoffset */
6386 0, /* tp_init */
6387 0, /* tp_alloc */
6388 MyList_new, /* tp_new */
6389};
6390
6391
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006392/* Test PEP 560 */
6393
6394typedef struct {
6395 PyObject_HEAD
6396 PyObject *item;
6397} PyGenericAliasObject;
6398
6399static void
6400generic_alias_dealloc(PyGenericAliasObject *self)
6401{
6402 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006403 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006404}
6405
6406static PyObject *
6407generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6408{
6409 return PyTuple_Pack(1, self->item);
6410}
6411
6412static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006413 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006414 {NULL} /* sentinel */
6415};
6416
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006417static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006418 PyVarObject_HEAD_INIT(NULL, 0)
6419 "GenericAlias",
6420 sizeof(PyGenericAliasObject),
6421 0,
6422 .tp_dealloc = (destructor)generic_alias_dealloc,
6423 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6424 .tp_methods = generic_alias_methods,
6425};
6426
6427static PyObject *
6428generic_alias_new(PyObject *item)
6429{
6430 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6431 if (o == NULL) {
6432 return NULL;
6433 }
6434 Py_INCREF(item);
6435 o->item = item;
6436 return (PyObject*) o;
6437}
6438
6439typedef struct {
6440 PyObject_HEAD
6441} PyGenericObject;
6442
6443static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006444generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006445{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006446 return generic_alias_new(item);
6447}
6448
6449static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006450 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006451 {NULL} /* sentinel */
6452};
6453
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006454static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006455 PyVarObject_HEAD_INIT(NULL, 0)
6456 "Generic",
6457 sizeof(PyGenericObject),
6458 0,
6459 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6460 .tp_methods = generic_methods,
6461};
6462
6463
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006464/* Test PEP 590 */
6465
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006466typedef struct {
6467 PyObject_HEAD
6468 vectorcallfunc vectorcall;
6469} MethodDescriptorObject;
6470
6471static PyObject *
6472MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6473 size_t nargsf, PyObject *kwnames)
6474{
6475 /* True if using the vectorcall function in MethodDescriptorObject
6476 * but False for MethodDescriptor2Object */
6477 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6478 return PyBool_FromLong(md->vectorcall != NULL);
6479}
6480
6481static PyObject *
6482MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6483{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006484 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006485 op->vectorcall = MethodDescriptor_vectorcall;
6486 return (PyObject *)op;
6487}
6488
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006489static PyObject *
6490func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6491{
6492 if (obj == Py_None || obj == NULL) {
6493 Py_INCREF(func);
6494 return func;
6495 }
6496 return PyMethod_New(func, obj);
6497}
6498
6499static PyObject *
6500nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6501{
6502 Py_INCREF(func);
6503 return func;
6504}
6505
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006506static PyObject *
6507call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6508{
6509 Py_INCREF(args);
6510 return args;
6511}
6512
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006513static PyTypeObject MethodDescriptorBase_Type = {
6514 PyVarObject_HEAD_INIT(NULL, 0)
6515 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006516 sizeof(MethodDescriptorObject),
6517 .tp_new = MethodDescriptor_new,
6518 .tp_call = PyVectorcall_Call,
6519 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6520 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006521 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006522 .tp_descr_get = func_descr_get,
6523};
6524
6525static PyTypeObject MethodDescriptorDerived_Type = {
6526 PyVarObject_HEAD_INIT(NULL, 0)
6527 "MethodDescriptorDerived",
6528 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6529};
6530
6531static PyTypeObject MethodDescriptorNopGet_Type = {
6532 PyVarObject_HEAD_INIT(NULL, 0)
6533 "MethodDescriptorNopGet",
6534 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006535 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006536 .tp_descr_get = nop_descr_get,
6537};
6538
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006539typedef struct {
6540 MethodDescriptorObject base;
6541 vectorcallfunc vectorcall;
6542} MethodDescriptor2Object;
6543
6544static PyObject *
6545MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6546{
6547 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6548 op->base.vectorcall = NULL;
6549 op->vectorcall = MethodDescriptor_vectorcall;
6550 return (PyObject *)op;
6551}
6552
6553static PyTypeObject MethodDescriptor2_Type = {
6554 PyVarObject_HEAD_INIT(NULL, 0)
6555 "MethodDescriptor2",
6556 sizeof(MethodDescriptor2Object),
6557 .tp_new = MethodDescriptor2_new,
6558 .tp_call = PyVectorcall_Call,
6559 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006560 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006561};
6562
Benjamin Peterson39403332020-09-02 11:29:06 -05006563PyDoc_STRVAR(heapdocctype__doc__,
6564"HeapDocCType(arg1, arg2)\n"
6565"--\n"
6566"\n"
6567"somedoc");
6568
6569typedef struct {
6570 PyObject_HEAD
6571} HeapDocCTypeObject;
6572
6573static PyType_Slot HeapDocCType_slots[] = {
6574 {Py_tp_doc, (char*)heapdocctype__doc__},
6575 {0},
6576};
6577
6578static PyType_Spec HeapDocCType_spec = {
6579 "_testcapi.HeapDocCType",
6580 sizeof(HeapDocCTypeObject),
6581 0,
6582 Py_TPFLAGS_DEFAULT,
6583 HeapDocCType_slots
6584};
6585
Hai Shi88c2cfd2020-11-07 00:04:47 +08006586typedef struct {
6587 PyObject_HEAD
6588} NullTpDocTypeObject;
6589
6590static PyType_Slot NullTpDocType_slots[] = {
6591 {Py_tp_doc, NULL},
6592 {0, 0},
6593};
6594
6595static PyType_Spec NullTpDocType_spec = {
6596 "_testcapi.NullTpDocType",
6597 sizeof(NullTpDocTypeObject),
6598 0,
6599 Py_TPFLAGS_DEFAULT,
6600 NullTpDocType_slots
6601};
6602
Benjamin Peterson39403332020-09-02 11:29:06 -05006603
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006604PyDoc_STRVAR(heapgctype__doc__,
6605"A heap type with GC, and with overridden dealloc.\n\n"
6606"The 'value' attribute is set to 10 in __init__.");
6607
6608typedef struct {
6609 PyObject_HEAD
6610 int value;
6611} HeapCTypeObject;
6612
6613static struct PyMemberDef heapctype_members[] = {
6614 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6615 {NULL} /* Sentinel */
6616};
6617
6618static int
6619heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6620{
6621 ((HeapCTypeObject *)self)->value = 10;
6622 return 0;
6623}
6624
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006625static int
6626heapgcctype_traverse(HeapCTypeObject *self, visitproc visit, void *arg)
6627{
6628 Py_VISIT(Py_TYPE(self));
6629 return 0;
6630}
6631
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006632static void
6633heapgcctype_dealloc(HeapCTypeObject *self)
6634{
6635 PyTypeObject *tp = Py_TYPE(self);
6636 PyObject_GC_UnTrack(self);
6637 PyObject_GC_Del(self);
6638 Py_DECREF(tp);
6639}
6640
6641static PyType_Slot HeapGcCType_slots[] = {
6642 {Py_tp_init, heapctype_init},
6643 {Py_tp_members, heapctype_members},
6644 {Py_tp_dealloc, heapgcctype_dealloc},
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006645 {Py_tp_traverse, heapgcctype_traverse},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006646 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006647 {0, 0},
6648};
6649
6650static PyType_Spec HeapGcCType_spec = {
6651 "_testcapi.HeapGcCType",
6652 sizeof(HeapCTypeObject),
6653 0,
6654 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6655 HeapGcCType_slots
6656};
6657
6658PyDoc_STRVAR(heapctype__doc__,
6659"A heap type without GC, but with overridden dealloc.\n\n"
6660"The 'value' attribute is set to 10 in __init__.");
6661
6662static void
6663heapctype_dealloc(HeapCTypeObject *self)
6664{
6665 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006666 PyObject_Free(self);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006667 Py_DECREF(tp);
6668}
6669
6670static PyType_Slot HeapCType_slots[] = {
6671 {Py_tp_init, heapctype_init},
6672 {Py_tp_members, heapctype_members},
6673 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006674 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006675 {0, 0},
6676};
6677
6678static PyType_Spec HeapCType_spec = {
6679 "_testcapi.HeapCType",
6680 sizeof(HeapCTypeObject),
6681 0,
6682 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6683 HeapCType_slots
6684};
6685
6686PyDoc_STRVAR(heapctypesubclass__doc__,
6687"Subclass of HeapCType, without GC.\n\n"
6688"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6689
6690typedef struct {
6691 HeapCTypeObject base;
6692 int value2;
6693} HeapCTypeSubclassObject;
6694
6695static int
6696heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6697{
6698 /* Call __init__ of the superclass */
6699 if (heapctype_init(self, args, kwargs) < 0) {
6700 return -1;
6701 }
6702 /* Initialize additional element */
6703 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6704 return 0;
6705}
6706
6707static struct PyMemberDef heapctypesubclass_members[] = {
6708 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6709 {NULL} /* Sentinel */
6710};
6711
6712static PyType_Slot HeapCTypeSubclass_slots[] = {
6713 {Py_tp_init, heapctypesubclass_init},
6714 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006715 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006716 {0, 0},
6717};
6718
6719static PyType_Spec HeapCTypeSubclass_spec = {
6720 "_testcapi.HeapCTypeSubclass",
6721 sizeof(HeapCTypeSubclassObject),
6722 0,
6723 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6724 HeapCTypeSubclass_slots
6725};
6726
scoderf7c4e232020-06-06 21:35:10 +02006727PyDoc_STRVAR(heapctypewithbuffer__doc__,
6728"Heap type with buffer support.\n\n"
6729"The buffer is set to [b'1', b'2', b'3', b'4']");
6730
6731typedef struct {
6732 HeapCTypeObject base;
6733 char buffer[4];
6734} HeapCTypeWithBufferObject;
6735
6736static int
6737heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6738{
6739 self->buffer[0] = '1';
6740 self->buffer[1] = '2';
6741 self->buffer[2] = '3';
6742 self->buffer[3] = '4';
6743 return PyBuffer_FillInfo(
6744 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6745}
6746
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006747static void
scoderf7c4e232020-06-06 21:35:10 +02006748heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6749{
6750 assert(view->obj == (void*) self);
6751}
6752
6753static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6754 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6755 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6756 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6757 {0, 0},
6758};
6759
6760static PyType_Spec HeapCTypeWithBuffer_spec = {
6761 "_testcapi.HeapCTypeWithBuffer",
6762 sizeof(HeapCTypeWithBufferObject),
6763 0,
6764 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6765 HeapCTypeWithBuffer_slots
6766};
6767
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006768PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6769"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6770"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6771"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6772
6773static int
6774heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6775{
6776 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6777 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6778 base_init(self, args, kwargs);
6779 return 0;
6780}
6781
6782static void
6783heapctypesubclasswithfinalizer_finalize(PyObject *self)
6784{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006785 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006786 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006787
6788 /* Save the current exception, if any. */
6789 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6790
6791 m = PyState_FindModule(&_testcapimodule);
6792 if (m == NULL) {
6793 goto cleanup_finalize;
6794 }
6795 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6796 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6797 if (oldtype == NULL || newtype == NULL) {
6798 goto cleanup_finalize;
6799 }
6800
6801 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6802 goto cleanup_finalize;
6803 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006804 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6805 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006806 goto cleanup_finalize;
6807 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006808 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6809 goto cleanup_finalize;
6810 }
6811 Py_DECREF(refcnt);
6812 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6813 if (refcnt == NULL) {
6814 goto cleanup_finalize;
6815 }
6816 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006817 goto cleanup_finalize;
6818 }
6819
6820cleanup_finalize:
6821 Py_XDECREF(oldtype);
6822 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006823 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006824
6825 /* Restore the saved exception. */
6826 PyErr_Restore(error_type, error_value, error_traceback);
6827}
6828
6829static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6830 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6831 {Py_tp_members, heapctypesubclass_members},
6832 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006833 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006834 {0, 0},
6835};
6836
6837static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6838 "_testcapi.HeapCTypeSubclassWithFinalizer",
6839 sizeof(HeapCTypeSubclassObject),
6840 0,
6841 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6842 HeapCTypeSubclassWithFinalizer_slots
6843};
6844
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006845typedef struct {
6846 PyObject_HEAD
6847 PyObject *dict;
6848} HeapCTypeWithDictObject;
6849
6850static void
6851heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6852{
6853
6854 PyTypeObject *tp = Py_TYPE(self);
6855 Py_XDECREF(self->dict);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006856 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006857 Py_DECREF(tp);
6858}
6859
6860static PyGetSetDef heapctypewithdict_getsetlist[] = {
6861 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6862 {NULL} /* Sentinel */
6863};
6864
6865static struct PyMemberDef heapctypewithdict_members[] = {
6866 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6867 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6868 {NULL} /* Sentinel */
6869};
6870
6871static PyType_Slot HeapCTypeWithDict_slots[] = {
6872 {Py_tp_members, heapctypewithdict_members},
6873 {Py_tp_getset, heapctypewithdict_getsetlist},
6874 {Py_tp_dealloc, heapctypewithdict_dealloc},
6875 {0, 0},
6876};
6877
6878static PyType_Spec HeapCTypeWithDict_spec = {
6879 "_testcapi.HeapCTypeWithDict",
6880 sizeof(HeapCTypeWithDictObject),
6881 0,
6882 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6883 HeapCTypeWithDict_slots
6884};
6885
6886static struct PyMemberDef heapctypewithnegativedict_members[] = {
6887 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006888 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006889 {NULL} /* Sentinel */
6890};
6891
6892static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6893 {Py_tp_members, heapctypewithnegativedict_members},
6894 {Py_tp_getset, heapctypewithdict_getsetlist},
6895 {Py_tp_dealloc, heapctypewithdict_dealloc},
6896 {0, 0},
6897};
6898
6899static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6900 "_testcapi.HeapCTypeWithNegativeDict",
6901 sizeof(HeapCTypeWithDictObject),
6902 0,
6903 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6904 HeapCTypeWithNegativeDict_slots
6905};
6906
6907typedef struct {
6908 PyObject_HEAD
6909 PyObject *weakreflist;
6910} HeapCTypeWithWeakrefObject;
6911
6912static struct PyMemberDef heapctypewithweakref_members[] = {
6913 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6914 {"__weaklistoffset__", T_PYSSIZET,
6915 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6916 {NULL} /* Sentinel */
6917};
6918
6919static void
6920heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6921{
6922
6923 PyTypeObject *tp = Py_TYPE(self);
6924 if (self->weakreflist != NULL)
6925 PyObject_ClearWeakRefs((PyObject *) self);
6926 Py_XDECREF(self->weakreflist);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006927 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006928 Py_DECREF(tp);
6929}
6930
6931static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6932 {Py_tp_members, heapctypewithweakref_members},
6933 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6934 {0, 0},
6935};
6936
6937static PyType_Spec HeapCTypeWithWeakref_spec = {
6938 "_testcapi.HeapCTypeWithWeakref",
6939 sizeof(HeapCTypeWithWeakrefObject),
6940 0,
6941 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6942 HeapCTypeWithWeakref_slots
6943};
6944
scoder148f3292020-07-03 02:09:28 +02006945PyDoc_STRVAR(heapctypesetattr__doc__,
6946"A heap type without GC, but with overridden __setattr__.\n\n"
6947"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6948
6949typedef struct {
6950 PyObject_HEAD
6951 long value;
6952} HeapCTypeSetattrObject;
6953
6954static struct PyMemberDef heapctypesetattr_members[] = {
6955 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6956 {NULL} /* Sentinel */
6957};
6958
6959static int
6960heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6961{
6962 ((HeapCTypeSetattrObject *)self)->value = 10;
6963 return 0;
6964}
6965
6966static void
6967heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6968{
6969 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006970 PyObject_Free(self);
scoder148f3292020-07-03 02:09:28 +02006971 Py_DECREF(tp);
6972}
6973
6974static int
6975heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6976{
6977 PyObject *svalue = PyUnicode_FromString("value");
6978 if (svalue == NULL)
6979 return -1;
6980 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6981 Py_DECREF(svalue);
6982 if (eq < 0)
6983 return -1;
6984 if (!eq) {
6985 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6986 }
6987 if (value == NULL) {
6988 self->value = 0;
6989 return 0;
6990 }
6991 PyObject *ivalue = PyNumber_Long(value);
6992 if (ivalue == NULL)
6993 return -1;
6994 long v = PyLong_AsLong(ivalue);
6995 Py_DECREF(ivalue);
6996 if (v == -1 && PyErr_Occurred())
6997 return -1;
6998 self->value = v;
6999 return 0;
7000}
7001
7002static PyType_Slot HeapCTypeSetattr_slots[] = {
7003 {Py_tp_init, heapctypesetattr_init},
7004 {Py_tp_members, heapctypesetattr_members},
7005 {Py_tp_setattro, heapctypesetattr_setattro},
7006 {Py_tp_dealloc, heapctypesetattr_dealloc},
7007 {Py_tp_doc, (char*)heapctypesetattr__doc__},
7008 {0, 0},
7009};
7010
7011static PyType_Spec HeapCTypeSetattr_spec = {
7012 "_testcapi.HeapCTypeSetattr",
7013 sizeof(HeapCTypeSetattrObject),
7014 0,
7015 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7016 HeapCTypeSetattr_slots
7017};
7018
Petr Viktorinf9583772019-09-10 12:21:09 +01007019static PyMethodDef meth_instance_methods[] = {
7020 {"meth_varargs", meth_varargs, METH_VARARGS},
7021 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
7022 {"meth_o", meth_o, METH_O},
7023 {"meth_noargs", meth_noargs, METH_NOARGS},
7024 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
7025 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
7026 {NULL, NULL} /* sentinel */
7027};
7028
7029
7030static PyTypeObject MethInstance_Type = {
7031 PyVarObject_HEAD_INIT(NULL, 0)
7032 "MethInstance",
7033 sizeof(PyObject),
7034 .tp_new = PyType_GenericNew,
7035 .tp_flags = Py_TPFLAGS_DEFAULT,
7036 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01007037 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01007038 "Class with normal (instance) methods to test calling conventions"),
7039};
7040
7041static PyMethodDef meth_class_methods[] = {
7042 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
7043 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
7044 {"meth_o", meth_o, METH_O|METH_CLASS},
7045 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
7046 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
7047 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
7048 {NULL, NULL} /* sentinel */
7049};
7050
7051
7052static PyTypeObject MethClass_Type = {
7053 PyVarObject_HEAD_INIT(NULL, 0)
7054 "MethClass",
7055 sizeof(PyObject),
7056 .tp_new = PyType_GenericNew,
7057 .tp_flags = Py_TPFLAGS_DEFAULT,
7058 .tp_methods = meth_class_methods,
7059 .tp_doc = PyDoc_STR(
7060 "Class with class methods to test calling conventions"),
7061};
7062
7063static PyMethodDef meth_static_methods[] = {
7064 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
7065 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
7066 {"meth_o", meth_o, METH_O|METH_STATIC},
7067 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
7068 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
7069 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
7070 {NULL, NULL} /* sentinel */
7071};
7072
7073
7074static PyTypeObject MethStatic_Type = {
7075 PyVarObject_HEAD_INIT(NULL, 0)
7076 "MethStatic",
7077 sizeof(PyObject),
7078 .tp_new = PyType_GenericNew,
7079 .tp_flags = Py_TPFLAGS_DEFAULT,
7080 .tp_methods = meth_static_methods,
7081 .tp_doc = PyDoc_STR(
7082 "Class with static methods to test calling conventions"),
7083};
7084
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007085/* ContainerNoGC -- a simple container without GC methods */
7086
7087typedef struct {
7088 PyObject_HEAD
7089 PyObject *value;
7090} ContainerNoGCobject;
7091
7092static PyObject *
7093ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
7094{
7095 PyObject *value;
7096 char *names[] = {"value", NULL};
7097 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
7098 return NULL;
7099 }
7100 PyObject *self = type->tp_alloc(type, 0);
7101 if (self == NULL) {
7102 return NULL;
7103 }
7104 Py_INCREF(value);
7105 ((ContainerNoGCobject *)self)->value = value;
7106 return self;
7107}
7108
7109static void
7110ContainerNoGC_dealloc(ContainerNoGCobject *self)
7111{
7112 Py_DECREF(self->value);
7113 Py_TYPE(self)->tp_free((PyObject *)self);
7114}
7115
7116static PyMemberDef ContainerNoGC_members[] = {
7117 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7118 PyDoc_STR("a container value for test purposes")},
7119 {0}
7120};
7121
7122static PyTypeObject ContainerNoGC_type = {
7123 PyVarObject_HEAD_INIT(NULL, 0)
7124 "_testcapi.ContainerNoGC",
7125 sizeof(ContainerNoGCobject),
7126 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7127 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7128 .tp_members = ContainerNoGC_members,
7129 .tp_new = ContainerNoGC_new,
7130};
7131
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007132
Martin v. Löwis1a214512008-06-11 05:26:20 +00007133static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007134 PyModuleDef_HEAD_INIT,
7135 "_testcapi",
7136 NULL,
7137 -1,
7138 TestMethods,
7139 NULL,
7140 NULL,
7141 NULL,
7142 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007143};
7144
Nick Coghland5cacbb2015-05-23 22:24:10 +10007145/* Per PEP 489, this module will not be converted to multi-phase initialization
7146 */
7147
Mark Hammond62b1ab12002-07-23 06:31:15 +00007148PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007149PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007151 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007153 m = PyModule_Create(&_testcapimodule);
7154 if (m == NULL)
7155 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007156
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007157 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007158
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007159 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160 Py_INCREF(&test_structmembersType);
7161 /* don't use a name starting with "test", since we don't want
7162 test_capi to automatically call this */
7163 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007164 if (PyType_Ready(&matmulType) < 0)
7165 return NULL;
7166 Py_INCREF(&matmulType);
7167 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007168 if (PyType_Ready(&ipowType) < 0) {
7169 return NULL;
7170 }
7171 Py_INCREF(&ipowType);
7172 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007173
Yury Selivanov75445082015-05-11 22:57:16 -04007174 if (PyType_Ready(&awaitType) < 0)
7175 return NULL;
7176 Py_INCREF(&awaitType);
7177 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7178
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007179 MyList_Type.tp_base = &PyList_Type;
7180 if (PyType_Ready(&MyList_Type) < 0)
7181 return NULL;
7182 Py_INCREF(&MyList_Type);
7183 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7184
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007185 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7186 return NULL;
7187 Py_INCREF(&MethodDescriptorBase_Type);
7188 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7189
7190 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7191 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7192 return NULL;
7193 Py_INCREF(&MethodDescriptorDerived_Type);
7194 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7195
7196 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7197 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7198 return NULL;
7199 Py_INCREF(&MethodDescriptorNopGet_Type);
7200 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7201
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007202 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7203 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7204 return NULL;
7205 Py_INCREF(&MethodDescriptor2_Type);
7206 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7207
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007208 if (PyType_Ready(&GenericAlias_Type) < 0)
7209 return NULL;
7210 Py_INCREF(&GenericAlias_Type);
7211 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7212
7213 if (PyType_Ready(&Generic_Type) < 0)
7214 return NULL;
7215 Py_INCREF(&Generic_Type);
7216 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7217
Petr Viktorinf9583772019-09-10 12:21:09 +01007218 if (PyType_Ready(&MethInstance_Type) < 0)
7219 return NULL;
7220 Py_INCREF(&MethInstance_Type);
7221 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7222
7223 if (PyType_Ready(&MethClass_Type) < 0)
7224 return NULL;
7225 Py_INCREF(&MethClass_Type);
7226 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7227
7228 if (PyType_Ready(&MethStatic_Type) < 0)
7229 return NULL;
7230 Py_INCREF(&MethStatic_Type);
7231 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7232
xdegaye56d1f5c2017-10-26 15:09:06 +02007233 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7234 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7235 return NULL;
7236 }
7237 Py_INCREF(&PyRecursingInfinitelyError_Type);
7238 PyModule_AddObject(m, "RecursingInfinitelyError",
7239 (PyObject *)&PyRecursingInfinitelyError_Type);
7240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7242 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7243 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7244 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7245 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7246 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7247 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7248 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7249 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7250 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7251 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7252 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7253 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7254 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7255 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7256 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007257 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7258 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7259 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7261 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007262 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263 Py_INCREF(&PyInstanceMethod_Type);
7264 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007265
Larry Hastings2a727912014-01-16 11:32:01 -08007266 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007267 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007268#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007269 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007270#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007271 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007272#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007273 Py_INCREF(v);
7274 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7277 Py_INCREF(TestError);
7278 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007279
Benjamin Peterson39403332020-09-02 11:29:06 -05007280 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7281 if (HeapDocCType == NULL) {
7282 return NULL;
7283 }
7284 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7285
Hai Shi88c2cfd2020-11-07 00:04:47 +08007286 /* bpo-41832: Add a new type to test PyType_FromSpec()
7287 now can accept a NULL tp_doc slot. */
7288 PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
7289 if (NullTpDocType == NULL) {
7290 return NULL;
7291 }
7292 PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
7293
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007294 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7295 if (HeapGcCType == NULL) {
7296 return NULL;
7297 }
7298 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7299
7300 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7301 if (HeapCType == NULL) {
7302 return NULL;
7303 }
7304 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7305 if (subclass_bases == NULL) {
7306 return NULL;
7307 }
7308 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7309 if (HeapCTypeSubclass == NULL) {
7310 return NULL;
7311 }
7312 Py_DECREF(subclass_bases);
7313 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7314
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007315 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7316 if (HeapCTypeWithDict == NULL) {
7317 return NULL;
7318 }
7319 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7320
7321 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7322 if (HeapCTypeWithNegativeDict == NULL) {
7323 return NULL;
7324 }
7325 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7326
7327 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7328 if (HeapCTypeWithWeakref == NULL) {
7329 return NULL;
7330 }
7331 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7332
scoderf7c4e232020-06-06 21:35:10 +02007333 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7334 if (HeapCTypeWithBuffer == NULL) {
7335 return NULL;
7336 }
7337 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7338
scoder148f3292020-07-03 02:09:28 +02007339 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7340 if (HeapCTypeSetattr == NULL) {
7341 return NULL;
7342 }
7343 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7344
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007345 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7346 if (subclass_with_finalizer_bases == NULL) {
7347 return NULL;
7348 }
7349 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7350 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7351 if (HeapCTypeSubclassWithFinalizer == NULL) {
7352 return NULL;
7353 }
7354 Py_DECREF(subclass_with_finalizer_bases);
7355 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7356
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007357 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7358 return NULL;
7359 }
7360 Py_INCREF(&ContainerNoGC_type);
7361 if (PyModule_AddObject(m, "ContainerNoGC",
7362 (PyObject *) &ContainerNoGC_type) < 0)
7363 return NULL;
7364
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007365 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007367}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007368
7369
7370/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7371
7372#undef Py_BuildValue
7373PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7374
7375static PyObject *
7376test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7377{
7378 PyObject *res;
7379 const char str[] = "string";
7380 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007381 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007382
7383 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7384 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007385 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007386 return NULL;
7387 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007388 PyErr_Clear();
7389
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007390 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7391 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007392 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007393 return NULL;
7394 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007395 PyErr_Clear();
7396
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007397 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7398 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007399 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007400 return NULL;
7401 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007402 PyErr_Clear();
7403
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007404 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7405 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007406 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007407 return NULL;
7408 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007409 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007410
7411
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007412 Py_RETURN_NONE;
7413}
Miss Islington (bot)569ca812021-05-06 20:18:42 -07007414
7415#undef PyArg_ParseTupleAndKeywords
7416PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
7417 const char *, char **, ...);
7418
7419static PyObject *
7420getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
7421{
7422 static char *keywords[] = {"", "x", NULL};
7423 const char *s;
7424 int len;
7425 int i = 0;
7426 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s#i", keywords, &s, &len, &i))
7427 return NULL;
7428 Py_RETURN_NONE;
7429}