blob: 5e5954925211561fe24e351adee420c849b3f675 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Hai Shi5dd21f52020-04-21 00:49:13 +080013
Victor Stinner5c75f372019-04-17 23:02:26 +020014#undef Py_BUILD_CORE_MODULE
Hai Shi5dd21f52020-04-21 00:49:13 +080015/* Always enable assertions */
16#undef NDEBUG
Victor Stinner5c75f372019-04-17 23:02:26 +020017
Neal Norwitz8866e0a2007-10-27 04:01:17 +000018#define PY_SSIZE_T_CLEAN
19
Tim Peters9ea17ac2001-02-02 05:57:15 +000020#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000021#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020022#include "marshal.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020023#include "structmember.h" // PyMemberDef
Victor Stinnera1c249c2018-11-01 03:15:58 +010024#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020025#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000026
Victor Stinner95e9cef2015-03-28 01:26:47 +010027#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020028# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010029#endif
30
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020031#ifdef HAVE_SYS_WAIT_H
32#include <sys/wait.h> /* For W_STOPCODE */
33#endif
34
Victor Stinner5ed69952018-11-06 15:59:52 +010035#ifdef Py_BUILD_CORE
36# error "_testcapi must test the public Python C API, not CPython internal C API"
37#endif
38
Eddie Elizondoff023ed2019-09-11 05:17:13 -040039static struct PyModuleDef _testcapimodule;
40
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000042
Tim Peters91621db2001-06-12 20:10:01 +000043/* Raise TestError with test_name + ": " + msg, and return NULL. */
44
45static PyObject *
46raiseTestError(const char* test_name, const char* msg)
47{
Victor Stinner6ced7c42011-03-21 18:15:42 +010048 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000050}
51
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000052/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000053
54 The ones derived from autoconf on the UNIX-like OSes can be relied
55 upon (in the absence of sloppy cross-compiling), but the Windows
56 platforms have these hardcoded. Better safe than sorry.
57*/
58static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000059sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000061{
Victor Stinner499dfcf2011-03-21 13:26:24 +010062 PyErr_Format(TestError,
63 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000066}
67
68static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053069test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000070{
Tim Peters9ea17ac2001-02-02 05:57:15 +000071#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (FATNAME != sizeof(TYPE)) \
73 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 CHECK_SIZEOF(SIZEOF_SHORT, short);
76 CHECK_SIZEOF(SIZEOF_INT, int);
77 CHECK_SIZEOF(SIZEOF_LONG, long);
78 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
79 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070080 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000081
82#undef CHECK_SIZEOF
83
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020084 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000085}
86
Tim Peters5c4d5bf2001-02-12 22:13:26 +000087static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053088test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010089{
Ned Deilye37a1942015-03-05 15:47:10 -080090#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020091#pragma GCC diagnostic push
92#pragma GCC diagnostic ignored "-Wtype-limits"
93#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010094#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010095 if (EXPECTED != sizeof(TYPE)) { \
96 PyErr_Format(TestError, \
97 "sizeof(%s) = %u instead of %u", \
98 #TYPE, sizeof(TYPE), EXPECTED); \
99 return (PyObject*)NULL; \
100 }
Victor Stinnerf866f972013-10-29 19:59:31 +0100101#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
102#define CHECK_SIGNNESS(TYPE, SIGNED) \
103 if (IS_SIGNED(TYPE) != SIGNED) { \
104 PyErr_Format(TestError, \
105 "%s signness is, instead of %i", \
106 #TYPE, IS_SIGNED(TYPE), SIGNED); \
107 return (PyObject*)NULL; \
108 }
Victor Stinner01076552013-10-29 19:39:52 +0100109
110 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(Py_UCS1, 1);
112 CHECK_SIZEOF(Py_UCS2, 2);
113 CHECK_SIZEOF(Py_UCS4, 4);
114 CHECK_SIGNNESS(Py_UCS1, 0);
115 CHECK_SIGNNESS(Py_UCS2, 0);
116 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700117 CHECK_SIZEOF(int32_t, 4);
118 CHECK_SIGNNESS(int32_t, 1);
119 CHECK_SIZEOF(uint32_t, 4);
120 CHECK_SIGNNESS(uint32_t, 0);
121 CHECK_SIZEOF(int64_t, 8);
122 CHECK_SIGNNESS(int64_t, 1);
123 CHECK_SIZEOF(uint64_t, 8);
124 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100125
126 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100127 CHECK_SIZEOF(size_t, sizeof(void *));
128 CHECK_SIGNNESS(size_t, 0);
129 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
130 CHECK_SIGNNESS(Py_ssize_t, 1);
131
Benjamin Petersonca470632016-09-06 13:47:26 -0700132 CHECK_SIZEOF(uintptr_t, sizeof(void *));
133 CHECK_SIGNNESS(uintptr_t, 0);
134 CHECK_SIZEOF(intptr_t, sizeof(void *));
135 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100136
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200137 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100138
Victor Stinnerf866f972013-10-29 19:59:31 +0100139#undef IS_SIGNED
140#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100141#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800142#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200143#pragma GCC diagnostic pop
144#endif
Victor Stinner01076552013-10-29 19:39:52 +0100145}
146
scoder3cc481b2021-04-28 18:12:16 +0200147static PyObject*
148test_gc_control(PyObject *self, PyObject *Py_UNUSED(ignored))
149{
150 int orig_enabled = PyGC_IsEnabled();
151 const char* msg = "ok";
152 int old_state;
153
154 old_state = PyGC_Enable();
155 msg = "Enable(1)";
156 if (old_state != orig_enabled) {
157 goto failed;
158 }
159 msg = "IsEnabled(1)";
160 if (!PyGC_IsEnabled()) {
161 goto failed;
162 }
163
164 old_state = PyGC_Disable();
165 msg = "disable(2)";
166 if (!old_state) {
167 goto failed;
168 }
169 msg = "IsEnabled(2)";
170 if (PyGC_IsEnabled()) {
171 goto failed;
172 }
173
174 old_state = PyGC_Enable();
175 msg = "enable(3)";
176 if (old_state) {
177 goto failed;
178 }
179 msg = "IsEnabled(3)";
180 if (!PyGC_IsEnabled()) {
181 goto failed;
182 }
183
184 if (!orig_enabled) {
185 old_state = PyGC_Disable();
186 msg = "disable(4)";
187 if (old_state) {
188 goto failed;
189 }
190 msg = "IsEnabled(4)";
191 if (PyGC_IsEnabled()) {
192 goto failed;
193 }
194 }
195
196 Py_RETURN_NONE;
197
198failed:
199 /* Try to clean up if we can. */
200 if (orig_enabled) {
201 PyGC_Enable();
202 } else {
203 PyGC_Disable();
204 }
205 PyErr_Format(TestError, "GC control failed in %s", msg);
206 return NULL;
207}
Victor Stinner01076552013-10-29 19:39:52 +0100208
209static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530210test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 PyObject* list;
213 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000216#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 list = PyList_New(NLIST);
218 if (list == (PyObject*)NULL)
219 return (PyObject*)NULL;
220 /* list = range(NLIST) */
221 for (i = 0; i < NLIST; ++i) {
222 PyObject* anint = PyLong_FromLong(i);
223 if (anint == (PyObject*)NULL) {
224 Py_DECREF(list);
225 return (PyObject*)NULL;
226 }
227 PyList_SET_ITEM(list, i, anint);
228 }
229 /* list.reverse(), via PyList_Reverse() */
230 i = PyList_Reverse(list); /* should not blow up! */
231 if (i != 0) {
232 Py_DECREF(list);
233 return (PyObject*)NULL;
234 }
235 /* Check that list == range(29, -1, -1) now */
236 for (i = 0; i < NLIST; ++i) {
237 PyObject* anint = PyList_GET_ITEM(list, i);
238 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
239 PyErr_SetString(TestError,
240 "test_list_api: reverse screwed up");
241 Py_DECREF(list);
242 return (PyObject*)NULL;
243 }
244 }
245 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000246#undef NLIST
247
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200248 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000249}
250
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000251static int
252test_dict_inner(int count)
253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 Py_ssize_t pos = 0, iterations = 0;
255 int i;
256 PyObject *dict = PyDict_New();
257 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 if (dict == NULL)
260 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 for (i = 0; i < count; i++) {
263 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200264 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200265 return -1;
266 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200267 if (PyDict_SetItem(dict, v, v) < 0) {
268 Py_DECREF(v);
269 return -1;
270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 Py_DECREF(v);
272 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 while (PyDict_Next(dict, &pos, &k, &v)) {
275 PyObject *o;
276 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 i = PyLong_AS_LONG(v) + 1;
279 o = PyLong_FromLong(i);
280 if (o == NULL)
281 return -1;
282 if (PyDict_SetItem(dict, k, o) < 0) {
283 Py_DECREF(o);
284 return -1;
285 }
286 Py_DECREF(o);
287 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 if (iterations != count) {
292 PyErr_SetString(
293 TestError,
294 "test_dict_iteration: dict iteration went wrong ");
295 return -1;
296 } else {
297 return 0;
298 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000299}
300
301static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530302test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 for (i = 0; i < 200; i++) {
307 if (test_dict_inner(i) < 0) {
308 return NULL;
309 }
310 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000311
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200312 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000313}
314
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200315static PyObject*
316dict_getitem_knownhash(PyObject *self, PyObject *args)
317{
318 PyObject *mp, *key, *result;
319 Py_ssize_t hash;
320
321 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
322 &mp, &key, &hash)) {
323 return NULL;
324 }
325
326 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
327 if (result == NULL && !PyErr_Occurred()) {
328 _PyErr_SetKeyError(key);
329 return NULL;
330 }
331
332 Py_XINCREF(result);
333 return result;
334}
Tim Peters91621db2001-06-12 20:10:01 +0000335
Victor Stinner3d3f2642016-12-15 17:21:23 +0100336static PyObject*
337dict_hassplittable(PyObject *self, PyObject *arg)
338{
339 if (!PyDict_Check(arg)) {
340 PyErr_Format(PyExc_TypeError,
341 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100342 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100343 return NULL;
344 }
345
346 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
347}
348
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000349/* Issue #4701: Check that PyObject_Hash implicitly calls
350 * PyType_Ready if it hasn't already been called
351 */
352static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 PyVarObject_HEAD_INIT(NULL, 0)
354 "hashinheritancetester", /* Name of this type */
355 sizeof(PyObject), /* Basic object size */
356 0, /* Item size for varobject */
357 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200358 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 0, /* tp_getattr */
360 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200361 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 0, /* tp_repr */
363 0, /* tp_as_number */
364 0, /* tp_as_sequence */
365 0, /* tp_as_mapping */
366 0, /* tp_hash */
367 0, /* tp_call */
368 0, /* tp_str */
369 PyObject_GenericGetAttr, /* tp_getattro */
370 0, /* tp_setattro */
371 0, /* tp_as_buffer */
372 Py_TPFLAGS_DEFAULT, /* tp_flags */
373 0, /* tp_doc */
374 0, /* tp_traverse */
375 0, /* tp_clear */
376 0, /* tp_richcompare */
377 0, /* tp_weaklistoffset */
378 0, /* tp_iter */
379 0, /* tp_iternext */
380 0, /* tp_methods */
381 0, /* tp_members */
382 0, /* tp_getset */
383 0, /* tp_base */
384 0, /* tp_dict */
385 0, /* tp_descr_get */
386 0, /* tp_descr_set */
387 0, /* tp_dictoffset */
388 0, /* tp_init */
389 0, /* tp_alloc */
390 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000391};
392
393static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530394test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 PyTypeObject *type;
397 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000398 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 if (type->tp_dict != NULL)
403 /* The type has already been initialized. This probably means
404 -R is being used. */
405 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000406
407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 obj = PyObject_New(PyObject, type);
409 if (obj == NULL) {
410 PyErr_Clear();
411 PyErr_SetString(
412 TestError,
413 "test_lazy_hash_inheritance: failed to create object");
414 return NULL;
415 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (type->tp_dict != NULL) {
418 PyErr_SetString(
419 TestError,
420 "test_lazy_hash_inheritance: type initialised too soon");
421 Py_DECREF(obj);
422 return NULL;
423 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 hash = PyObject_Hash(obj);
426 if ((hash == -1) && PyErr_Occurred()) {
427 PyErr_Clear();
428 PyErr_SetString(
429 TestError,
430 "test_lazy_hash_inheritance: could not hash object");
431 Py_DECREF(obj);
432 return NULL;
433 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 if (type->tp_dict == NULL) {
436 PyErr_SetString(
437 TestError,
438 "test_lazy_hash_inheritance: type not initialised by hash()");
439 Py_DECREF(obj);
440 return NULL;
441 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 if (type->tp_hash != PyType_Type.tp_hash) {
444 PyErr_SetString(
445 TestError,
446 "test_lazy_hash_inheritance: unexpected hash function");
447 Py_DECREF(obj);
448 return NULL;
449 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000454}
455
456
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700457/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000458 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000459
460 Note that the meat of the test is contained in testcapi_long.h.
461 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700462 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000463 dependence on type names makes it impossible to use a parameterized
464 function. A giant macro would be even worse than this. A C++ template
465 would be perfect.
466
467 The "report an error" functions are deliberately not part of the #include
468 file: if the test fails, you can set a breakpoint in the appropriate
469 error function directly, and crawl back from there in the debugger.
470*/
471
472#define UNBIND(X) Py_DECREF(X); (X) = NULL
473
474static PyObject *
475raise_test_long_error(const char* msg)
476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000478}
479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480#define TESTNAME test_long_api_inner
481#define TYPENAME long
482#define F_S_TO_PY PyLong_FromLong
483#define F_PY_TO_S PyLong_AsLong
484#define F_U_TO_PY PyLong_FromUnsignedLong
485#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000486
487#include "testcapi_long.h"
488
489static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530490test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000493}
494
495#undef TESTNAME
496#undef TYPENAME
497#undef F_S_TO_PY
498#undef F_PY_TO_S
499#undef F_U_TO_PY
500#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000501
Tim Peters91621db2001-06-12 20:10:01 +0000502static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000503raise_test_longlong_error(const char* msg)
504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000506}
507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700509#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510#define F_S_TO_PY PyLong_FromLongLong
511#define F_PY_TO_S PyLong_AsLongLong
512#define F_U_TO_PY PyLong_FromUnsignedLongLong
513#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000514
515#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000516
517static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000521}
522
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000523#undef TESTNAME
524#undef TYPENAME
525#undef F_S_TO_PY
526#undef F_PY_TO_S
527#undef F_U_TO_PY
528#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000529
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000530/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
531 is tested by test_long_api_inner. This test will concentrate on proper
532 handling of overflow.
533*/
534
535static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530536test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyObject *num, *one, *temp;
539 long value;
540 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Test that overflow is set properly for a large value. */
543 /* num is a number larger than LONG_MAX even on 64-bit platforms */
544 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
545 if (num == NULL)
546 return NULL;
547 overflow = 1234;
548 value = PyLong_AsLongAndOverflow(num, &overflow);
549 Py_DECREF(num);
550 if (value == -1 && PyErr_Occurred())
551 return NULL;
552 if (value != -1)
553 return raiseTestError("test_long_and_overflow",
554 "return value was not set to -1");
555 if (overflow != 1)
556 return raiseTestError("test_long_and_overflow",
557 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* Same again, with num = LONG_MAX + 1 */
560 num = PyLong_FromLong(LONG_MAX);
561 if (num == NULL)
562 return NULL;
563 one = PyLong_FromLong(1L);
564 if (one == NULL) {
565 Py_DECREF(num);
566 return NULL;
567 }
568 temp = PyNumber_Add(num, one);
569 Py_DECREF(one);
570 Py_DECREF(num);
571 num = temp;
572 if (num == NULL)
573 return NULL;
574 overflow = 0;
575 value = PyLong_AsLongAndOverflow(num, &overflow);
576 Py_DECREF(num);
577 if (value == -1 && PyErr_Occurred())
578 return NULL;
579 if (value != -1)
580 return raiseTestError("test_long_and_overflow",
581 "return value was not set to -1");
582 if (overflow != 1)
583 return raiseTestError("test_long_and_overflow",
584 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 /* Test that overflow is set properly for a large negative value. */
587 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
588 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
589 if (num == NULL)
590 return NULL;
591 overflow = 1234;
592 value = PyLong_AsLongAndOverflow(num, &overflow);
593 Py_DECREF(num);
594 if (value == -1 && PyErr_Occurred())
595 return NULL;
596 if (value != -1)
597 return raiseTestError("test_long_and_overflow",
598 "return value was not set to -1");
599 if (overflow != -1)
600 return raiseTestError("test_long_and_overflow",
601 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Same again, with num = LONG_MIN - 1 */
604 num = PyLong_FromLong(LONG_MIN);
605 if (num == NULL)
606 return NULL;
607 one = PyLong_FromLong(1L);
608 if (one == NULL) {
609 Py_DECREF(num);
610 return NULL;
611 }
612 temp = PyNumber_Subtract(num, one);
613 Py_DECREF(one);
614 Py_DECREF(num);
615 num = temp;
616 if (num == NULL)
617 return NULL;
618 overflow = 0;
619 value = PyLong_AsLongAndOverflow(num, &overflow);
620 Py_DECREF(num);
621 if (value == -1 && PyErr_Occurred())
622 return NULL;
623 if (value != -1)
624 return raiseTestError("test_long_and_overflow",
625 "return value was not set to -1");
626 if (overflow != -1)
627 return raiseTestError("test_long_and_overflow",
628 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Test that overflow is cleared properly for small values. */
631 num = PyLong_FromString("FF", NULL, 16);
632 if (num == NULL)
633 return NULL;
634 overflow = 1234;
635 value = PyLong_AsLongAndOverflow(num, &overflow);
636 Py_DECREF(num);
637 if (value == -1 && PyErr_Occurred())
638 return NULL;
639 if (value != 0xFF)
640 return raiseTestError("test_long_and_overflow",
641 "expected return value 0xFF");
642 if (overflow != 0)
643 return raiseTestError("test_long_and_overflow",
644 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 num = PyLong_FromString("-FF", NULL, 16);
647 if (num == NULL)
648 return NULL;
649 overflow = 0;
650 value = PyLong_AsLongAndOverflow(num, &overflow);
651 Py_DECREF(num);
652 if (value == -1 && PyErr_Occurred())
653 return NULL;
654 if (value != -0xFF)
655 return raiseTestError("test_long_and_overflow",
656 "expected return value 0xFF");
657 if (overflow != 0)
658 return raiseTestError("test_long_and_overflow",
659 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 num = PyLong_FromLong(LONG_MAX);
662 if (num == NULL)
663 return NULL;
664 overflow = 1234;
665 value = PyLong_AsLongAndOverflow(num, &overflow);
666 Py_DECREF(num);
667 if (value == -1 && PyErr_Occurred())
668 return NULL;
669 if (value != LONG_MAX)
670 return raiseTestError("test_long_and_overflow",
671 "expected return value LONG_MAX");
672 if (overflow != 0)
673 return raiseTestError("test_long_and_overflow",
674 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 num = PyLong_FromLong(LONG_MIN);
677 if (num == NULL)
678 return NULL;
679 overflow = 0;
680 value = PyLong_AsLongAndOverflow(num, &overflow);
681 Py_DECREF(num);
682 if (value == -1 && PyErr_Occurred())
683 return NULL;
684 if (value != LONG_MIN)
685 return raiseTestError("test_long_and_overflow",
686 "expected return value LONG_MIN");
687 if (overflow != 0)
688 return raiseTestError("test_long_and_overflow",
689 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000690
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200691 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000692}
693
Mark Dickinson93f562c2010-01-30 10:30:15 +0000694/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700695 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000696 concentrate on proper handling of overflow.
697*/
698
699static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530700test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700703 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500707 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
709 if (num == NULL)
710 return NULL;
711 overflow = 1234;
712 value = PyLong_AsLongLongAndOverflow(num, &overflow);
713 Py_DECREF(num);
714 if (value == -1 && PyErr_Occurred())
715 return NULL;
716 if (value != -1)
717 return raiseTestError("test_long_long_and_overflow",
718 "return value was not set to -1");
719 if (overflow != 1)
720 return raiseTestError("test_long_long_and_overflow",
721 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000722
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500723 /* Same again, with num = LLONG_MAX + 1 */
724 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 if (num == NULL)
726 return NULL;
727 one = PyLong_FromLong(1L);
728 if (one == NULL) {
729 Py_DECREF(num);
730 return NULL;
731 }
732 temp = PyNumber_Add(num, one);
733 Py_DECREF(one);
734 Py_DECREF(num);
735 num = temp;
736 if (num == NULL)
737 return NULL;
738 overflow = 0;
739 value = PyLong_AsLongLongAndOverflow(num, &overflow);
740 Py_DECREF(num);
741 if (value == -1 && PyErr_Occurred())
742 return NULL;
743 if (value != -1)
744 return raiseTestError("test_long_long_and_overflow",
745 "return value was not set to -1");
746 if (overflow != 1)
747 return raiseTestError("test_long_long_and_overflow",
748 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500751 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
753 if (num == NULL)
754 return NULL;
755 overflow = 1234;
756 value = PyLong_AsLongLongAndOverflow(num, &overflow);
757 Py_DECREF(num);
758 if (value == -1 && PyErr_Occurred())
759 return NULL;
760 if (value != -1)
761 return raiseTestError("test_long_long_and_overflow",
762 "return value was not set to -1");
763 if (overflow != -1)
764 return raiseTestError("test_long_long_and_overflow",
765 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000766
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500767 /* Same again, with num = LLONG_MIN - 1 */
768 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (num == NULL)
770 return NULL;
771 one = PyLong_FromLong(1L);
772 if (one == NULL) {
773 Py_DECREF(num);
774 return NULL;
775 }
776 temp = PyNumber_Subtract(num, one);
777 Py_DECREF(one);
778 Py_DECREF(num);
779 num = temp;
780 if (num == NULL)
781 return NULL;
782 overflow = 0;
783 value = PyLong_AsLongLongAndOverflow(num, &overflow);
784 Py_DECREF(num);
785 if (value == -1 && PyErr_Occurred())
786 return NULL;
787 if (value != -1)
788 return raiseTestError("test_long_long_and_overflow",
789 "return value was not set to -1");
790 if (overflow != -1)
791 return raiseTestError("test_long_long_and_overflow",
792 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* Test that overflow is cleared properly for small values. */
795 num = PyLong_FromString("FF", NULL, 16);
796 if (num == NULL)
797 return NULL;
798 overflow = 1234;
799 value = PyLong_AsLongLongAndOverflow(num, &overflow);
800 Py_DECREF(num);
801 if (value == -1 && PyErr_Occurred())
802 return NULL;
803 if (value != 0xFF)
804 return raiseTestError("test_long_long_and_overflow",
805 "expected return value 0xFF");
806 if (overflow != 0)
807 return raiseTestError("test_long_long_and_overflow",
808 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 num = PyLong_FromString("-FF", NULL, 16);
811 if (num == NULL)
812 return NULL;
813 overflow = 0;
814 value = PyLong_AsLongLongAndOverflow(num, &overflow);
815 Py_DECREF(num);
816 if (value == -1 && PyErr_Occurred())
817 return NULL;
818 if (value != -0xFF)
819 return raiseTestError("test_long_long_and_overflow",
820 "expected return value 0xFF");
821 if (overflow != 0)
822 return raiseTestError("test_long_long_and_overflow",
823 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000824
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500825 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 if (num == NULL)
827 return NULL;
828 overflow = 1234;
829 value = PyLong_AsLongLongAndOverflow(num, &overflow);
830 Py_DECREF(num);
831 if (value == -1 && PyErr_Occurred())
832 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500833 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500835 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 if (overflow != 0)
837 return raiseTestError("test_long_long_and_overflow",
838 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000839
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500840 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 if (num == NULL)
842 return NULL;
843 overflow = 0;
844 value = PyLong_AsLongLongAndOverflow(num, &overflow);
845 Py_DECREF(num);
846 if (value == -1 && PyErr_Occurred())
847 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500848 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500850 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 if (overflow != 0)
852 return raiseTestError("test_long_long_and_overflow",
853 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000854
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200855 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000856}
857
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200858/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
859 non-integer arguments are handled correctly. It should be extended to
860 test overflow handling.
861 */
862
863static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530864test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200865{
866 size_t out_u;
867 Py_ssize_t out_s;
868
869 Py_INCREF(Py_None);
870
871 out_u = PyLong_AsSize_t(Py_None);
872 if (out_u != (size_t)-1 || !PyErr_Occurred())
873 return raiseTestError("test_long_as_size_t",
874 "PyLong_AsSize_t(None) didn't complain");
875 if (!PyErr_ExceptionMatches(PyExc_TypeError))
876 return raiseTestError("test_long_as_size_t",
877 "PyLong_AsSize_t(None) raised "
878 "something other than TypeError");
879 PyErr_Clear();
880
881 out_s = PyLong_AsSsize_t(Py_None);
882 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
883 return raiseTestError("test_long_as_size_t",
884 "PyLong_AsSsize_t(None) didn't complain");
885 if (!PyErr_ExceptionMatches(PyExc_TypeError))
886 return raiseTestError("test_long_as_size_t",
887 "PyLong_AsSsize_t(None) raised "
888 "something other than TypeError");
889 PyErr_Clear();
890
891 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
892 return Py_None;
893}
894
Zackery Spytzdc247652019-06-06 14:39:23 -0600895static PyObject *
896test_long_as_unsigned_long_long_mask(PyObject *self,
897 PyObject *Py_UNUSED(ignored))
898{
899 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
900
901 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
902 return raiseTestError("test_long_as_unsigned_long_long_mask",
903 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
904 "complain");
905 }
906 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
907 return raiseTestError("test_long_as_unsigned_long_long_mask",
908 "PyLong_AsUnsignedLongLongMask(NULL) raised "
909 "something other than SystemError");
910 }
911 PyErr_Clear();
912 Py_RETURN_NONE;
913}
914
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200915/* Test the PyLong_AsDouble API. At present this just tests that
916 non-integer arguments are handled correctly.
917 */
918
919static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530920test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200921{
922 double out;
923
924 Py_INCREF(Py_None);
925
926 out = PyLong_AsDouble(Py_None);
927 if (out != -1.0 || !PyErr_Occurred())
928 return raiseTestError("test_long_as_double",
929 "PyLong_AsDouble(None) didn't complain");
930 if (!PyErr_ExceptionMatches(PyExc_TypeError))
931 return raiseTestError("test_long_as_double",
932 "PyLong_AsDouble(None) raised "
933 "something other than TypeError");
934 PyErr_Clear();
935
936 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
937 return Py_None;
938}
939
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700940/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000941 for both long and int arguments. The test may leak a little memory if
942 it fails.
943*/
944static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530945test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700948 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 tuple = PyTuple_New(1);
951 if (tuple == NULL)
952 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 num = PyLong_FromLong(42);
955 if (num == NULL)
956 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300961 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300963 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 if (value != 42)
965 return raiseTestError("test_L_code",
966 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 Py_DECREF(num);
969 num = PyLong_FromLong(42);
970 if (num == NULL)
971 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300976 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300978 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 if (value != 42)
980 return raiseTestError("test_L_code",
981 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200984 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000985}
986
Serhiy Storchakace412872016-05-08 23:36:44 +0300987static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300988return_none(void *unused)
989{
990 Py_RETURN_NONE;
991}
992
993static PyObject *
994raise_error(void *unused)
995{
996 PyErr_SetNone(PyExc_ValueError);
997 return NULL;
998}
999
1000static int
1001test_buildvalue_N_error(const char *fmt)
1002{
1003 PyObject *arg, *res;
1004
1005 arg = PyList_New(0);
1006 if (arg == NULL) {
1007 return -1;
1008 }
1009
1010 Py_INCREF(arg);
1011 res = Py_BuildValue(fmt, return_none, NULL, arg);
1012 if (res == NULL) {
1013 return -1;
1014 }
1015 Py_DECREF(res);
1016 if (Py_REFCNT(arg) != 1) {
1017 PyErr_Format(TestError, "test_buildvalue_N: "
1018 "arg was not decrefed in successful "
1019 "Py_BuildValue(\"%s\")", fmt);
1020 return -1;
1021 }
1022
1023 Py_INCREF(arg);
1024 res = Py_BuildValue(fmt, raise_error, NULL, arg);
1025 if (res != NULL || !PyErr_Occurred()) {
1026 PyErr_Format(TestError, "test_buildvalue_N: "
1027 "Py_BuildValue(\"%s\") didn't complain", fmt);
1028 return -1;
1029 }
1030 PyErr_Clear();
1031 if (Py_REFCNT(arg) != 1) {
1032 PyErr_Format(TestError, "test_buildvalue_N: "
1033 "arg was not decrefed in failed "
1034 "Py_BuildValue(\"%s\")", fmt);
1035 return -1;
1036 }
1037 Py_DECREF(arg);
1038 return 0;
1039}
1040
1041static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02001042test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03001043{
1044 PyObject *arg, *res;
1045
1046 arg = PyList_New(0);
1047 if (arg == NULL) {
1048 return NULL;
1049 }
1050 Py_INCREF(arg);
1051 res = Py_BuildValue("N", arg);
1052 if (res == NULL) {
1053 return NULL;
1054 }
1055 if (res != arg) {
1056 return raiseTestError("test_buildvalue_N",
1057 "Py_BuildValue(\"N\") returned wrong result");
1058 }
1059 if (Py_REFCNT(arg) != 2) {
1060 return raiseTestError("test_buildvalue_N",
1061 "arg was not decrefed in Py_BuildValue(\"N\")");
1062 }
1063 Py_DECREF(res);
1064 Py_DECREF(arg);
1065
1066 if (test_buildvalue_N_error("O&N") < 0)
1067 return NULL;
1068 if (test_buildvalue_N_error("(O&N)") < 0)
1069 return NULL;
1070 if (test_buildvalue_N_error("[O&N]") < 0)
1071 return NULL;
1072 if (test_buildvalue_N_error("{O&N}") < 0)
1073 return NULL;
1074 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1075 return NULL;
1076
1077 Py_RETURN_NONE;
1078}
1079
1080
1081static PyObject *
Hai Shia13b26c2020-11-11 04:53:46 +08001082test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1083{
1084 newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1085 if (PyLong_Type.tp_new != tp_new) {
1086 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1087 return NULL;
1088 }
1089
1090 reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1091 if (PyLong_Type.tp_repr != tp_repr) {
1092 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1093 return NULL;
1094 }
1095
1096 ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1097 if (tp_call != NULL) {
1098 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1099 return NULL;
1100 }
1101
1102 binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1103 if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1104 PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1105 return NULL;
1106 }
1107
1108 lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1109 if (mp_length != NULL) {
1110 PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1111 return NULL;
1112 }
1113
1114 void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1115 if (over_value != NULL) {
1116 PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1117 return NULL;
1118 }
1119
1120 tp_new = PyType_GetSlot(&PyLong_Type, 0);
1121 if (tp_new != NULL) {
1122 PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1123 return NULL;
1124 }
1125 if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1126 // This is the right exception
1127 PyErr_Clear();
1128 }
1129 else {
1130 return NULL;
1131 }
1132
1133 Py_RETURN_NONE;
1134}
1135
1136
1137static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001138get_args(PyObject *self, PyObject *args)
1139{
1140 if (args == NULL) {
1141 args = Py_None;
1142 }
1143 Py_INCREF(args);
1144 return args;
1145}
1146
1147static PyObject *
1148get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1149{
1150 if (kwargs == NULL) {
1151 kwargs = Py_None;
1152 }
1153 Py_INCREF(kwargs);
1154 return kwargs;
1155}
1156
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001157/* Test tuple argument processing */
1158static PyObject *
1159getargs_tuple(PyObject *self, PyObject *args)
1160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 int a, b, c;
1162 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1163 return NULL;
1164 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001165}
1166
Christian Heimes380f7f22008-02-28 11:19:05 +00001167/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001168static PyObject *
1169getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001172 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1176 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1177 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1178 return NULL;
1179 return Py_BuildValue("iiiiiiiiii",
1180 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1181 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001182}
1183
Larry Hastings83a9f482012-03-20 20:06:16 +00001184/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1185static PyObject *
1186getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1187{
1188 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1189 int required = -1;
1190 int optional = -1;
1191 int keyword_only = -1;
1192
1193 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1194 &required, &optional, &keyword_only))
1195 return NULL;
1196 return Py_BuildValue("iii", required, optional, keyword_only);
1197}
1198
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001199/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1200static PyObject *
1201getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1202{
1203 static char *keywords[] = {"", "", "keyword", NULL};
1204 int required = -1;
1205 int optional = -1;
1206 int keyword = -1;
1207
1208 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1209 &required, &optional, &keyword))
1210 return NULL;
1211 return Py_BuildValue("iii", required, optional, keyword);
1212}
1213
Thomas Heller3457e4b2003-04-24 16:14:27 +00001214/* Functions to call PyArg_ParseTuple with integer format codes,
1215 and return the result.
1216*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001217static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001218getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 unsigned char value;
1221 if (!PyArg_ParseTuple(args, "b", &value))
1222 return NULL;
1223 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224}
1225
Thomas Heller3457e4b2003-04-24 16:14:27 +00001226static PyObject *
1227getargs_B(PyObject *self, PyObject *args)
1228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 unsigned char value;
1230 if (!PyArg_ParseTuple(args, "B", &value))
1231 return NULL;
1232 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001233}
1234
1235static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001236getargs_h(PyObject *self, PyObject *args)
1237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 short value;
1239 if (!PyArg_ParseTuple(args, "h", &value))
1240 return NULL;
1241 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001242}
1243
1244static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001245getargs_H(PyObject *self, PyObject *args)
1246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 unsigned short value;
1248 if (!PyArg_ParseTuple(args, "H", &value))
1249 return NULL;
1250 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001251}
1252
1253static PyObject *
1254getargs_I(PyObject *self, PyObject *args)
1255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 unsigned int value;
1257 if (!PyArg_ParseTuple(args, "I", &value))
1258 return NULL;
1259 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001260}
1261
1262static PyObject *
1263getargs_k(PyObject *self, PyObject *args)
1264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 unsigned long value;
1266 if (!PyArg_ParseTuple(args, "k", &value))
1267 return NULL;
1268 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001269}
1270
1271static PyObject *
1272getargs_i(PyObject *self, PyObject *args)
1273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 int value;
1275 if (!PyArg_ParseTuple(args, "i", &value))
1276 return NULL;
1277 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001278}
1279
Thomas Hellera4ea6032003-04-17 18:55:45 +00001280static PyObject *
1281getargs_l(PyObject *self, PyObject *args)
1282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 long value;
1284 if (!PyArg_ParseTuple(args, "l", &value))
1285 return NULL;
1286 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001287}
1288
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001289static PyObject *
1290getargs_n(PyObject *self, PyObject *args)
1291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 Py_ssize_t value;
1293 if (!PyArg_ParseTuple(args, "n", &value))
1294 return NULL;
1295 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001296}
1297
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001298static PyObject *
1299getargs_p(PyObject *self, PyObject *args)
1300{
1301 int value;
1302 if (!PyArg_ParseTuple(args, "p", &value))
1303 return NULL;
1304 return PyLong_FromLong(value);
1305}
1306
Thomas Hellera4ea6032003-04-17 18:55:45 +00001307static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001308getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001309{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001310 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 if (!PyArg_ParseTuple(args, "L", &value))
1312 return NULL;
1313 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001314}
1315
Thomas Hellera4ea6032003-04-17 18:55:45 +00001316static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001317getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001318{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001319 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 if (!PyArg_ParseTuple(args, "K", &value))
1321 return NULL;
1322 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001323}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001324
1325/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001326 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001327static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301328test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 PyObject *tuple, *num;
1331 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 tuple = PyTuple_New(1);
1334 if (tuple == NULL)
1335 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 /* a number larger than ULONG_MAX even on 64-bit platforms */
1338 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1339 if (num == NULL)
1340 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 value = PyLong_AsUnsignedLongMask(num);
1343 if (value != ULONG_MAX)
1344 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001345 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001350 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (value != ULONG_MAX)
1354 return raiseTestError("test_k_code",
1355 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Py_DECREF(num);
1358 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1359 if (num == NULL)
1360 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 value = PyLong_AsUnsignedLongMask(num);
1363 if (value != (unsigned long)-0x42)
1364 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001365 "PyLong_AsUnsignedLongMask() returned wrong "
1366 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001371 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 if (value != (unsigned long)-0x42)
1375 return raiseTestError("test_k_code",
1376 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001379 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001380}
1381
Victor Stinner06e49dd2010-06-13 18:21:50 +00001382static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001383getargs_f(PyObject *self, PyObject *args)
1384{
1385 float f;
1386 if (!PyArg_ParseTuple(args, "f", &f))
1387 return NULL;
1388 return PyFloat_FromDouble(f);
1389}
1390
1391static PyObject *
1392getargs_d(PyObject *self, PyObject *args)
1393{
1394 double d;
1395 if (!PyArg_ParseTuple(args, "d", &d))
1396 return NULL;
1397 return PyFloat_FromDouble(d);
1398}
1399
1400static PyObject *
1401getargs_D(PyObject *self, PyObject *args)
1402{
1403 Py_complex cval;
1404 if (!PyArg_ParseTuple(args, "D", &cval))
1405 return NULL;
1406 return PyComplex_FromCComplex(cval);
1407}
1408
1409static PyObject *
1410getargs_S(PyObject *self, PyObject *args)
1411{
1412 PyObject *obj;
1413 if (!PyArg_ParseTuple(args, "S", &obj))
1414 return NULL;
1415 Py_INCREF(obj);
1416 return obj;
1417}
1418
1419static PyObject *
1420getargs_Y(PyObject *self, PyObject *args)
1421{
1422 PyObject *obj;
1423 if (!PyArg_ParseTuple(args, "Y", &obj))
1424 return NULL;
1425 Py_INCREF(obj);
1426 return obj;
1427}
1428
1429static PyObject *
1430getargs_U(PyObject *self, PyObject *args)
1431{
1432 PyObject *obj;
1433 if (!PyArg_ParseTuple(args, "U", &obj))
1434 return NULL;
1435 Py_INCREF(obj);
1436 return obj;
1437}
1438
1439static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001440getargs_c(PyObject *self, PyObject *args)
1441{
1442 char c;
1443 if (!PyArg_ParseTuple(args, "c", &c))
1444 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001445 return PyLong_FromLong((unsigned char)c);
1446}
1447
1448static PyObject *
1449getargs_C(PyObject *self, PyObject *args)
1450{
1451 int c;
1452 if (!PyArg_ParseTuple(args, "C", &c))
1453 return NULL;
1454 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001455}
1456
1457static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001458getargs_s(PyObject *self, PyObject *args)
1459{
1460 char *str;
1461 if (!PyArg_ParseTuple(args, "s", &str))
1462 return NULL;
1463 return PyBytes_FromString(str);
1464}
1465
1466static PyObject *
1467getargs_s_star(PyObject *self, PyObject *args)
1468{
1469 Py_buffer buffer;
1470 PyObject *bytes;
1471 if (!PyArg_ParseTuple(args, "s*", &buffer))
1472 return NULL;
1473 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1474 PyBuffer_Release(&buffer);
1475 return bytes;
1476}
1477
1478static PyObject *
1479getargs_s_hash(PyObject *self, PyObject *args)
1480{
1481 char *str;
1482 Py_ssize_t size;
1483 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1484 return NULL;
1485 return PyBytes_FromStringAndSize(str, size);
1486}
1487
1488static PyObject *
1489getargs_z(PyObject *self, PyObject *args)
1490{
1491 char *str;
1492 if (!PyArg_ParseTuple(args, "z", &str))
1493 return NULL;
1494 if (str != NULL)
1495 return PyBytes_FromString(str);
1496 else
1497 Py_RETURN_NONE;
1498}
1499
1500static PyObject *
1501getargs_z_star(PyObject *self, PyObject *args)
1502{
1503 Py_buffer buffer;
1504 PyObject *bytes;
1505 if (!PyArg_ParseTuple(args, "z*", &buffer))
1506 return NULL;
1507 if (buffer.buf != NULL)
1508 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1509 else {
1510 Py_INCREF(Py_None);
1511 bytes = Py_None;
1512 }
1513 PyBuffer_Release(&buffer);
1514 return bytes;
1515}
1516
1517static PyObject *
1518getargs_z_hash(PyObject *self, PyObject *args)
1519{
1520 char *str;
1521 Py_ssize_t size;
1522 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1523 return NULL;
1524 if (str != NULL)
1525 return PyBytes_FromStringAndSize(str, size);
1526 else
1527 Py_RETURN_NONE;
1528}
1529
1530static PyObject *
1531getargs_y(PyObject *self, PyObject *args)
1532{
1533 char *str;
1534 if (!PyArg_ParseTuple(args, "y", &str))
1535 return NULL;
1536 return PyBytes_FromString(str);
1537}
1538
1539static PyObject *
1540getargs_y_star(PyObject *self, PyObject *args)
1541{
1542 Py_buffer buffer;
1543 PyObject *bytes;
1544 if (!PyArg_ParseTuple(args, "y*", &buffer))
1545 return NULL;
1546 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1547 PyBuffer_Release(&buffer);
1548 return bytes;
1549}
1550
1551static PyObject *
1552getargs_y_hash(PyObject *self, PyObject *args)
1553{
1554 char *str;
1555 Py_ssize_t size;
1556 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1557 return NULL;
1558 return PyBytes_FromStringAndSize(str, size);
1559}
1560
1561static PyObject *
1562getargs_u(PyObject *self, PyObject *args)
1563{
1564 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001565 if (!PyArg_ParseTuple(args, "u", &str))
1566 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001567 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001568}
1569
1570static PyObject *
1571getargs_u_hash(PyObject *self, PyObject *args)
1572{
1573 Py_UNICODE *str;
1574 Py_ssize_t size;
1575 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1576 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001577 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001578}
1579
1580static PyObject *
1581getargs_Z(PyObject *self, PyObject *args)
1582{
1583 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001584 if (!PyArg_ParseTuple(args, "Z", &str))
1585 return NULL;
1586 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001587 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001588 } else
1589 Py_RETURN_NONE;
1590}
1591
1592static PyObject *
1593getargs_Z_hash(PyObject *self, PyObject *args)
1594{
1595 Py_UNICODE *str;
1596 Py_ssize_t size;
1597 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1598 return NULL;
1599 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001600 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001601 else
1602 Py_RETURN_NONE;
1603}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001604
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001605static PyObject *
1606getargs_es(PyObject *self, PyObject *args)
1607{
1608 PyObject *arg, *result;
1609 const char *encoding = NULL;
1610 char *str;
1611
1612 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1613 return NULL;
1614 if (!PyArg_Parse(arg, "es", encoding, &str))
1615 return NULL;
1616 result = PyBytes_FromString(str);
1617 PyMem_Free(str);
1618 return result;
1619}
1620
1621static PyObject *
1622getargs_et(PyObject *self, PyObject *args)
1623{
1624 PyObject *arg, *result;
1625 const char *encoding = NULL;
1626 char *str;
1627
1628 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1629 return NULL;
1630 if (!PyArg_Parse(arg, "et", encoding, &str))
1631 return NULL;
1632 result = PyBytes_FromString(str);
1633 PyMem_Free(str);
1634 return result;
1635}
1636
1637static PyObject *
1638getargs_es_hash(PyObject *self, PyObject *args)
1639{
1640 PyObject *arg, *result;
1641 const char *encoding = NULL;
1642 PyByteArrayObject *buffer = NULL;
1643 char *str = NULL;
1644 Py_ssize_t size;
1645
1646 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1647 return NULL;
1648 if (buffer != NULL) {
1649 str = PyByteArray_AS_STRING(buffer);
1650 size = PyByteArray_GET_SIZE(buffer);
1651 }
1652 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1653 return NULL;
1654 result = PyBytes_FromStringAndSize(str, size);
1655 if (buffer == NULL)
1656 PyMem_Free(str);
1657 return result;
1658}
1659
1660static PyObject *
1661getargs_et_hash(PyObject *self, PyObject *args)
1662{
1663 PyObject *arg, *result;
1664 const char *encoding = NULL;
1665 PyByteArrayObject *buffer = NULL;
1666 char *str = NULL;
1667 Py_ssize_t size;
1668
1669 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1670 return NULL;
1671 if (buffer != NULL) {
1672 str = PyByteArray_AS_STRING(buffer);
1673 size = PyByteArray_GET_SIZE(buffer);
1674 }
1675 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1676 return NULL;
1677 result = PyBytes_FromStringAndSize(str, size);
1678 if (buffer == NULL)
1679 PyMem_Free(str);
1680 return result;
1681}
1682
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001683/* Test the s and z codes for PyArg_ParseTuple.
1684*/
1685static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301686test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001687{
1688 /* Unicode strings should be accepted */
1689 PyObject *tuple, *obj;
1690 char *value;
1691
1692 tuple = PyTuple_New(1);
1693 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001695
1696 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001698 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001700
1701 PyTuple_SET_ITEM(tuple, 0, obj);
1702
1703 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001705 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001706 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1707 return NULL;
1708 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001709
Oren Milmanba7d7362017-08-29 11:58:27 +03001710 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1711 return NULL;
1712 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001713
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001714 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001715 Py_RETURN_NONE;
1716}
1717
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001718static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001719parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001720{
Larry Hastings8f904da2012-06-22 03:56:29 -07001721 PyObject *sub_args;
1722 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001723 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001724 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001725
Larry Hastings8f904da2012-06-22 03:56:29 -07001726 Py_ssize_t i, size;
1727 char *keywords[8 + 1]; /* space for NULL at end */
1728 PyObject *o;
1729 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001730
Larry Hastings8f904da2012-06-22 03:56:29 -07001731 int result;
1732 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001733
Larry Hastings22701e82012-08-08 14:52:22 -07001734 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001735
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001736 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001737 &sub_args, &sub_kwargs,
1738 &sub_format, &sub_keywords))
1739 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001740
Larry Hastings8f904da2012-06-22 03:56:29 -07001741 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1742 PyErr_SetString(PyExc_ValueError,
1743 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1744 return NULL;
1745 }
1746
1747 memset(buffers, 0, sizeof(buffers));
1748 memset(converted, 0, sizeof(converted));
1749 memset(keywords, 0, sizeof(keywords));
1750
1751 size = PySequence_Fast_GET_SIZE(sub_keywords);
1752 if (size > 8) {
1753 PyErr_SetString(PyExc_ValueError,
1754 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1755 goto exit;
1756 }
1757
1758 for (i = 0; i < size; i++) {
1759 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1760 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1761 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001762 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001763 goto exit;
1764 }
1765 keywords[i] = PyBytes_AS_STRING(converted[i]);
1766 }
1767
1768 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1769 sub_format, keywords,
1770 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1771 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1772
1773 if (result) {
1774 return_value = Py_None;
1775 Py_INCREF(Py_None);
1776 }
1777
1778exit:
1779 size = sizeof(converted) / sizeof(converted[0]);
1780 for (i = 0; i < size; i++) {
1781 Py_XDECREF(converted[i]);
1782 }
1783 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001784}
1785
Benjamin Peterson92035012008-12-27 16:00:54 +00001786static volatile int x;
1787
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001788#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001789/* Ignore use of deprecated APIs */
1790_Py_COMP_DIAG_PUSH
1791_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1792
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001793/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1794 of an error.
1795*/
1796static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301797test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 PyObject *tuple, *obj;
1800 Py_UNICODE *value;
1801 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1804 /* Just use the macro and check that it compiles */
1805 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 tuple = PyTuple_New(1);
1808 if (tuple == NULL)
1809 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 obj = PyUnicode_Decode("test", strlen("test"),
1812 "ascii", NULL);
1813 if (obj == NULL)
1814 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001819 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001821 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (value != PyUnicode_AS_UNICODE(obj))
1823 return raiseTestError("test_u_code",
1824 "u code returned wrong value for u'test'");
1825 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001826 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 if (value != PyUnicode_AS_UNICODE(obj) ||
1830 len != PyUnicode_GET_SIZE(obj))
1831 return raiseTestError("test_u_code",
1832 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001835 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001836}
1837
Guido van Rossumfb67be22007-08-29 18:38:11 +00001838/* Test Z and Z# codes for PyArg_ParseTuple */
1839static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301840test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001843 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 tuple = PyTuple_New(2);
1847 if (tuple == NULL)
1848 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 obj = PyUnicode_FromString("test");
1851 PyTuple_SET_ITEM(tuple, 0, obj);
1852 Py_INCREF(Py_None);
1853 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 /* swap values on purpose */
1856 value1 = NULL;
1857 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001860 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001862 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 if (value1 != PyUnicode_AS_UNICODE(obj))
1864 return raiseTestError("test_Z_code",
1865 "Z code returned wrong value for 'test'");
1866 if (value2 != NULL)
1867 return raiseTestError("test_Z_code",
1868 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 value1 = NULL;
1871 value2 = PyUnicode_AS_UNICODE(obj);
1872 len1 = -1;
1873 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001876 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1877 &value2, &len2))
1878 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001880 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1882 len1 != PyUnicode_GET_SIZE(obj))
1883 return raiseTestError("test_Z_code",
1884 "Z# code returned wrong values for 'test'");
1885 if (value2 != NULL ||
1886 len2 != 0)
1887 return raiseTestError("test_Z_code",
1888 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 Py_DECREF(tuple);
1891 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001892}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001893_Py_COMP_DIAG_POP
1894#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001895
Thomas Wouters477c8d52006-05-27 19:21:47 +00001896static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301897test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001898{
1899#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1901 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001902 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001903#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1905 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1910 if (wide == NULL)
1911 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1914 if (utf8 == NULL) {
1915 Py_DECREF(wide);
1916 return NULL;
1917 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001918
Victor Stinner8ef18872011-11-21 02:06:57 +01001919 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 Py_DECREF(wide);
1921 Py_DECREF(utf8);
1922 return raiseTestError("test_widechar",
1923 "wide string and utf8 string "
1924 "have different length");
1925 }
1926 if (PyUnicode_Compare(wide, utf8)) {
1927 Py_DECREF(wide);
1928 Py_DECREF(utf8);
1929 if (PyErr_Occurred())
1930 return NULL;
1931 return raiseTestError("test_widechar",
1932 "wide string and utf8 string "
1933 "are different");
1934 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 Py_DECREF(wide);
1937 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001938
1939#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1940 wide = PyUnicode_FromWideChar(invalid, 1);
1941 if (wide == NULL)
1942 PyErr_Clear();
1943 else
1944 return raiseTestError("test_widechar",
1945 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1946
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001947#if USE_UNICODE_WCHAR_CACHE
1948/* Ignore use of deprecated APIs */
1949_Py_COMP_DIAG_PUSH
1950_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001951 wide = PyUnicode_FromUnicode(invalid, 1);
1952 if (wide == NULL)
1953 PyErr_Clear();
1954 else
1955 return raiseTestError("test_widechar",
1956 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001957
1958 wide = PyUnicode_FromUnicode(NULL, 1);
1959 if (wide == NULL)
1960 return NULL;
1961 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001962 if (_PyUnicode_Ready(wide) < 0) {
1963 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001964 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001965 }
1966 else {
1967 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001968 return raiseTestError("test_widechar",
1969 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001970 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001971_Py_COMP_DIAG_POP
1972#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001973#endif
1974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001976}
1977
1978static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001979unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001980{
1981 PyObject *unicode, *result;
1982 Py_ssize_t buflen, size;
1983 wchar_t *buffer;
1984
1985 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1986 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001987 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001988 if (buffer == NULL)
1989 return PyErr_NoMemory();
1990
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001991 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001992 if (size == -1) {
1993 PyMem_Free(buffer);
1994 return NULL;
1995 }
1996
1997 if (size < buflen)
1998 buflen = size + 1;
1999 else
2000 buflen = size;
2001 result = PyUnicode_FromWideChar(buffer, buflen);
2002 PyMem_Free(buffer);
2003 if (result == NULL)
2004 return NULL;
2005
2006 return Py_BuildValue("(Nn)", result, size);
2007}
2008
2009static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00002010unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00002011{
2012 PyObject *unicode, *result;
2013 Py_ssize_t size;
2014 wchar_t *buffer;
2015
2016 if (!PyArg_ParseTuple(args, "U", &unicode))
2017 return NULL;
2018
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00002019 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00002020 if (buffer == NULL)
2021 return NULL;
2022
2023 result = PyUnicode_FromWideChar(buffer, size + 1);
2024 PyMem_Free(buffer);
2025 if (result == NULL)
2026 return NULL;
2027 return Py_BuildValue("(Nn)", result, size);
2028}
2029
2030static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03002031unicode_asucs4(PyObject *self, PyObject *args)
2032{
2033 PyObject *unicode, *result;
2034 Py_UCS4 *buffer;
2035 int copy_null;
2036 Py_ssize_t str_len, buf_len;
2037
2038 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
2039 return NULL;
2040 }
2041
2042 buf_len = str_len + 1;
2043 buffer = PyMem_NEW(Py_UCS4, buf_len);
2044 if (buffer == NULL) {
2045 return PyErr_NoMemory();
2046 }
2047 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
2048 buffer[str_len] = 0xffffU;
2049
2050 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
Victor Stinner00d7abd2020-12-01 09:56:42 +01002051 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002052 return NULL;
2053 }
2054
2055 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
Victor Stinner00d7abd2020-12-01 09:56:42 +01002056 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03002057 return result;
2058}
2059
2060static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05002061unicode_asutf8(PyObject *self, PyObject *args)
2062{
2063 PyObject *unicode;
2064 const char *buffer;
2065
2066 if (!PyArg_ParseTuple(args, "U", &unicode)) {
2067 return NULL;
2068 }
2069
2070 buffer = PyUnicode_AsUTF8(unicode);
2071 if (buffer == NULL) {
2072 return NULL;
2073 }
2074
2075 return PyBytes_FromString(buffer);
2076}
2077
2078static PyObject *
2079unicode_asutf8andsize(PyObject *self, PyObject *args)
2080{
2081 PyObject *unicode, *result;
2082 const char *buffer;
2083 Py_ssize_t utf8_len;
2084
2085 if(!PyArg_ParseTuple(args, "U", &unicode)) {
2086 return NULL;
2087 }
2088
Victor Stinneraca8c402019-09-30 21:14:26 +02002089 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05002090 if (buffer == NULL) {
2091 return NULL;
2092 }
2093
2094 result = PyBytes_FromString(buffer);
2095 if (result == NULL) {
2096 return NULL;
2097 }
2098
2099 return Py_BuildValue("(Nn)", result, utf8_len);
2100}
2101
2102static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08002103unicode_findchar(PyObject *self, PyObject *args)
2104{
2105 PyObject *str;
2106 int direction;
2107 unsigned int ch;
2108 Py_ssize_t result;
2109 Py_ssize_t start, end;
2110
2111 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2112 &start, &end, &direction)) {
2113 return NULL;
2114 }
2115
2116 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2117 if (result == -2)
2118 return NULL;
2119 else
2120 return PyLong_FromSsize_t(result);
2121}
2122
2123static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002124unicode_copycharacters(PyObject *self, PyObject *args)
2125{
2126 PyObject *from, *to, *to_copy;
2127 Py_ssize_t from_start, to_start, how_many, copied;
2128
2129 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2130 &from, &from_start, &how_many)) {
2131 return NULL;
2132 }
2133
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002134 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2135 PyUnicode_MAX_CHAR_VALUE(to)))) {
2136 return NULL;
2137 }
2138 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2139 Py_DECREF(to_copy);
2140 return NULL;
2141 }
2142
2143 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2144 from_start, how_many)) < 0) {
2145 Py_DECREF(to_copy);
2146 return NULL;
2147 }
2148
2149 return Py_BuildValue("(Nn)", to_copy, copied);
2150}
2151
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002152#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002153/* Ignore use of deprecated APIs */
2154_Py_COMP_DIAG_PUSH
2155_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2156
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002157static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002158unicode_encodedecimal(PyObject *self, PyObject *args)
2159{
2160 Py_UNICODE *unicode;
2161 Py_ssize_t length;
2162 char *errors = NULL;
2163 PyObject *decimal;
2164 Py_ssize_t decimal_length, new_length;
2165 int res;
2166
2167 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2168 return NULL;
2169
2170 decimal_length = length * 7; /* len('&#8364;') */
2171 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2172 if (decimal == NULL)
2173 return NULL;
2174
2175 res = PyUnicode_EncodeDecimal(unicode, length,
2176 PyBytes_AS_STRING(decimal),
2177 errors);
2178 if (res < 0) {
2179 Py_DECREF(decimal);
2180 return NULL;
2181 }
2182
2183 new_length = strlen(PyBytes_AS_STRING(decimal));
2184 assert(new_length <= decimal_length);
2185 res = _PyBytes_Resize(&decimal, new_length);
2186 if (res < 0)
2187 return NULL;
2188
2189 return decimal;
2190}
2191
2192static PyObject *
2193unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2194{
2195 Py_UNICODE *unicode;
2196 Py_ssize_t length;
2197 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2198 return NULL;
2199 return PyUnicode_TransformDecimalToASCII(unicode, length);
2200}
2201
2202static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002203unicode_legacy_string(PyObject *self, PyObject *args)
2204{
2205 Py_UNICODE *data;
2206 Py_ssize_t len;
2207 PyObject *u;
2208
2209 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2210 return NULL;
2211
2212 u = PyUnicode_FromUnicode(NULL, len);
2213 if (u == NULL)
2214 return NULL;
2215
2216 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2217
2218 if (len > 0) { /* The empty string is always ready. */
2219 assert(!PyUnicode_IS_READY(u));
2220 }
2221
2222 return u;
2223}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002224_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002225#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002226
2227static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002228getargs_w_star(PyObject *self, PyObject *args)
2229{
2230 Py_buffer buffer;
2231 PyObject *result;
2232 char *str;
2233
2234 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2235 return NULL;
2236
2237 if (2 <= buffer.len) {
2238 str = buffer.buf;
2239 str[0] = '[';
2240 str[buffer.len-1] = ']';
2241 }
2242
2243 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2244 PyBuffer_Release(&buffer);
2245 return result;
2246}
2247
2248
2249static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302250test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 /* Test that formats can begin with '|'. See issue #4720. */
2253 PyObject *tuple, *dict = NULL;
2254 static char *kwlist[] = {NULL};
2255 int result;
2256 tuple = PyTuple_New(0);
2257 if (!tuple)
2258 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002259 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 dict = PyDict_New();
2263 if (!dict)
2264 goto done;
2265 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002266 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 Py_DECREF(tuple);
2268 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002269 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 else {
2273 Py_RETURN_NONE;
2274 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002275}
2276
2277static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 const char *encoding, *errors = NULL;
2281 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2282 &encoding, &errors))
2283 return NULL;
2284 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002285}
2286
Thomas Wouters477c8d52006-05-27 19:21:47 +00002287static PyObject *
2288codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 const char *encoding, *errors = NULL;
2291 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2292 &encoding, &errors))
2293 return NULL;
2294 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002295}
2296
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002297
Tim Peters5b8132f2003-01-31 15:52:05 +00002298/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002299static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302300test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 struct triple {
2303 long input;
2304 size_t nbits;
2305 int sign;
2306 } testcases[] = {{0, 0, 0},
2307 {1L, 1, 1},
2308 {-1L, 1, -1},
2309 {2L, 2, 1},
2310 {-2L, 2, -1},
2311 {3L, 2, 1},
2312 {-3L, 2, -1},
2313 {4L, 3, 1},
2314 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002315 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 {-0x7fffL, 15, -1},
2317 {0xffffL, 16, 1},
2318 {-0xffffL, 16, -1},
2319 {0xfffffffL, 28, 1},
2320 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002321 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002322
Victor Stinner63941882011-09-29 00:42:28 +02002323 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002324 size_t nbits;
2325 int sign;
2326 PyObject *plong;
2327
2328 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002329 if (plong == NULL)
2330 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002331 nbits = _PyLong_NumBits(plong);
2332 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 Py_DECREF(plong);
2335 if (nbits != testcases[i].nbits)
2336 return raiseTestError("test_long_numbits",
2337 "wrong result for _PyLong_NumBits");
2338 if (sign != testcases[i].sign)
2339 return raiseTestError("test_long_numbits",
2340 "wrong result for _PyLong_Sign");
2341 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002342 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002343}
2344
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002345static PyObject *
2346pyobject_repr_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2347{
2348 return PyObject_Repr(NULL);
2349}
Thomas Woutersa9773292006-04-21 09:43:23 +00002350
2351static PyObject *
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002352pyobject_str_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002353{
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07002354 return PyObject_Str(NULL);
2355}
2356
2357static PyObject *
2358pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2359{
2360 return PyObject_Bytes(NULL);
Thomas Woutersa9773292006-04-21 09:43:23 +00002361}
2362
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002363static PyObject *
2364raise_exception(PyObject *self, PyObject *args)
2365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 PyObject *exc;
2367 PyObject *exc_args, *v;
2368 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2371 &exc, &num_args))
2372 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 exc_args = PyTuple_New(num_args);
2375 if (exc_args == NULL)
2376 return NULL;
2377 for (i = 0; i < num_args; ++i) {
2378 v = PyLong_FromLong(i);
2379 if (v == NULL) {
2380 Py_DECREF(exc_args);
2381 return NULL;
2382 }
2383 PyTuple_SET_ITEM(exc_args, i, v);
2384 }
2385 PyErr_SetObject(exc, exc_args);
2386 Py_DECREF(exc_args);
2387 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002388}
Tim Peters91621db2001-06-12 20:10:01 +00002389
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002390static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002391set_errno(PyObject *self, PyObject *args)
2392{
2393 int new_errno;
2394
2395 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2396 return NULL;
2397
2398 errno = new_errno;
2399 Py_RETURN_NONE;
2400}
2401
2402static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002403test_set_exc_info(PyObject *self, PyObject *args)
2404{
2405 PyObject *orig_exc;
2406 PyObject *new_type, *new_value, *new_tb;
2407 PyObject *type, *value, *tb;
2408 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2409 &new_type, &new_value, &new_tb))
2410 return NULL;
2411
2412 PyErr_GetExcInfo(&type, &value, &tb);
2413
2414 Py_INCREF(new_type);
2415 Py_INCREF(new_value);
2416 Py_INCREF(new_tb);
2417 PyErr_SetExcInfo(new_type, new_value, new_tb);
2418
2419 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2420 Py_XDECREF(type);
2421 Py_XDECREF(value);
2422 Py_XDECREF(tb);
2423 return orig_exc;
2424}
Benjamin Peterson16323982010-02-03 01:13:41 +00002425
2426static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002427
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002428static PyObject *
2429test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 if (PyDateTimeAPI) {
2431 if (test_run_counter) {
2432 /* Probably regrtest.py -R */
2433 Py_RETURN_NONE;
2434 }
2435 else {
2436 PyErr_SetString(PyExc_AssertionError,
2437 "PyDateTime_CAPI somehow initialized");
2438 return NULL;
2439 }
2440 }
2441 test_run_counter++;
2442 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 if (PyDateTimeAPI)
2445 Py_RETURN_NONE;
2446 else
2447 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002448}
2449
Paul Ganssle04af5b12018-01-24 17:29:30 -05002450/* Functions exposing the C API type checking for testing */
2451#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2452 PyObject *obj; \
2453 int exact = 0; \
2454 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2455 return NULL; \
2456 } \
2457 int rv = exact?exact_method(obj):check_method(obj); \
2458 if (rv) { \
2459 Py_RETURN_TRUE; \
2460 } else { \
2461 Py_RETURN_FALSE; \
2462 }
2463
2464static PyObject *
2465datetime_check_date(PyObject *self, PyObject *args) {
2466 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2467}
2468
2469static PyObject *
2470datetime_check_time(PyObject *self, PyObject *args) {
2471 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2472}
2473
2474static PyObject *
2475datetime_check_datetime(PyObject *self, PyObject *args) {
2476 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2477}
2478
2479static PyObject *
2480datetime_check_delta(PyObject *self, PyObject *args) {
2481 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2482}
2483
2484static PyObject *
2485datetime_check_tzinfo(PyObject *self, PyObject *args) {
2486 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2487}
2488
2489
2490/* Makes three variations on timezone representing UTC-5:
2491 1. timezone with offset and name from PyDateTimeAPI
2492 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2493 3. timezone with offset (no name) from PyTimeZone_FromOffset
2494*/
2495static PyObject *
2496make_timezones_capi(PyObject *self, PyObject *args) {
2497 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2498 PyObject *name = PyUnicode_FromString("EST");
2499
2500 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2501 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2502 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2503
2504 Py_DecRef(offset);
2505 Py_DecRef(name);
2506
2507 PyObject *rv = PyTuple_New(3);
2508
2509 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2510 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2511 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2512
2513 return rv;
2514}
2515
2516static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002517get_timezones_offset_zero(PyObject *self, PyObject *args) {
2518 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2519 PyObject *name = PyUnicode_FromString("");
2520
2521 // These two should return the UTC singleton
2522 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2523 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2524
2525 // This one will return +00:00 zone, but not the UTC singleton
2526 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2527
2528 Py_DecRef(offset);
2529 Py_DecRef(name);
2530
2531 PyObject *rv = PyTuple_New(3);
2532 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2533 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2534 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2535
2536 return rv;
2537}
2538
2539static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002540get_timezone_utc_capi(PyObject* self, PyObject *args) {
2541 int macro = 0;
2542 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2543 return NULL;
2544 }
2545 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002546 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002547 return PyDateTime_TimeZone_UTC;
2548 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002549 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002550 return PyDateTimeAPI->TimeZone_UTC;
2551 }
2552}
2553
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002554static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002555get_date_fromdate(PyObject *self, PyObject *args)
2556{
2557 PyObject *rv = NULL;
2558 int macro;
2559 int year, month, day;
2560
2561 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2562 return NULL;
2563 }
2564
2565 if (macro) {
2566 rv = PyDate_FromDate(year, month, day);
2567 }
2568 else {
2569 rv = PyDateTimeAPI->Date_FromDate(
2570 year, month, day,
2571 PyDateTimeAPI->DateType);
2572 }
2573 return rv;
2574}
2575
2576static PyObject *
2577get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2578{
2579 PyObject *rv = NULL;
2580 int macro;
2581 int year, month, day;
2582 int hour, minute, second, microsecond;
2583
2584 if (!PyArg_ParseTuple(args, "piiiiiii",
2585 &macro,
2586 &year, &month, &day,
2587 &hour, &minute, &second, &microsecond)) {
2588 return NULL;
2589 }
2590
2591 if (macro) {
2592 rv = PyDateTime_FromDateAndTime(
2593 year, month, day,
2594 hour, minute, second, microsecond);
2595 }
2596 else {
2597 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2598 year, month, day,
2599 hour, minute, second, microsecond,
2600 Py_None,
2601 PyDateTimeAPI->DateTimeType);
2602 }
2603 return rv;
2604}
2605
2606static PyObject *
2607get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2608{
2609 PyObject *rv = NULL;
2610 int macro;
2611 int year, month, day;
2612 int hour, minute, second, microsecond, fold;
2613
2614 if (!PyArg_ParseTuple(args, "piiiiiiii",
2615 &macro,
2616 &year, &month, &day,
2617 &hour, &minute, &second, &microsecond,
2618 &fold)) {
2619 return NULL;
2620 }
2621
2622 if (macro) {
2623 rv = PyDateTime_FromDateAndTimeAndFold(
2624 year, month, day,
2625 hour, minute, second, microsecond,
2626 fold);
2627 }
2628 else {
2629 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2630 year, month, day,
2631 hour, minute, second, microsecond,
2632 Py_None,
2633 fold,
2634 PyDateTimeAPI->DateTimeType);
2635 }
2636 return rv;
2637}
2638
2639static PyObject *
2640get_time_fromtime(PyObject *self, PyObject *args)
2641{
2642 PyObject *rv = NULL;
2643 int macro;
2644 int hour, minute, second, microsecond;
2645
2646 if (!PyArg_ParseTuple(args, "piiii",
2647 &macro,
2648 &hour, &minute, &second, &microsecond)) {
2649 return NULL;
2650 }
2651
2652 if (macro) {
2653 rv = PyTime_FromTime(hour, minute, second, microsecond);
2654 }
2655 else {
2656 rv = PyDateTimeAPI->Time_FromTime(
2657 hour, minute, second, microsecond,
2658 Py_None,
2659 PyDateTimeAPI->TimeType);
2660 }
2661 return rv;
2662}
2663
2664static PyObject *
2665get_time_fromtimeandfold(PyObject *self, PyObject *args)
2666{
2667 PyObject *rv = NULL;
2668 int macro;
2669 int hour, minute, second, microsecond, fold;
2670
2671 if (!PyArg_ParseTuple(args, "piiiii",
2672 &macro,
2673 &hour, &minute, &second, &microsecond,
2674 &fold)) {
2675 return NULL;
2676 }
2677
2678 if (macro) {
2679 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2680 }
2681 else {
2682 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2683 hour, minute, second, microsecond,
2684 Py_None,
2685 fold,
2686 PyDateTimeAPI->TimeType);
2687 }
2688 return rv;
2689}
2690
2691static PyObject *
2692get_delta_fromdsu(PyObject *self, PyObject *args)
2693{
2694 PyObject *rv = NULL;
2695 int macro;
2696 int days, seconds, microseconds;
2697
2698 if (!PyArg_ParseTuple(args, "piii",
2699 &macro,
2700 &days, &seconds, &microseconds)) {
2701 return NULL;
2702 }
2703
2704 if (macro) {
2705 rv = PyDelta_FromDSU(days, seconds, microseconds);
2706 }
2707 else {
2708 rv = PyDateTimeAPI->Delta_FromDelta(
2709 days, seconds, microseconds, 1,
2710 PyDateTimeAPI->DeltaType);
2711 }
2712
2713 return rv;
2714}
2715
2716static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002717get_date_fromtimestamp(PyObject* self, PyObject *args)
2718{
2719 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2720 int macro = 0;
2721
2722 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2723 return NULL;
2724 }
2725
2726 // Construct the argument tuple
2727 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2728 return NULL;
2729 }
2730
2731 // Pass along to the API function
2732 if (macro) {
2733 rv = PyDate_FromTimestamp(tsargs);
2734 }
2735 else {
2736 rv = PyDateTimeAPI->Date_FromTimestamp(
2737 (PyObject *)PyDateTimeAPI->DateType, tsargs
2738 );
2739 }
2740
2741 Py_DECREF(tsargs);
2742 return rv;
2743}
2744
2745static PyObject *
2746get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2747{
2748 int macro = 0;
2749 int usetz = 0;
2750 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2751 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2752 return NULL;
2753 }
2754
2755 // Construct the argument tuple
2756 if (usetz) {
2757 tsargs = PyTuple_Pack(2, ts, tzinfo);
2758 }
2759 else {
2760 tsargs = PyTuple_Pack(1, ts);
2761 }
2762
2763 if (tsargs == NULL) {
2764 return NULL;
2765 }
2766
2767 // Pass along to the API function
2768 if (macro) {
2769 rv = PyDateTime_FromTimestamp(tsargs);
2770 }
2771 else {
2772 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2773 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2774 );
2775 }
2776
2777 Py_DECREF(tsargs);
2778 return rv;
2779}
2780
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002781static PyObject *
2782test_PyDateTime_GET(PyObject *self, PyObject *obj)
2783{
2784 int year, month, day;
2785
2786 year = PyDateTime_GET_YEAR(obj);
2787 month = PyDateTime_GET_MONTH(obj);
2788 day = PyDateTime_GET_DAY(obj);
2789
2790 return Py_BuildValue("(lll)", year, month, day);
2791}
2792
2793static PyObject *
2794test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2795{
2796 int hour, minute, second, microsecond;
2797
2798 hour = PyDateTime_DATE_GET_HOUR(obj);
2799 minute = PyDateTime_DATE_GET_MINUTE(obj);
2800 second = PyDateTime_DATE_GET_SECOND(obj);
2801 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002802 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002803
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002804 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002805}
2806
2807static PyObject *
2808test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2809{
2810 int hour, minute, second, microsecond;
2811
2812 hour = PyDateTime_TIME_GET_HOUR(obj);
2813 minute = PyDateTime_TIME_GET_MINUTE(obj);
2814 second = PyDateTime_TIME_GET_SECOND(obj);
2815 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002816 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002817
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002818 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002819}
2820
2821static PyObject *
2822test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2823{
2824 int days, seconds, microseconds;
2825
2826 days = PyDateTime_DELTA_GET_DAYS(obj);
2827 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2828 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2829
2830 return Py_BuildValue("(lll)", days, seconds, microseconds);
2831}
Benjamin Peterson16323982010-02-03 01:13:41 +00002832
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002833/* test_thread_state spawns a thread of its own, and that thread releases
2834 * `thread_done` when it's finished. The driver code has to know when the
2835 * thread finishes, because the thread uses a PyObject (the callable) that
2836 * may go away when the driver finishes. The former lack of this explicit
2837 * synchronization caused rare segfaults, so rare that they were seen only
2838 * on a Mac buildbot (although they were possible on any box).
2839 */
2840static PyThread_type_lock thread_done = NULL;
2841
Benjamin Petersona786b022008-08-25 21:05:21 +00002842static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002843_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 PyObject *rc;
2846 int success;
2847 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002848 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 success = (rc != NULL);
2850 Py_XDECREF(rc);
2851 PyGILState_Release(s);
2852 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002853}
2854
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002855/* Same thing, but releases `thread_done` when it returns. This variant
2856 * should be called only from threads spawned by test_thread_state().
2857 */
2858static void
2859_make_call_from_thread(void *callable)
2860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 _make_call(callable);
2862 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002863}
2864
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002865static PyObject *
2866test_thread_state(PyObject *self, PyObject *args)
2867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 PyObject *fn;
2869 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2872 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 if (!PyCallable_Check(fn)) {
2875 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002876 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 return NULL;
2878 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 thread_done = PyThread_allocate_lock();
2881 if (thread_done == NULL)
2882 return PyErr_NoMemory();
2883 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 /* Start a new thread with our callback. */
2886 PyThread_start_new_thread(_make_call_from_thread, fn);
2887 /* Make the callback with the thread lock held by this thread */
2888 success &= _make_call(fn);
2889 /* Do it all again, but this time with the thread-lock released */
2890 Py_BEGIN_ALLOW_THREADS
2891 success &= _make_call(fn);
2892 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2893 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 /* And once more with and without a thread
2896 XXX - should use a lock and work out exactly what we are trying
2897 to test <wink>
2898 */
2899 Py_BEGIN_ALLOW_THREADS
2900 PyThread_start_new_thread(_make_call_from_thread, fn);
2901 success &= _make_call(fn);
2902 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2903 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 /* Release lock we acquired above. This is required on HP-UX. */
2906 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 PyThread_free_lock(thread_done);
2909 if (!success)
2910 return NULL;
2911 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002912}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002913
2914/* test Py_AddPendingCalls using threads */
2915static int _pending_callback(void *arg)
2916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 /* we assume the argument is callable object to which we own a reference */
2918 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002919 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 Py_DECREF(callable);
2921 Py_XDECREF(r);
2922 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002923}
2924
2925/* The following requests n callbacks to _pending_callback. It can be
2926 * run from any python thread.
2927 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002928static PyObject *
2929pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 PyObject *callable;
2932 int r;
2933 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2934 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 /* create the reference for the callbackwhile we hold the lock */
2937 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 Py_BEGIN_ALLOW_THREADS
2940 r = Py_AddPendingCall(&_pending_callback, callable);
2941 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 if (r<0) {
2944 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002945 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002947 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002948}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002949
Neal Norwitzb0d26332007-08-25 00:49:05 +00002950/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002951static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002952test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 PyObject *result;
2955 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956
Alexander Belopolskye239d232010-12-08 23:31:48 +00002957#define CHECK_1_FORMAT(FORMAT, TYPE) \
2958 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2959 if (result == NULL) \
2960 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002961 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002962 msg = FORMAT " failed at 1"; \
2963 goto Fail; \
2964 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 CHECK_1_FORMAT("%d", int);
2968 CHECK_1_FORMAT("%ld", long);
2969 /* The z width modifier was added in Python 2.5. */
2970 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 /* The u type code was added in Python 2.5. */
2973 CHECK_1_FORMAT("%u", unsigned int);
2974 CHECK_1_FORMAT("%lu", unsigned long);
2975 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002978 CHECK_1_FORMAT("%llu", unsigned long long);
2979 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002982
2983 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 Py_XDECREF(result);
2985 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002986
2987#undef CHECK_1_FORMAT
2988}
2989
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002990
2991static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302992test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2994 int result;
2995 if (py_s == NULL)
2996 return NULL;
2997 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2998 Py_DECREF(py_s);
2999 if (!result) {
3000 PyErr_SetString(TestError, "Python string ending in NULL "
3001 "should not compare equal to c string.");
3002 return NULL;
3003 }
3004 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003005}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003006
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003007/* This is here to provide a docstring for test_descr. */
3008static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303009test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003012}
3013
Mark Dickinson725bfd82009-05-03 20:33:40 +00003014/* Test PyOS_string_to_double. */
3015static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303016test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003018 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020#define CHECK_STRING(STR, expected) \
3021 result = PyOS_string_to_double(STR, NULL, NULL); \
3022 if (result == -1.0 && PyErr_Occurred()) \
3023 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003024 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 msg = "conversion of " STR " to float failed"; \
3026 goto fail; \
3027 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029#define CHECK_INVALID(STR) \
3030 result = PyOS_string_to_double(STR, NULL, NULL); \
3031 if (result == -1.0 && PyErr_Occurred()) { \
3032 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3033 PyErr_Clear(); \
3034 else \
3035 return NULL; \
3036 } \
3037 else { \
3038 msg = "conversion of " STR " didn't raise ValueError"; \
3039 goto fail; \
3040 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 CHECK_STRING("0.1", 0.1);
3043 CHECK_STRING("1.234", 1.234);
3044 CHECK_STRING("-1.35", -1.35);
3045 CHECK_STRING(".1e01", 1.0);
3046 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 CHECK_INVALID(" 0.1");
3049 CHECK_INVALID("\t\n-3");
3050 CHECK_INVALID(".123 ");
3051 CHECK_INVALID("3\n");
3052 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003055 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003057#undef CHECK_STRING
3058#undef CHECK_INVALID
3059}
3060
3061
Benjamin Petersonb173f782009-05-05 22:31:58 +00003062/* Coverage testing of capsule objects. */
3063
3064static const char *capsule_name = "capsule name";
3065static char *capsule_pointer = "capsule pointer";
3066static char *capsule_context = "capsule context";
3067static const char *capsule_error = NULL;
3068static int
3069capsule_destructor_call_count = 0;
3070
3071static void
3072capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 capsule_destructor_call_count++;
3074 if (PyCapsule_GetContext(o) != capsule_context) {
3075 capsule_error = "context did not match in destructor!";
3076 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3077 capsule_error = "destructor did not match in destructor! (woah!)";
3078 } else if (PyCapsule_GetName(o) != capsule_name) {
3079 capsule_error = "name did not match in destructor!";
3080 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3081 capsule_error = "pointer did not match in destructor!";
3082 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003083}
3084
3085typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 char *name;
3087 char *module;
3088 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003089} known_capsule;
3090
3091static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003092test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 PyObject *object;
3095 const char *error = NULL;
3096 void *pointer;
3097 void *pointer2;
3098 known_capsule known_capsules[] = {
3099 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3100 KNOWN_CAPSULE("_socket", "CAPI"),
3101 KNOWN_CAPSULE("_curses", "_C_API"),
3102 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3103 { NULL, NULL },
3104 };
3105 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003106
3107#define FAIL(x) { error = (x); goto exit; }
3108
3109#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 if (capsule_error) { \
3111 FAIL(capsule_error); \
3112 } \
3113 else if (!capsule_destructor_call_count) { \
3114 FAIL("destructor not called!"); \
3115 } \
3116 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3119 PyCapsule_SetContext(object, capsule_context);
3120 capsule_destructor(object);
3121 CHECK_DESTRUCTOR;
3122 Py_DECREF(object);
3123 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 object = PyCapsule_New(known, "ignored", NULL);
3126 PyCapsule_SetPointer(object, capsule_pointer);
3127 PyCapsule_SetName(object, capsule_name);
3128 PyCapsule_SetDestructor(object, capsule_destructor);
3129 PyCapsule_SetContext(object, capsule_context);
3130 capsule_destructor(object);
3131 CHECK_DESTRUCTOR;
3132 /* intentionally access using the wrong name */
3133 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3134 if (!PyErr_Occurred()) {
3135 FAIL("PyCapsule_GetPointer should have failed but did not!");
3136 }
3137 PyErr_Clear();
3138 if (pointer2) {
3139 if (pointer2 == capsule_pointer) {
3140 FAIL("PyCapsule_GetPointer should not have"
3141 " returned the internal pointer!");
3142 } else {
3143 FAIL("PyCapsule_GetPointer should have "
3144 "returned NULL pointer but did not!");
3145 }
3146 }
3147 PyCapsule_SetDestructor(object, NULL);
3148 Py_DECREF(object);
3149 if (capsule_destructor_call_count) {
3150 FAIL("destructor called when it should not have been!");
3151 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 for (known = &known_capsules[0]; known->module != NULL; known++) {
3154 /* yeah, ordinarily I wouldn't do this either,
3155 but it's fine for this test harness.
3156 */
3157 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003158#undef FAIL
3159#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 { \
3161 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3162 x, known->module, known->attribute); \
3163 error = buffer; \
3164 goto exit; \
3165 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 PyObject *module = PyImport_ImportModule(known->module);
3168 if (module) {
3169 pointer = PyCapsule_Import(known->name, 0);
3170 if (!pointer) {
3171 Py_DECREF(module);
3172 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3173 }
3174 object = PyObject_GetAttrString(module, known->attribute);
3175 if (!object) {
3176 Py_DECREF(module);
3177 return NULL;
3178 }
3179 pointer2 = PyCapsule_GetPointer(object,
3180 "weebles wobble but they don't fall down");
3181 if (!PyErr_Occurred()) {
3182 Py_DECREF(object);
3183 Py_DECREF(module);
3184 FAIL("PyCapsule_GetPointer should have failed but did not!");
3185 }
3186 PyErr_Clear();
3187 if (pointer2) {
3188 Py_DECREF(module);
3189 Py_DECREF(object);
3190 if (pointer2 == pointer) {
3191 FAIL("PyCapsule_GetPointer should not have"
3192 " returned its internal pointer!");
3193 } else {
3194 FAIL("PyCapsule_GetPointer should have"
3195 " returned NULL pointer but did not!");
3196 }
3197 }
3198 Py_DECREF(object);
3199 Py_DECREF(module);
3200 }
3201 else
3202 PyErr_Clear();
3203 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003204
3205 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 if (error) {
3207 return raiseTestError("test_capsule", error);
3208 }
3209 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003210#undef FAIL
3211}
3212
Guido van Rossumddefaf32007-01-14 03:31:43 +00003213#ifdef HAVE_GETTIMEOFDAY
3214/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003215static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 e->tv_sec -= s->tv_sec;
3218 e->tv_usec -= s->tv_usec;
3219 if (e->tv_usec < 0) {
3220 e->tv_sec -=1;
3221 e->tv_usec += 1000000;
3222 }
3223 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003224}
3225
3226static PyObject *
3227profile_int(PyObject *self, PyObject* args)
3228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 int i, k;
3230 struct timeval start, stop;
3231 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 /* Test 1: Allocate and immediately deallocate
3234 many small integers */
3235 gettimeofday(&start, NULL);
3236 for(k=0; k < 20000; k++)
3237 for(i=0; i < 1000; i++) {
3238 single = PyLong_FromLong(i);
3239 Py_DECREF(single);
3240 }
3241 gettimeofday(&stop, NULL);
3242 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 /* Test 2: Allocate and immediately deallocate
3245 many large integers */
3246 gettimeofday(&start, NULL);
3247 for(k=0; k < 20000; k++)
3248 for(i=0; i < 1000; i++) {
3249 single = PyLong_FromLong(i+1000000);
3250 Py_DECREF(single);
3251 }
3252 gettimeofday(&stop, NULL);
3253 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 /* Test 3: Allocate a few integers, then release
3256 them all simultaneously. */
3257 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003258 if (multiple == NULL)
3259 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 gettimeofday(&start, NULL);
3261 for(k=0; k < 20000; k++) {
3262 for(i=0; i < 1000; i++) {
3263 multiple[i] = PyLong_FromLong(i+1000000);
3264 }
3265 for(i=0; i < 1000; i++) {
3266 Py_DECREF(multiple[i]);
3267 }
3268 }
3269 gettimeofday(&stop, NULL);
3270 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003271 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 /* Test 4: Allocate many integers, then release
3274 them all simultaneously. */
3275 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003276 if (multiple == NULL)
3277 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 gettimeofday(&start, NULL);
3279 for(k=0; k < 20; k++) {
3280 for(i=0; i < 1000000; i++) {
3281 multiple[i] = PyLong_FromLong(i+1000000);
3282 }
3283 for(i=0; i < 1000000; i++) {
3284 Py_DECREF(multiple[i]);
3285 }
3286 }
3287 gettimeofday(&stop, NULL);
3288 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003289 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 /* Test 5: Allocate many integers < 32000 */
3292 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003293 if (multiple == NULL)
3294 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 gettimeofday(&start, NULL);
3296 for(k=0; k < 10; k++) {
3297 for(i=0; i < 1000000; i++) {
3298 multiple[i] = PyLong_FromLong(i+1000);
3299 }
3300 for(i=0; i < 1000000; i++) {
3301 Py_DECREF(multiple[i]);
3302 }
3303 }
3304 gettimeofday(&stop, NULL);
3305 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003306 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 /* Test 6: Perform small int addition */
3309 op1 = PyLong_FromLong(1);
3310 gettimeofday(&start, NULL);
3311 for(i=0; i < 10000000; i++) {
3312 result = PyNumber_Add(op1, op1);
3313 Py_DECREF(result);
3314 }
3315 gettimeofday(&stop, NULL);
3316 Py_DECREF(op1);
3317 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 /* Test 7: Perform medium int addition */
3320 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003321 if (op1 == NULL)
3322 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 gettimeofday(&start, NULL);
3324 for(i=0; i < 10000000; i++) {
3325 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003326 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 }
3328 gettimeofday(&stop, NULL);
3329 Py_DECREF(op1);
3330 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003331
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003332 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003333}
3334#endif
3335
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003336/* To test the format of tracebacks as printed out. */
3337static PyObject *
3338traceback_print(PyObject *self, PyObject *args)
3339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 PyObject *file;
3341 PyObject *traceback;
3342 int result;
3343
3344 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3345 &traceback, &file))
3346 return NULL;
3347
3348 result = PyTraceBack_Print(traceback, file);
3349 if (result < 0)
3350 return NULL;
3351 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003352}
3353
Benjamin Petersone6528212008-07-15 15:32:09 +00003354/* To test the format of exceptions as printed out. */
3355static PyObject *
3356exception_print(PyObject *self, PyObject *args)
3357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 PyObject *value;
3359 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 if (!PyArg_ParseTuple(args, "O:exception_print",
3362 &value))
3363 return NULL;
3364 if (!PyExceptionInstance_Check(value)) {
3365 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3366 return NULL;
3367 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 tb = PyException_GetTraceback(value);
3370 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3371 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003374}
3375
3376
3377
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003378
3379/* reliably raise a MemoryError */
3380static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303381raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 PyErr_NoMemory();
3384 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003385}
3386
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003387/* Issue 6012 */
3388static PyObject *str1, *str2;
3389static int
3390failing_converter(PyObject *obj, void *arg)
3391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 /* Clone str1, then let the conversion fail. */
3393 assert(str1);
3394 str2 = str1;
3395 Py_INCREF(str2);
3396 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003397}
3398static PyObject*
3399argparsing(PyObject *o, PyObject *args)
3400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 PyObject *res;
3402 str1 = str2 = NULL;
3403 if (!PyArg_ParseTuple(args, "O&O&",
3404 PyUnicode_FSConverter, &str1,
3405 failing_converter, &str2)) {
3406 if (!str2)
3407 /* argument converter not called? */
3408 return NULL;
3409 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003410 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 Py_DECREF(str2);
3412 PyErr_Clear();
3413 return res;
3414 }
3415 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003416}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003417
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003418/* To test that the result of PyCode_NewEmpty has the right members. */
3419static PyObject *
3420code_newempty(PyObject *self, PyObject *args)
3421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 const char *filename;
3423 const char *funcname;
3424 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3427 &filename, &funcname, &firstlineno))
3428 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003431}
3432
Georg Brandl1e28a272009-12-28 08:41:01 +00003433/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3434 Run via Lib/test/test_exceptions.py */
3435static PyObject *
3436make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 const char *name;
3439 const char *doc = NULL;
3440 PyObject *base = NULL;
3441 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3446 "s|sOO:make_exception_with_doc", kwlist,
3447 &name, &doc, &base, &dict))
3448 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003451}
3452
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003453static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303454make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003455{
3456 Py_buffer info;
3457 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3458 return NULL;
3459 return PyMemoryView_FromBuffer(&info);
3460}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003461
Stefan Krah7213fcc2015-02-01 16:19:23 +01003462static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003463test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003464{
3465 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3466 int init[5] = {0, 1, 2, 3, 4};
3467 Py_ssize_t itemsize = sizeof(int);
3468 Py_ssize_t shape = 5;
3469 Py_ssize_t strides = 2 * itemsize;
3470 Py_buffer view = {
3471 data,
3472 NULL,
3473 5 * itemsize,
3474 itemsize,
3475 1,
3476 1,
3477 NULL,
3478 &shape,
3479 &strides,
3480 NULL,
3481 NULL
3482 };
3483 int *ptr;
3484 int i;
3485
3486 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3487 ptr = view.buf;
3488 for (i = 0; i < 5; i++) {
3489 if (ptr[2*i] != i) {
3490 PyErr_SetString(TestError,
3491 "test_from_contiguous: incorrect result");
3492 return NULL;
3493 }
3494 }
3495
3496 view.buf = &data[8];
3497 view.strides[0] = -2 * itemsize;
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 Py_RETURN_NONE;
3510}
Stefan Krah650c1e82015-02-03 21:43:23 +01003511
Stefan Kraha7559c02015-02-03 22:27:21 +01003512#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003513extern PyTypeObject _PyBytesIOBuffer_Type;
3514
Stefan Krah5178d912015-02-03 16:57:21 +01003515static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003516test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003517{
Stefan Krah650c1e82015-02-03 21:43:23 +01003518 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003519 PyObject *b;
3520 char *dummy[1];
3521 int ret, match;
3522
Stefan Krah650c1e82015-02-03 21:43:23 +01003523 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003524 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3525 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3526 PyErr_Clear();
3527 if (ret != -1 || match == 0)
3528 goto error;
3529
Stefan Krah650c1e82015-02-03 21:43:23 +01003530 /* bytesiobuf_getbuffer() */
3531 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003532 if (b == NULL) {
3533 return NULL;
3534 }
3535
3536 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3537 Py_DECREF(b);
3538 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3539 PyErr_Clear();
3540 if (ret != -1 || match == 0)
3541 goto error;
3542
3543 Py_RETURN_NONE;
3544
3545error:
3546 PyErr_SetString(TestError,
3547 "test_pep3118_obsolete_write_locks: failure");
3548 return NULL;
3549}
Stefan Kraha7559c02015-02-03 22:27:21 +01003550#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003551
Stefan Krah650c1e82015-02-03 21:43:23 +01003552/* This tests functions that historically supported write locks. It is
3553 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3554 is entitled to segfault in that case. */
3555static PyObject *
3556getbuffer_with_null_view(PyObject* self, PyObject *obj)
3557{
3558 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3559 return NULL;
3560
3561 Py_RETURN_NONE;
3562}
3563
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003564/* PyBuffer_SizeFromFormat() */
3565static PyObject *
3566test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3567{
3568 const char *format;
3569 Py_ssize_t result;
3570
3571 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3572 &format)) {
3573 return NULL;
3574 }
3575
3576 result = PyBuffer_SizeFromFormat(format);
3577 if (result == -1) {
3578 return NULL;
3579 }
3580
3581 return PyLong_FromSsize_t(result);
3582}
3583
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003584/* Test that the fatal error from not having a current thread doesn't
3585 cause an infinite loop. Run via Lib/test/test_capi.py */
3586static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303587crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003588{
3589 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003590 /* Using PyThreadState_Get() directly allows the test to pass in
3591 !pydebug mode. However, the test only actually tests anything
3592 in pydebug mode, since that's where the infinite loop was in
3593 the first place. */
3594 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003595 Py_END_ALLOW_THREADS
3596 return NULL;
3597}
3598
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003599/* To run some code in a sub-interpreter. */
3600static PyObject *
3601run_in_subinterp(PyObject *self, PyObject *args)
3602{
3603 const char *code;
3604 int r;
3605 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003606 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3607 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003608
3609 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3610 &code))
3611 return NULL;
3612
3613 mainstate = PyThreadState_Get();
3614
3615 PyThreadState_Swap(NULL);
3616
3617 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003618 if (substate == NULL) {
3619 /* Since no new thread state was created, there is no exception to
3620 propagate; raise a fresh one after swapping in the old thread
3621 state. */
3622 PyThreadState_Swap(mainstate);
3623 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3624 return NULL;
3625 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003626 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003627 Py_EndInterpreter(substate);
3628
3629 PyThreadState_Swap(mainstate);
3630
3631 return PyLong_FromLong(r);
3632}
3633
Victor Stinner3c1b3792014-02-17 00:02:43 +01003634static int
3635check_time_rounding(int round)
3636{
Victor Stinner74474232015-09-02 01:43:56 +02003637 if (round != _PyTime_ROUND_FLOOR
3638 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003639 && round != _PyTime_ROUND_HALF_EVEN
3640 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003641 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3642 return -1;
3643 }
3644 return 0;
3645}
3646
Victor Stinner5d272cc2012-03-13 13:35:55 +01003647static PyObject *
3648test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3649{
3650 PyObject *obj;
3651 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003652 int round;
3653 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003654 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003655 if (check_time_rounding(round) < 0)
3656 return NULL;
3657 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003658 return NULL;
3659 return _PyLong_FromTime_t(sec);
3660}
3661
3662static PyObject *
3663test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3664{
3665 PyObject *obj;
3666 time_t sec;
3667 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003668 int round;
3669 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003670 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003671 if (check_time_rounding(round) < 0)
3672 return NULL;
3673 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003674 return NULL;
3675 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3676}
3677
Victor Stinner643cd682012-03-02 22:54:03 +01003678static PyObject *
3679test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3680{
3681 PyObject *obj;
3682 time_t sec;
3683 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003684 int round;
3685 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003686 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003687 if (check_time_rounding(round) < 0)
3688 return NULL;
3689 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003690 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003691 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003692}
3693
Antoine Pitrou796564c2013-07-30 19:59:21 +02003694static void
3695slot_tp_del(PyObject *self)
3696{
3697 _Py_IDENTIFIER(__tp_del__);
3698 PyObject *del, *res;
3699 PyObject *error_type, *error_value, *error_traceback;
3700
3701 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003702 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003703 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003704
3705 /* Save the current exception, if any. */
3706 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3707
3708 /* Execute __del__ method, if any. */
3709 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3710 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003711 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003712 if (res == NULL)
3713 PyErr_WriteUnraisable(del);
3714 else
3715 Py_DECREF(res);
3716 Py_DECREF(del);
3717 }
3718
3719 /* Restore the saved exception. */
3720 PyErr_Restore(error_type, error_value, error_traceback);
3721
3722 /* Undo the temporary resurrection; can't use DECREF here, it would
3723 * cause a recursive call.
3724 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003725 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003726 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3727 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003728 /* this is the normal path out */
3729 return;
3730 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003731
3732 /* __del__ resurrected it! Make it look like the original Py_DECREF
3733 * never happened.
3734 */
3735 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003736 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003737 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003738 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003739 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003740 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003741 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3742 _Py_RefTotal, so we need to undo that. */
3743#ifdef Py_REF_DEBUG
3744 _Py_RefTotal--;
3745#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003746}
3747
3748static PyObject *
3749with_tp_del(PyObject *self, PyObject *args)
3750{
3751 PyObject *obj;
3752 PyTypeObject *tp;
3753
3754 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3755 return NULL;
3756 tp = (PyTypeObject *) obj;
3757 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3758 PyErr_Format(PyExc_TypeError,
3759 "heap type expected, got %R", obj);
3760 return NULL;
3761 }
3762 tp->tp_del = slot_tp_del;
3763 Py_INCREF(obj);
3764 return obj;
3765}
3766
Brandt Bucherc13b8472020-10-14 18:44:07 -07003767static PyObject *
3768without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3769{
3770 PyTypeObject *tp = (PyTypeObject*)obj;
3771 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3772 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3773 }
3774 if (PyType_IS_GC(tp)) {
3775 // Don't try this at home, kids:
3776 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3777 tp->tp_free = PyObject_Del;
3778 tp->tp_traverse = NULL;
3779 tp->tp_clear = NULL;
3780 }
3781 assert(!PyType_IS_GC(tp));
3782 Py_INCREF(obj);
3783 return obj;
3784}
3785
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003786static PyMethodDef ml;
3787
3788static PyObject *
3789create_cfunction(PyObject *self, PyObject *args)
3790{
3791 return PyCFunction_NewEx(&ml, self, NULL);
3792}
3793
3794static PyMethodDef ml = {
3795 "create_cfunction",
3796 create_cfunction,
3797 METH_NOARGS,
3798 NULL
3799};
3800
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003801static PyObject *
3802_test_incref(PyObject *ob)
3803{
3804 Py_INCREF(ob);
3805 return ob;
3806}
3807
3808static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303809test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003810{
3811 PyObject *obj = PyLong_FromLong(0);
3812 Py_XINCREF(_test_incref(obj));
3813 Py_DECREF(obj);
3814 Py_DECREF(obj);
3815 Py_DECREF(obj);
3816 Py_RETURN_NONE;
3817}
3818
3819static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303820test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003821{
3822 PyObject *obj = PyLong_FromLong(0);
3823 Py_INCREF(_test_incref(obj));
3824 Py_DECREF(obj);
3825 Py_DECREF(obj);
3826 Py_DECREF(obj);
3827 Py_RETURN_NONE;
3828}
3829
3830static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303831test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003832{
3833 Py_XDECREF(PyLong_FromLong(0));
3834 Py_RETURN_NONE;
3835}
3836
3837static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303838test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003839{
3840 Py_DECREF(PyLong_FromLong(0));
3841 Py_RETURN_NONE;
3842}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003843
Victor Stinner0507bf52013-07-07 02:05:46 +02003844static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003845test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3846 PyObject *Py_UNUSED(args))
3847{
3848 PyStructSequence_Desc descr;
3849 PyStructSequence_Field descr_fields[3];
3850
3851 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3852 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3853 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3854
3855 descr.name = "_testcapi.test_descr";
3856 descr.doc = "This is used to test for memory leaks in NewType";
3857 descr.fields = descr_fields;
3858 descr.n_in_sequence = 1;
3859
3860 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3861 assert(structseq_type != NULL);
3862 assert(PyType_Check(structseq_type));
3863 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3864 Py_DECREF(structseq_type);
3865
3866 Py_RETURN_NONE;
3867}
3868
3869static PyObject *
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07003870test_structseq_newtype_null_descr_doc(PyObject *Py_UNUSED(self),
3871 PyObject *Py_UNUSED(args))
3872{
3873 PyStructSequence_Field descr_fields[1] = {
3874 (PyStructSequence_Field){NULL, NULL}
3875 };
3876 // Test specifically for NULL .doc field.
3877 PyStructSequence_Desc descr = {"_testcapi.test_descr", NULL, &descr_fields[0], 0};
3878
3879 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3880 assert(structseq_type != NULL);
3881 assert(PyType_Check(structseq_type));
3882 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3883 Py_DECREF(structseq_type);
3884
3885 Py_RETURN_NONE;
3886}
3887
3888static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303889test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003890{
3891 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003892 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003893 Py_DecRef(obj);
3894 Py_DecRef(obj);
3895 Py_RETURN_NONE;
3896}
3897
3898static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303899test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003900{
3901 void *ptr;
3902
Victor Stinnerdb067af2014-05-02 22:31:14 +02003903 ptr = PyMem_RawMalloc(0);
3904 if (ptr == NULL) {
3905 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3906 return NULL;
3907 }
3908 PyMem_RawFree(ptr);
3909
3910 ptr = PyMem_RawCalloc(0, 0);
3911 if (ptr == NULL) {
3912 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3913 return NULL;
3914 }
3915 PyMem_RawFree(ptr);
3916
Victor Stinner0507bf52013-07-07 02:05:46 +02003917 ptr = PyMem_Malloc(0);
3918 if (ptr == NULL) {
3919 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3920 return NULL;
3921 }
3922 PyMem_Free(ptr);
3923
Victor Stinnerdb067af2014-05-02 22:31:14 +02003924 ptr = PyMem_Calloc(0, 0);
3925 if (ptr == NULL) {
3926 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3927 return NULL;
3928 }
3929 PyMem_Free(ptr);
3930
Victor Stinner0507bf52013-07-07 02:05:46 +02003931 ptr = PyObject_Malloc(0);
3932 if (ptr == NULL) {
3933 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3934 return NULL;
3935 }
3936 PyObject_Free(ptr);
3937
Victor Stinnerdb067af2014-05-02 22:31:14 +02003938 ptr = PyObject_Calloc(0, 0);
3939 if (ptr == NULL) {
3940 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3941 return NULL;
3942 }
3943 PyObject_Free(ptr);
3944
Victor Stinner0507bf52013-07-07 02:05:46 +02003945 Py_RETURN_NONE;
3946}
3947
3948typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003949 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003950
3951 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003952 size_t calloc_nelem;
3953 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003954 void *realloc_ptr;
3955 size_t realloc_new_size;
3956 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003957 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003958} alloc_hook_t;
3959
Victor Stinner9ed83c42017-10-31 12:18:10 -07003960static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003961{
3962 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003963 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003964 hook->malloc_size = size;
3965 return hook->alloc.malloc(hook->alloc.ctx, size);
3966}
3967
Victor Stinner9ed83c42017-10-31 12:18:10 -07003968static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003969{
3970 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003971 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003972 hook->calloc_nelem = nelem;
3973 hook->calloc_elsize = elsize;
3974 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3975}
3976
Victor Stinner9ed83c42017-10-31 12:18:10 -07003977static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003978{
3979 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003980 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003981 hook->realloc_ptr = ptr;
3982 hook->realloc_new_size = new_size;
3983 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3984}
3985
Victor Stinner9ed83c42017-10-31 12:18:10 -07003986static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003987{
3988 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003989 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003990 hook->free_ptr = ptr;
3991 hook->alloc.free(hook->alloc.ctx, ptr);
3992}
3993
3994static PyObject *
3995test_setallocators(PyMemAllocatorDomain domain)
3996{
3997 PyObject *res = NULL;
3998 const char *error_msg;
3999 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004000 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004001 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004002 void *ptr, *ptr2;
4003
Victor Stinnerdb067af2014-05-02 22:31:14 +02004004 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004005
4006 alloc.ctx = &hook;
4007 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004008 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004009 alloc.realloc = &hook_realloc;
4010 alloc.free = &hook_free;
4011 PyMem_GetAllocator(domain, &hook.alloc);
4012 PyMem_SetAllocator(domain, &alloc);
4013
Victor Stinner9ed83c42017-10-31 12:18:10 -07004014 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004015 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004016 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004017 switch(domain)
4018 {
4019 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4020 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4021 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4022 default: ptr = NULL; break;
4023 }
4024
Victor Stinner9ed83c42017-10-31 12:18:10 -07004025#define CHECK_CTX(FUNC) \
4026 if (hook.ctx != &hook) { \
4027 error_msg = FUNC " wrong context"; \
4028 goto fail; \
4029 } \
4030 hook.ctx = NULL; /* reset for next check */
4031
Victor Stinner0507bf52013-07-07 02:05:46 +02004032 if (ptr == NULL) {
4033 error_msg = "malloc failed";
4034 goto fail;
4035 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004036 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004037 if (hook.malloc_size != size) {
4038 error_msg = "malloc invalid size";
4039 goto fail;
4040 }
4041
4042 size2 = 200;
4043 switch(domain)
4044 {
4045 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4046 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4047 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004048 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004049 }
4050
4051 if (ptr2 == NULL) {
4052 error_msg = "realloc failed";
4053 goto fail;
4054 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004055 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004056 if (hook.realloc_ptr != ptr
4057 || hook.realloc_new_size != size2) {
4058 error_msg = "realloc invalid parameters";
4059 goto fail;
4060 }
4061
4062 switch(domain)
4063 {
4064 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4065 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4066 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4067 }
4068
Victor Stinner9ed83c42017-10-31 12:18:10 -07004069 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004070 if (hook.free_ptr != ptr2) {
4071 error_msg = "free invalid pointer";
4072 goto fail;
4073 }
4074
Victor Stinner9ed83c42017-10-31 12:18:10 -07004075 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004076 nelem = 2;
4077 elsize = 5;
4078 switch(domain)
4079 {
4080 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4081 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4082 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4083 default: ptr = NULL; break;
4084 }
4085
4086 if (ptr == NULL) {
4087 error_msg = "calloc failed";
4088 goto fail;
4089 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004090 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004091 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4092 error_msg = "calloc invalid nelem or elsize";
4093 goto fail;
4094 }
4095
Victor Stinner9ed83c42017-10-31 12:18:10 -07004096 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004097 switch(domain)
4098 {
4099 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4100 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4101 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4102 }
4103
Victor Stinner9ed83c42017-10-31 12:18:10 -07004104 CHECK_CTX("calloc free");
4105 if (hook.free_ptr != ptr) {
4106 error_msg = "calloc free invalid pointer";
4107 goto fail;
4108 }
4109
Victor Stinner0507bf52013-07-07 02:05:46 +02004110 Py_INCREF(Py_None);
4111 res = Py_None;
4112 goto finally;
4113
4114fail:
4115 PyErr_SetString(PyExc_RuntimeError, error_msg);
4116
4117finally:
4118 PyMem_SetAllocator(domain, &hook.alloc);
4119 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004120
4121#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004122}
4123
4124static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304125test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004126{
4127 return test_setallocators(PYMEM_DOMAIN_RAW);
4128}
4129
4130static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304131test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004132{
4133 return test_setallocators(PYMEM_DOMAIN_MEM);
4134}
4135
4136static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304137test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004138{
4139 return test_setallocators(PYMEM_DOMAIN_OBJ);
4140}
4141
xdegaye85f64302017-07-01 14:14:45 +02004142/* Most part of the following code is inherited from the pyfailmalloc project
4143 * written by Victor Stinner. */
4144static struct {
4145 int installed;
4146 PyMemAllocatorEx raw;
4147 PyMemAllocatorEx mem;
4148 PyMemAllocatorEx obj;
4149} FmHook;
4150
4151static struct {
4152 int start;
4153 int stop;
4154 Py_ssize_t count;
4155} FmData;
4156
4157static int
4158fm_nomemory(void)
4159{
4160 FmData.count++;
4161 if (FmData.count > FmData.start &&
4162 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4163 return 1;
4164 }
4165 return 0;
4166}
4167
4168static void *
4169hook_fmalloc(void *ctx, size_t size)
4170{
4171 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4172 if (fm_nomemory()) {
4173 return NULL;
4174 }
4175 return alloc->malloc(alloc->ctx, size);
4176}
4177
4178static void *
4179hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4180{
4181 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4182 if (fm_nomemory()) {
4183 return NULL;
4184 }
4185 return alloc->calloc(alloc->ctx, nelem, elsize);
4186}
4187
4188static void *
4189hook_frealloc(void *ctx, void *ptr, size_t new_size)
4190{
4191 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4192 if (fm_nomemory()) {
4193 return NULL;
4194 }
4195 return alloc->realloc(alloc->ctx, ptr, new_size);
4196}
4197
4198static void
4199hook_ffree(void *ctx, void *ptr)
4200{
4201 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4202 alloc->free(alloc->ctx, ptr);
4203}
4204
4205static void
4206fm_setup_hooks(void)
4207{
4208 PyMemAllocatorEx alloc;
4209
4210 if (FmHook.installed) {
4211 return;
4212 }
4213 FmHook.installed = 1;
4214
4215 alloc.malloc = hook_fmalloc;
4216 alloc.calloc = hook_fcalloc;
4217 alloc.realloc = hook_frealloc;
4218 alloc.free = hook_ffree;
4219 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4220 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4221 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4222
4223 alloc.ctx = &FmHook.raw;
4224 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4225
4226 alloc.ctx = &FmHook.mem;
4227 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4228
4229 alloc.ctx = &FmHook.obj;
4230 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4231}
4232
4233static void
4234fm_remove_hooks(void)
4235{
4236 if (FmHook.installed) {
4237 FmHook.installed = 0;
4238 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4239 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4240 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4241 }
4242}
4243
4244static PyObject*
4245set_nomemory(PyObject *self, PyObject *args)
4246{
4247 /* Memory allocation fails after 'start' allocation requests, and until
4248 * 'stop' allocation requests except when 'stop' is negative or equal
4249 * to 0 (default) in which case allocation failures never stop. */
4250 FmData.count = 0;
4251 FmData.stop = 0;
4252 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4253 return NULL;
4254 }
4255 fm_setup_hooks();
4256 Py_RETURN_NONE;
4257}
4258
4259static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304260remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004261{
4262 fm_remove_hooks();
4263 Py_RETURN_NONE;
4264}
4265
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004266PyDoc_STRVAR(docstring_empty,
4267""
4268);
4269
4270PyDoc_STRVAR(docstring_no_signature,
4271"This docstring has no signature."
4272);
4273
4274PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004275"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004276"\n"
4277"This docstring has an invalid signature."
4278);
4279
Larry Hastings2623c8c2014-02-08 22:15:29 -08004280PyDoc_STRVAR(docstring_with_invalid_signature2,
4281"docstring_with_invalid_signature2($module, /, boo)\n"
4282"\n"
4283"--\n"
4284"\n"
4285"This docstring also has an invalid signature."
4286);
4287
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004288PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004289"docstring_with_signature($module, /, sig)\n"
4290"--\n"
4291"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004292"This docstring has a valid signature."
4293);
4294
Zachary Ware8ef887c2015-04-13 18:22:35 -05004295PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4296"docstring_with_signature_but_no_doc($module, /, sig)\n"
4297"--\n"
4298"\n"
4299);
4300
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004301PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004302"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4303"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004304"\n"
4305"\n"
4306"This docstring has a valid signature and some extra newlines."
4307);
4308
Larry Hastings16c51912014-01-07 11:53:01 -08004309PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004310"docstring_with_signature_with_defaults(module, s='avocado',\n"
4311" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4312" local=the_number_three, sys=sys.maxsize,\n"
4313" exp=sys.maxsize - 1)\n"
4314"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004315"\n"
4316"\n"
4317"\n"
4318"This docstring has a valid signature with parameters,\n"
4319"and the parameters take defaults of varying types."
4320);
4321
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004322typedef struct {
4323 PyThread_type_lock start_event;
4324 PyThread_type_lock exit_event;
4325 PyObject *callback;
4326} test_c_thread_t;
4327
4328static void
4329temporary_c_thread(void *data)
4330{
4331 test_c_thread_t *test_c_thread = data;
4332 PyGILState_STATE state;
4333 PyObject *res;
4334
4335 PyThread_release_lock(test_c_thread->start_event);
4336
4337 /* Allocate a Python thread state for this thread */
4338 state = PyGILState_Ensure();
4339
Victor Stinner3466bde2016-09-05 18:16:01 -07004340 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004341 Py_CLEAR(test_c_thread->callback);
4342
4343 if (res == NULL) {
4344 PyErr_Print();
4345 }
4346 else {
4347 Py_DECREF(res);
4348 }
4349
4350 /* Destroy the Python thread state for this thread */
4351 PyGILState_Release(state);
4352
4353 PyThread_release_lock(test_c_thread->exit_event);
4354
4355 PyThread_exit_thread();
4356}
4357
4358static PyObject *
4359call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4360{
4361 PyObject *res = NULL;
4362 test_c_thread_t test_c_thread;
4363 long thread;
4364
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004365 test_c_thread.start_event = PyThread_allocate_lock();
4366 test_c_thread.exit_event = PyThread_allocate_lock();
4367 test_c_thread.callback = NULL;
4368 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4369 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4370 goto exit;
4371 }
4372
4373 Py_INCREF(callback);
4374 test_c_thread.callback = callback;
4375
4376 PyThread_acquire_lock(test_c_thread.start_event, 1);
4377 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4378
4379 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4380 if (thread == -1) {
4381 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4382 PyThread_release_lock(test_c_thread.start_event);
4383 PyThread_release_lock(test_c_thread.exit_event);
4384 goto exit;
4385 }
4386
4387 PyThread_acquire_lock(test_c_thread.start_event, 1);
4388 PyThread_release_lock(test_c_thread.start_event);
4389
4390 Py_BEGIN_ALLOW_THREADS
4391 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4392 PyThread_release_lock(test_c_thread.exit_event);
4393 Py_END_ALLOW_THREADS
4394
4395 Py_INCREF(Py_None);
4396 res = Py_None;
4397
4398exit:
4399 Py_CLEAR(test_c_thread.callback);
4400 if (test_c_thread.start_event)
4401 PyThread_free_lock(test_c_thread.start_event);
4402 if (test_c_thread.exit_event)
4403 PyThread_free_lock(test_c_thread.exit_event);
4404 return res;
4405}
Victor Stinner13105102013-12-13 02:17:29 +01004406
Serhiy Storchakab5181342015-02-06 08:58:56 +02004407/* marshal */
4408
4409static PyObject*
4410pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4411{
4412 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004413 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004414 int version;
4415 FILE *fp;
4416
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004417 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004418 &value, &filename, &version))
4419 return NULL;
4420
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004421 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004422 if (fp == NULL) {
4423 PyErr_SetFromErrno(PyExc_OSError);
4424 return NULL;
4425 }
4426
4427 PyMarshal_WriteLongToFile(value, fp, version);
4428
4429 fclose(fp);
4430 if (PyErr_Occurred())
4431 return NULL;
4432 Py_RETURN_NONE;
4433}
4434
4435static PyObject*
4436pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4437{
4438 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004439 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004440 int version;
4441 FILE *fp;
4442
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004443 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004444 &obj, &filename, &version))
4445 return NULL;
4446
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004447 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004448 if (fp == NULL) {
4449 PyErr_SetFromErrno(PyExc_OSError);
4450 return NULL;
4451 }
4452
4453 PyMarshal_WriteObjectToFile(obj, fp, version);
4454
4455 fclose(fp);
4456 if (PyErr_Occurred())
4457 return NULL;
4458 Py_RETURN_NONE;
4459}
4460
4461static PyObject*
4462pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4463{
4464 int value;
4465 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004466 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004467 FILE *fp;
4468
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004469 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004470 return NULL;
4471
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004472 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004473 if (fp == NULL) {
4474 PyErr_SetFromErrno(PyExc_OSError);
4475 return NULL;
4476 }
4477
4478 value = PyMarshal_ReadShortFromFile(fp);
4479 pos = ftell(fp);
4480
4481 fclose(fp);
4482 if (PyErr_Occurred())
4483 return NULL;
4484 return Py_BuildValue("il", value, pos);
4485}
4486
4487static PyObject*
4488pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4489{
4490 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004491 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004492 FILE *fp;
4493
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004494 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004495 return NULL;
4496
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004497 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004498 if (fp == NULL) {
4499 PyErr_SetFromErrno(PyExc_OSError);
4500 return NULL;
4501 }
4502
4503 value = PyMarshal_ReadLongFromFile(fp);
4504 pos = ftell(fp);
4505
4506 fclose(fp);
4507 if (PyErr_Occurred())
4508 return NULL;
4509 return Py_BuildValue("ll", value, pos);
4510}
4511
4512static PyObject*
4513pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4514{
4515 PyObject *obj;
4516 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004517 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004518 FILE *fp;
4519
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004520 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004521 return NULL;
4522
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004523 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004524 if (fp == NULL) {
4525 PyErr_SetFromErrno(PyExc_OSError);
4526 return NULL;
4527 }
4528
4529 obj = PyMarshal_ReadLastObjectFromFile(fp);
4530 pos = ftell(fp);
4531
4532 fclose(fp);
4533 return Py_BuildValue("Nl", obj, pos);
4534}
4535
4536static PyObject*
4537pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4538{
4539 PyObject *obj;
4540 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004541 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004542 FILE *fp;
4543
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004544 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004545 return NULL;
4546
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004547 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004548 if (fp == NULL) {
4549 PyErr_SetFromErrno(PyExc_OSError);
4550 return NULL;
4551 }
4552
4553 obj = PyMarshal_ReadObjectFromFile(fp);
4554 pos = ftell(fp);
4555
4556 fclose(fp);
4557 return Py_BuildValue("Nl", obj, pos);
4558}
4559
Victor Stinnerefde1462015-03-21 15:04:43 +01004560static PyObject*
4561return_null_without_error(PyObject *self, PyObject *args)
4562{
4563 /* invalid call: return NULL without setting an error,
4564 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4565 PyErr_Clear();
4566 return NULL;
4567}
4568
4569static PyObject*
4570return_result_with_error(PyObject *self, PyObject *args)
4571{
4572 /* invalid call: return a result with an error set,
4573 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4574 PyErr_SetNone(PyExc_ValueError);
4575 Py_RETURN_NONE;
4576}
4577
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01004578static PyObject*
4579getitem_with_error(PyObject *self, PyObject *args)
4580{
4581 PyObject *map, *key;
4582 if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
4583 return NULL;
4584 }
4585
4586 PyErr_SetString(PyExc_ValueError, "bug");
4587 return PyObject_GetItem(map, key);
4588}
4589
Victor Stinner992c43f2015-03-27 17:12:45 +01004590static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004591test_pytime_fromseconds(PyObject *self, PyObject *args)
4592{
4593 int seconds;
4594 _PyTime_t ts;
4595
4596 if (!PyArg_ParseTuple(args, "i", &seconds))
4597 return NULL;
4598 ts = _PyTime_FromSeconds(seconds);
4599 return _PyTime_AsNanosecondsObject(ts);
4600}
4601
4602static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004603test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4604{
4605 PyObject *obj;
4606 int round;
4607 _PyTime_t ts;
4608
4609 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4610 return NULL;
4611 if (check_time_rounding(round) < 0)
4612 return NULL;
4613 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4614 return NULL;
4615 return _PyTime_AsNanosecondsObject(ts);
4616}
4617
Victor Stinner4bfb4602015-03-27 22:27:24 +01004618static PyObject *
4619test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4620{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004621 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004622 _PyTime_t ts;
4623 double d;
4624
Victor Stinnerc29b5852017-11-02 07:28:27 -07004625 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004626 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004627 }
4628 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4629 return NULL;
4630 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004631 d = _PyTime_AsSecondsDouble(ts);
4632 return PyFloat_FromDouble(d);
4633}
4634
Victor Stinner95e9cef2015-03-28 01:26:47 +01004635static PyObject *
4636test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4637{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004638 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004639 int round;
4640 _PyTime_t t;
4641 struct timeval tv;
4642 PyObject *seconds;
4643
Victor Stinnerc29b5852017-11-02 07:28:27 -07004644 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004645 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004646 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004647 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004648 }
4649 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004650 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004651 }
4652 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4653 return NULL;
4654 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004655
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004656 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004657 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004658 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004659 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004660 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4661}
4662
Victor Stinner34dc0f42015-03-27 18:19:03 +01004663#ifdef HAVE_CLOCK_GETTIME
4664static PyObject *
4665test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4666{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004667 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004668 _PyTime_t t;
4669 struct timespec ts;
4670
Victor Stinnerc29b5852017-11-02 07:28:27 -07004671 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004672 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004673 }
4674 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004675 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004676 }
4677 if (_PyTime_AsTimespec(t, &ts) == -1) {
4678 return NULL;
4679 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004680 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4681}
4682#endif
4683
Victor Stinner62d1c702015-04-01 17:47:07 +02004684static PyObject *
4685test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4686{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004687 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004688 int round;
4689 _PyTime_t t, ms;
4690
Victor Stinnerc29b5852017-11-02 07:28:27 -07004691 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004692 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004693 }
4694 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004695 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004696 }
4697 if (check_time_rounding(round) < 0) {
4698 return NULL;
4699 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004700 ms = _PyTime_AsMilliseconds(t, round);
4701 /* This conversion rely on the fact that _PyTime_t is a number of
4702 nanoseconds */
4703 return _PyTime_AsNanosecondsObject(ms);
4704}
4705
4706static PyObject *
4707test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4708{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004709 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004710 int round;
4711 _PyTime_t t, ms;
4712
Victor Stinnerc29b5852017-11-02 07:28:27 -07004713 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004714 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004715 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004716 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004717 }
4718 if (check_time_rounding(round) < 0) {
4719 return NULL;
4720 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004721 ms = _PyTime_AsMicroseconds(t, round);
4722 /* This conversion rely on the fact that _PyTime_t is a number of
4723 nanoseconds */
4724 return _PyTime_AsNanosecondsObject(ms);
4725}
4726
Victor Stinner50856d52015-10-13 00:11:21 +02004727static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004728pymem_buffer_overflow(PyObject *self, PyObject *args)
4729{
4730 char *buffer;
4731
4732 /* Deliberate buffer overflow to check that PyMem_Free() detects
4733 the overflow when debug hooks are installed. */
4734 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004735 if (buffer == NULL) {
4736 PyErr_NoMemory();
4737 return NULL;
4738 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004739 buffer[16] = 'x';
4740 PyMem_Free(buffer);
4741
4742 Py_RETURN_NONE;
4743}
4744
4745static PyObject*
4746pymem_api_misuse(PyObject *self, PyObject *args)
4747{
4748 char *buffer;
4749
4750 /* Deliberate misusage of Python allocators:
4751 allococate with PyMem but release with PyMem_Raw. */
4752 buffer = PyMem_Malloc(16);
4753 PyMem_RawFree(buffer);
4754
4755 Py_RETURN_NONE;
4756}
4757
Victor Stinnerc4aec362016-03-14 22:26:53 +01004758static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004759pymem_malloc_without_gil(PyObject *self, PyObject *args)
4760{
4761 char *buffer;
4762
4763 /* Deliberate bug to test debug hooks on Python memory allocators:
4764 call PyMem_Malloc() without holding the GIL */
4765 Py_BEGIN_ALLOW_THREADS
4766 buffer = PyMem_Malloc(10);
4767 Py_END_ALLOW_THREADS
4768
4769 PyMem_Free(buffer);
4770
4771 Py_RETURN_NONE;
4772}
4773
Victor Stinner5d39e042017-11-29 17:20:38 +01004774
4775static PyObject*
4776test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4777{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004778 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004779 if (name == NULL) {
4780 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4781 return NULL;
4782 }
4783 return PyUnicode_FromString(name);
4784}
4785
4786
Victor Stinnerad524372016-03-16 12:12:53 +01004787static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004788test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004789{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004790 if (!_PyObject_IsFreed(op)) {
4791 return raiseTestError(test_name, "object is not seen as freed");
4792 }
4793 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004794}
4795
4796
4797static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004798check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4799{
4800 PyObject *op = NULL;
4801 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4802}
4803
4804
4805static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004806check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004807{
4808 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4809 if (op == NULL) {
4810 return NULL;
4811 }
4812 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004813 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004814 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004815 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004816}
4817
4818
4819static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004820check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004821{
4822 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4823 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4824 if (op == NULL) {
4825 return NULL;
4826 }
4827 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004828 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004829 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004830 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004831 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004832}
4833
4834
4835static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004836check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004837{
Miss Islington (bot)0895e62c2021-06-10 05:02:22 -07004838 /* This test would fail if run with the address sanitizer */
4839#ifdef _Py_ADDRESS_SANITIZER
4840 Py_RETURN_NONE;
4841#else
Victor Stinner2b00db62019-04-11 11:33:27 +02004842 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4843 if (op == NULL) {
4844 return NULL;
4845 }
4846 Py_TYPE(op)->tp_dealloc(op);
4847 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004848 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004849 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004850 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Miss Islington (bot)0895e62c2021-06-10 05:02:22 -07004851#endif
Victor Stinner2b00db62019-04-11 11:33:27 +02004852}
4853
4854
4855static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004856pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4857{
4858 char *buffer;
4859
Victor Stinnerad524372016-03-16 12:12:53 +01004860 /* Deliberate bug to test debug hooks on Python memory allocators:
4861 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004862 Py_BEGIN_ALLOW_THREADS
4863 buffer = PyObject_Malloc(10);
4864 Py_END_ALLOW_THREADS
4865
4866 PyObject_Free(buffer);
4867
4868 Py_RETURN_NONE;
4869}
4870
Victor Stinner10b73e12016-03-22 13:39:05 +01004871static PyObject *
4872tracemalloc_track(PyObject *self, PyObject *args)
4873{
4874 unsigned int domain;
4875 PyObject *ptr_obj;
4876 void *ptr;
4877 Py_ssize_t size;
4878 int release_gil = 0;
4879 int res;
4880
4881 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4882 return NULL;
4883 ptr = PyLong_AsVoidPtr(ptr_obj);
4884 if (PyErr_Occurred())
4885 return NULL;
4886
4887 if (release_gil) {
4888 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004889 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004890 Py_END_ALLOW_THREADS
4891 }
4892 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004893 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004894 }
4895
4896 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004897 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004898 return NULL;
4899 }
4900
4901 Py_RETURN_NONE;
4902}
4903
4904static PyObject *
4905tracemalloc_untrack(PyObject *self, PyObject *args)
4906{
4907 unsigned int domain;
4908 PyObject *ptr_obj;
4909 void *ptr;
4910 int res;
4911
4912 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4913 return NULL;
4914 ptr = PyLong_AsVoidPtr(ptr_obj);
4915 if (PyErr_Occurred())
4916 return NULL;
4917
Victor Stinner5ea4c062017-06-20 17:46:36 +02004918 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004919 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004920 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004921 return NULL;
4922 }
4923
4924 Py_RETURN_NONE;
4925}
4926
4927static PyObject *
4928tracemalloc_get_traceback(PyObject *self, PyObject *args)
4929{
4930 unsigned int domain;
4931 PyObject *ptr_obj;
4932 void *ptr;
4933
4934 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4935 return NULL;
4936 ptr = PyLong_AsVoidPtr(ptr_obj);
4937 if (PyErr_Occurred())
4938 return NULL;
4939
Benjamin Petersonca470632016-09-06 13:47:26 -07004940 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004941}
4942
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004943static PyObject *
4944dict_get_version(PyObject *self, PyObject *args)
4945{
4946 PyDictObject *dict;
4947 uint64_t version;
4948
4949 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4950 return NULL;
4951
4952 version = dict->ma_version_tag;
4953
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004954 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4955 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004956}
4957
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004958
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004959static PyObject *
4960raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4961{
Vladimir Matveev037245c2020-10-09 17:15:15 -07004962 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004963 PyGenObject *gen;
4964
4965 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4966 return NULL;
4967
4968 /* This is used in a test to check what happens if a signal arrives just
4969 as we're in the process of entering a yield from chain (see
4970 bpo-30039).
4971
4972 Needs to be done in C, because:
4973 - we don't have a Python wrapper for raise()
4974 - we need to make sure that the Python-level signal handler doesn't run
4975 *before* we enter the generator frame, which is impossible in Python
4976 because we check for signals before every bytecode operation.
4977 */
4978 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07004979 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004980}
4981
4982
Victor Stinner3b5cf852017-06-09 16:48:45 +02004983static int
4984fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4985{
4986 if (args == Py_None) {
4987 *stack = NULL;
4988 *nargs = 0;
4989 }
4990 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004991 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004992 *nargs = PyTuple_GET_SIZE(args);
4993 }
4994 else {
4995 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4996 return -1;
4997 }
4998 return 0;
4999}
5000
5001
5002static PyObject *
5003test_pyobject_fastcall(PyObject *self, PyObject *args)
5004{
5005 PyObject *func, *func_args;
5006 PyObject **stack;
5007 Py_ssize_t nargs;
5008
5009 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5010 return NULL;
5011 }
5012
5013 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5014 return NULL;
5015 }
5016 return _PyObject_FastCall(func, stack, nargs);
5017}
5018
5019
5020static PyObject *
5021test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5022{
5023 PyObject *func, *func_args, *kwargs;
5024 PyObject **stack;
5025 Py_ssize_t nargs;
5026
5027 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5028 return NULL;
5029 }
5030
5031 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5032 return NULL;
5033 }
5034
5035 if (kwargs == Py_None) {
5036 kwargs = NULL;
5037 }
5038 else if (!PyDict_Check(kwargs)) {
5039 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5040 return NULL;
5041 }
5042
Petr Viktorinffd97532020-02-11 17:46:57 +01005043 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005044}
5045
5046
5047static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005048test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005049{
5050 PyObject *func, *func_args, *kwnames = NULL;
5051 PyObject **stack;
5052 Py_ssize_t nargs, nkw;
5053
5054 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5055 return NULL;
5056 }
5057
5058 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5059 return NULL;
5060 }
5061
5062 if (kwnames == Py_None) {
5063 kwnames = NULL;
5064 }
5065 else if (PyTuple_Check(kwnames)) {
5066 nkw = PyTuple_GET_SIZE(kwnames);
5067 if (nargs < nkw) {
5068 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5069 return NULL;
5070 }
5071 nargs -= nkw;
5072 }
5073 else {
5074 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5075 return NULL;
5076 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005077 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005078}
5079
5080
5081static PyObject *
5082test_pyvectorcall_call(PyObject *self, PyObject *args)
5083{
5084 PyObject *func;
5085 PyObject *argstuple;
5086 PyObject *kwargs = NULL;
5087
5088 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5089 return NULL;
5090 }
5091
5092 if (!PyTuple_Check(argstuple)) {
5093 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5094 return NULL;
5095 }
5096 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5097 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5098 return NULL;
5099 }
5100
5101 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005102}
5103
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005104
Victor Stinner64fa4492017-07-10 14:37:49 +02005105static PyObject*
5106stack_pointer(PyObject *self, PyObject *args)
5107{
5108 int v = 5;
5109 return PyLong_FromVoidPtr(&v);
5110}
5111
Victor Stinner3b5cf852017-06-09 16:48:45 +02005112
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005113#ifdef W_STOPCODE
5114static PyObject*
5115py_w_stopcode(PyObject *self, PyObject *args)
5116{
5117 int sig, status;
5118 if (!PyArg_ParseTuple(args, "i", &sig)) {
5119 return NULL;
5120 }
5121 status = W_STOPCODE(sig);
5122 return PyLong_FromLong(status);
5123}
5124#endif
5125
5126
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005127static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005128get_mapping_keys(PyObject* self, PyObject *obj)
5129{
5130 return PyMapping_Keys(obj);
5131}
5132
5133static PyObject *
5134get_mapping_values(PyObject* self, PyObject *obj)
5135{
5136 return PyMapping_Values(obj);
5137}
5138
5139static PyObject *
5140get_mapping_items(PyObject* self, PyObject *obj)
5141{
5142 return PyMapping_Items(obj);
5143}
5144
5145
5146static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005147test_pythread_tss_key_state(PyObject *self, PyObject *args)
5148{
5149 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5150 if (PyThread_tss_is_created(&tss_key)) {
5151 return raiseTestError("test_pythread_tss_key_state",
5152 "TSS key not in an uninitialized state at "
5153 "creation time");
5154 }
5155 if (PyThread_tss_create(&tss_key) != 0) {
5156 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5157 return NULL;
5158 }
5159 if (!PyThread_tss_is_created(&tss_key)) {
5160 return raiseTestError("test_pythread_tss_key_state",
5161 "PyThread_tss_create succeeded, "
5162 "but with TSS key in an uninitialized state");
5163 }
5164 if (PyThread_tss_create(&tss_key) != 0) {
5165 return raiseTestError("test_pythread_tss_key_state",
5166 "PyThread_tss_create unsuccessful with "
5167 "an already initialized key");
5168 }
5169#define CHECK_TSS_API(expr) \
5170 (void)(expr); \
5171 if (!PyThread_tss_is_created(&tss_key)) { \
5172 return raiseTestError("test_pythread_tss_key_state", \
5173 "TSS key initialization state was not " \
5174 "preserved after calling " #expr); }
5175 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5176 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5177#undef CHECK_TSS_API
5178 PyThread_tss_delete(&tss_key);
5179 if (PyThread_tss_is_created(&tss_key)) {
5180 return raiseTestError("test_pythread_tss_key_state",
5181 "PyThread_tss_delete called, but did not "
5182 "set the key state to uninitialized");
5183 }
5184
5185 Py_tss_t *ptr_key = PyThread_tss_alloc();
5186 if (ptr_key == NULL) {
5187 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5188 return NULL;
5189 }
5190 if (PyThread_tss_is_created(ptr_key)) {
5191 return raiseTestError("test_pythread_tss_key_state",
5192 "TSS key not in an uninitialized state at "
5193 "allocation time");
5194 }
5195 PyThread_tss_free(ptr_key);
5196 ptr_key = NULL;
5197 Py_RETURN_NONE;
5198}
5199
5200
Yury Selivanovf23746a2018-01-22 19:11:18 -05005201static PyObject*
5202new_hamt(PyObject *self, PyObject *args)
5203{
5204 return _PyContext_NewHamtForTests();
5205}
5206
5207
jdemeyer5a306202018-10-19 23:50:06 +02005208/* def bad_get(self, obj, cls):
5209 cls()
5210 return repr(self)
5211*/
5212static PyObject*
5213bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5214{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005215 PyObject *self, *obj, *cls;
5216 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005217 return NULL;
5218 }
5219
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005220 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005221 if (res == NULL) {
5222 return NULL;
5223 }
5224 Py_DECREF(res);
5225
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005226 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005227}
5228
5229
Victor Stinner3d4226a2018-08-29 22:21:32 +02005230static PyObject *
5231encode_locale_ex(PyObject *self, PyObject *args)
5232{
5233 PyObject *unicode;
5234 int current_locale = 0;
5235 wchar_t *wstr;
5236 PyObject *res = NULL;
5237 const char *errors = NULL;
5238
5239 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5240 return NULL;
5241 }
5242 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5243 if (wstr == NULL) {
5244 return NULL;
5245 }
5246 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5247
5248 char *str = NULL;
5249 size_t error_pos;
5250 const char *reason = NULL;
5251 int ret = _Py_EncodeLocaleEx(wstr,
5252 &str, &error_pos, &reason,
5253 current_locale, error_handler);
5254 PyMem_Free(wstr);
5255
5256 switch(ret) {
5257 case 0:
5258 res = PyBytes_FromString(str);
5259 PyMem_RawFree(str);
5260 break;
5261 case -1:
5262 PyErr_NoMemory();
5263 break;
5264 case -2:
5265 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5266 error_pos, reason);
5267 break;
5268 case -3:
5269 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5270 break;
5271 default:
Miss Islington (bot)5afc5bb2021-10-07 01:55:18 -07005272 PyErr_SetString(PyExc_ValueError, "unknown error code");
Victor Stinner3d4226a2018-08-29 22:21:32 +02005273 break;
5274 }
5275 return res;
5276}
5277
5278
5279static PyObject *
5280decode_locale_ex(PyObject *self, PyObject *args)
5281{
5282 char *str;
5283 int current_locale = 0;
5284 PyObject *res = NULL;
5285 const char *errors = NULL;
5286
5287 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5288 return NULL;
5289 }
5290 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5291
5292 wchar_t *wstr = NULL;
5293 size_t wlen = 0;
5294 const char *reason = NULL;
5295 int ret = _Py_DecodeLocaleEx(str,
5296 &wstr, &wlen, &reason,
5297 current_locale, error_handler);
5298
5299 switch(ret) {
5300 case 0:
5301 res = PyUnicode_FromWideChar(wstr, wlen);
5302 PyMem_RawFree(wstr);
5303 break;
5304 case -1:
5305 PyErr_NoMemory();
5306 break;
5307 case -2:
5308 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5309 wlen, reason);
5310 break;
5311 case -3:
5312 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5313 break;
5314 default:
Miss Islington (bot)5afc5bb2021-10-07 01:55:18 -07005315 PyErr_SetString(PyExc_ValueError, "unknown error code");
Victor Stinner3d4226a2018-08-29 22:21:32 +02005316 break;
5317 }
5318 return res;
5319}
5320
5321
Victor Stinner18618e652018-10-25 17:28:11 +02005322#ifdef Py_REF_DEBUG
5323static PyObject *
5324negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5325{
5326 PyObject *obj = PyUnicode_FromString("negative_refcount");
5327 if (obj == NULL) {
5328 return NULL;
5329 }
5330 assert(Py_REFCNT(obj) == 1);
5331
Victor Stinnerc86a1122020-02-07 01:24:29 +01005332 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005333 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5334 Py_DECREF(obj);
5335
5336 Py_RETURN_NONE;
5337}
5338#endif
5339
5340
Victor Stinneref9d9b62019-05-22 11:28:22 +02005341static PyObject*
5342test_write_unraisable_exc(PyObject *self, PyObject *args)
5343{
Victor Stinner71c52e32019-05-27 08:57:14 +02005344 PyObject *exc, *err_msg, *obj;
5345 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005346 return NULL;
5347 }
5348
Victor Stinner71c52e32019-05-27 08:57:14 +02005349 const char *err_msg_utf8;
5350 if (err_msg != Py_None) {
5351 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5352 if (err_msg_utf8 == NULL) {
5353 return NULL;
5354 }
5355 }
5356 else {
5357 err_msg_utf8 = NULL;
5358 }
5359
Victor Stinneref9d9b62019-05-22 11:28:22 +02005360 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005361 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005362 Py_RETURN_NONE;
5363}
5364
5365
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005366static PyObject *
5367sequence_getitem(PyObject *self, PyObject *args)
5368{
5369 PyObject *seq;
5370 Py_ssize_t i;
5371 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5372 return NULL;
5373 }
5374 return PySequence_GetItem(seq, i);
5375}
5376
5377
Petr Viktorinf9583772019-09-10 12:21:09 +01005378/* Functions for testing C calling conventions (METH_*) are named meth_*,
5379 * e.g. "meth_varargs" for METH_VARARGS.
5380 *
5381 * They all return a tuple of their C-level arguments, with None instead
5382 * of NULL and Python tuples instead of C arrays.
5383 */
5384
5385
5386static PyObject*
5387_null_to_none(PyObject* obj)
5388{
5389 if (obj == NULL) {
5390 Py_RETURN_NONE;
5391 }
5392 Py_INCREF(obj);
5393 return obj;
5394}
5395
5396static PyObject*
5397meth_varargs(PyObject* self, PyObject* args)
5398{
5399 return Py_BuildValue("NO", _null_to_none(self), args);
5400}
5401
5402static PyObject*
5403meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5404{
5405 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5406}
5407
5408static PyObject*
5409meth_o(PyObject* self, PyObject* obj)
5410{
5411 return Py_BuildValue("NO", _null_to_none(self), obj);
5412}
5413
5414static PyObject*
5415meth_noargs(PyObject* self, PyObject* ignored)
5416{
5417 return _null_to_none(self);
5418}
5419
5420static PyObject*
5421_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5422{
5423 PyObject *tuple = PyTuple_New(nargs);
5424 if (tuple == NULL) {
5425 return NULL;
5426 }
5427 for (Py_ssize_t i=0; i < nargs; i++) {
5428 Py_INCREF(args[i]);
5429 PyTuple_SET_ITEM(tuple, i, args[i]);
5430 }
5431 return tuple;
5432}
5433
5434static PyObject*
5435meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5436{
5437 return Py_BuildValue(
5438 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5439 );
5440}
5441
5442static PyObject*
5443meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5444 Py_ssize_t nargs, PyObject* kwargs)
5445{
5446 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5447 if (pyargs == NULL) {
5448 return NULL;
5449 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005450 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005451 args + nargs, 0, kwargs);
5452 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5453}
5454
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005455
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005456static PyObject*
5457pynumber_tobase(PyObject *module, PyObject *args)
5458{
5459 PyObject *obj;
5460 int base;
5461 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5462 &obj, &base)) {
5463 return NULL;
5464 }
5465 return PyNumber_ToBase(obj, base);
5466}
5467
5468
Victor Stinner0e2ac212020-11-18 18:48:06 +01005469static PyObject*
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005470test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0e2ac212020-11-18 18:48:06 +01005471{
5472 PyObject *obj = PyList_New(0);
5473 if (obj == NULL) {
5474 return NULL;
5475 }
5476
5477 // Ensure that following tests don't modify the object,
5478 // to ensure that Py_DECREF() will not crash.
5479 assert(Py_TYPE(obj) == &PyList_Type);
5480 assert(Py_SIZE(obj) == 0);
5481
5482 // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5483 // as l-values to set an object type and size.
5484 Py_TYPE(obj) = &PyList_Type;
5485 Py_SIZE(obj) = 0;
5486
5487 Py_DECREF(obj);
5488 Py_RETURN_NONE;
5489}
5490
5491
Victor Stinner09bbebe2021-04-11 00:17:39 +02005492#define TEST_REFCOUNT() \
5493 do { \
5494 PyObject *obj = PyList_New(0); \
5495 if (obj == NULL) { \
5496 return NULL; \
5497 } \
5498 assert(Py_REFCNT(obj) == 1); \
5499 \
5500 /* test Py_NewRef() */ \
5501 PyObject *ref = Py_NewRef(obj); \
5502 assert(ref == obj); \
5503 assert(Py_REFCNT(obj) == 2); \
5504 Py_DECREF(ref); \
5505 \
5506 /* test Py_XNewRef() */ \
5507 PyObject *xref = Py_XNewRef(obj); \
5508 assert(xref == obj); \
5509 assert(Py_REFCNT(obj) == 2); \
5510 Py_DECREF(xref); \
5511 \
5512 assert(Py_XNewRef(NULL) == NULL); \
5513 \
5514 Py_DECREF(obj); \
5515 Py_RETURN_NONE; \
5516 } while (0) \
5517
5518
5519// Test Py_NewRef() and Py_XNewRef() macros
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005520static PyObject*
Victor Stinner09bbebe2021-04-11 00:17:39 +02005521test_refcount_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005522{
Victor Stinner09bbebe2021-04-11 00:17:39 +02005523 TEST_REFCOUNT();
5524}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005525
Victor Stinner09bbebe2021-04-11 00:17:39 +02005526#undef Py_NewRef
5527#undef Py_XNewRef
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005528
Victor Stinner09bbebe2021-04-11 00:17:39 +02005529// Test Py_NewRef() and Py_XNewRef() functions, after undefining macros.
5530static PyObject*
5531test_refcount_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5532{
5533 TEST_REFCOUNT();
5534}
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005535
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005536
Victor Stinner09bbebe2021-04-11 00:17:39 +02005537// Test Py_Is() function
5538#define TEST_PY_IS() \
5539 do { \
5540 PyObject *o_none = Py_None; \
5541 PyObject *o_true = Py_True; \
5542 PyObject *o_false = Py_False; \
5543 PyObject *obj = PyList_New(0); \
5544 if (obj == NULL) { \
5545 return NULL; \
5546 } \
5547 \
5548 /* test Py_Is() */ \
5549 assert(Py_Is(obj, obj)); \
5550 assert(!Py_Is(obj, o_none)); \
5551 \
5552 /* test Py_None */ \
5553 assert(Py_Is(o_none, o_none)); \
5554 assert(!Py_Is(obj, o_none)); \
5555 \
5556 /* test Py_True */ \
5557 assert(Py_Is(o_true, o_true)); \
5558 assert(!Py_Is(o_false, o_true)); \
5559 assert(!Py_Is(obj, o_true)); \
5560 \
5561 /* test Py_False */ \
5562 assert(Py_Is(o_false, o_false)); \
5563 assert(!Py_Is(o_true, o_false)); \
5564 assert(!Py_Is(obj, o_false)); \
5565 \
5566 Py_DECREF(obj); \
5567 Py_RETURN_NONE; \
5568 } while (0)
5569
5570// Test Py_Is() macro
5571static PyObject*
5572test_py_is_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
5573{
5574 TEST_PY_IS();
5575}
5576
5577#undef Py_Is
5578
5579// Test Py_Is() function, after undefining its macro.
5580static PyObject*
5581test_py_is_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5582{
5583 TEST_PY_IS();
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005584}
5585
5586
Victor Stinnere2320252021-01-18 18:24:29 +01005587static PyObject *
5588test_fatal_error(PyObject *self, PyObject *args)
5589{
5590 char *message;
5591 int release_gil = 0;
5592 if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
5593 return NULL;
5594 if (release_gil) {
5595 Py_BEGIN_ALLOW_THREADS
5596 Py_FatalError(message);
5597 Py_END_ALLOW_THREADS
5598 }
5599 else {
5600 Py_FatalError(message);
5601 }
5602 // Py_FatalError() does not return, but exits the process.
5603 Py_RETURN_NONE;
5604}
5605
5606
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005607static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5608static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
Victor Stinnere2320252021-01-18 18:24:29 +01005609
Tim Peters9ea17ac2001-02-02 05:57:15 +00005610static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305612 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005613 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305614 {"test_config", test_config, METH_NOARGS},
5615 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005616 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005617 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5618 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5619 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5620 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5621 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5622 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005623 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005624 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005625 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5626 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5627 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5628 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5629 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5630 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005631 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5632 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005633 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5634 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5635 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5636 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
scoder3cc481b2021-04-28 18:12:16 +02005637 {"test_gc_control", test_gc_control, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305638 {"test_list_api", test_list_api, METH_NOARGS},
5639 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005640 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005641 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305642 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5643 {"test_long_api", test_long_api, METH_NOARGS},
5644 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5645 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5646 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5647 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005648 {"test_structseq_newtype_doesnt_leak",
5649 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Miss Islington (bot)912ef3f2021-05-04 05:29:56 -07005650 {"test_structseq_newtype_null_descr_doc",
5651 test_structseq_newtype_null_descr_doc, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305652 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5653 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5654 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5655 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005656 {"test_long_as_unsigned_long_long_mask",
5657 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305658 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5659 {"test_k_code", test_k_code, METH_NOARGS},
5660 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005661 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Miss Islington (bot)6ff7fef2021-08-23 12:30:21 -07005662 {"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
5663 {"pyobject_str_from_null", pyobject_str_from_null, METH_NOARGS},
5664 {"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305666 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305668 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5669 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5670 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005672 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005673#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005674 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005675#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005676 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005677 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005678 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005679 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Hai Shia13b26c2020-11-11 04:53:46 +08005680 {"get_args", get_args, METH_VARARGS},
5681 {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
5682 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
5683 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005685 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005687 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005688 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005689 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005690 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005691 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 {"getargs_b", getargs_b, METH_VARARGS},
5693 {"getargs_B", getargs_B, METH_VARARGS},
5694 {"getargs_h", getargs_h, METH_VARARGS},
5695 {"getargs_H", getargs_H, METH_VARARGS},
5696 {"getargs_I", getargs_I, METH_VARARGS},
5697 {"getargs_k", getargs_k, METH_VARARGS},
5698 {"getargs_i", getargs_i, METH_VARARGS},
5699 {"getargs_l", getargs_l, METH_VARARGS},
5700 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005701 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 {"getargs_L", getargs_L, METH_VARARGS},
5703 {"getargs_K", getargs_K, METH_VARARGS},
5704 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305705 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5706 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005707 {"getargs_f", getargs_f, METH_VARARGS},
5708 {"getargs_d", getargs_d, METH_VARARGS},
5709 {"getargs_D", getargs_D, METH_VARARGS},
5710 {"getargs_S", getargs_S, METH_VARARGS},
5711 {"getargs_Y", getargs_Y, METH_VARARGS},
5712 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005713 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005714 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005715 {"getargs_s", getargs_s, METH_VARARGS},
5716 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5717 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
Miss Islington (bot)569ca812021-05-06 20:18:42 -07005718 {"getargs_s_hash_int", (PyCFunction)(void(*)(void))getargs_s_hash_int,
5719 METH_VARARGS|METH_KEYWORDS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005720 {"getargs_z", getargs_z, METH_VARARGS},
5721 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5722 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5723 {"getargs_y", getargs_y, METH_VARARGS},
5724 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5725 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5726 {"getargs_u", getargs_u, METH_VARARGS},
5727 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5728 {"getargs_Z", getargs_Z, METH_VARARGS},
5729 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005730 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005731 {"getargs_es", getargs_es, METH_VARARGS},
5732 {"getargs_et", getargs_et, METH_VARARGS},
5733 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5734 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005736 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005738 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305739 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005740#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305741 {"test_u_code", test_u_code, METH_NOARGS},
5742 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005743#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305744 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005745 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5746 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005747 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005748 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5749 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005750 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005751 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005752#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005753 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5754 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005755 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005756#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005757 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005759#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005760 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005761#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005762 {"traceback_print", traceback_print, METH_VARARGS},
5763 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005764 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005765 {"argparsing", argparsing, METH_VARARGS},
5766 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005767 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305769 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005770 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305771 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005772 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005773 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5774 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005775 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005776 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005777 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305778 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5779 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5780 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5781 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005782 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5783 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305784 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005785 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005786 {"no_docstring",
5787 (PyCFunction)test_with_docstring, METH_NOARGS},
5788 {"docstring_empty",
5789 (PyCFunction)test_with_docstring, METH_NOARGS,
5790 docstring_empty},
5791 {"docstring_no_signature",
5792 (PyCFunction)test_with_docstring, METH_NOARGS,
5793 docstring_no_signature},
5794 {"docstring_with_invalid_signature",
5795 (PyCFunction)test_with_docstring, METH_NOARGS,
5796 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005797 {"docstring_with_invalid_signature2",
5798 (PyCFunction)test_with_docstring, METH_NOARGS,
5799 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005800 {"docstring_with_signature",
5801 (PyCFunction)test_with_docstring, METH_NOARGS,
5802 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005803 {"docstring_with_signature_but_no_doc",
5804 (PyCFunction)test_with_docstring, METH_NOARGS,
5805 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005806 {"docstring_with_signature_and_extra_newlines",
5807 (PyCFunction)test_with_docstring, METH_NOARGS,
5808 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005809 {"docstring_with_signature_with_defaults",
5810 (PyCFunction)test_with_docstring, METH_NOARGS,
5811 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005812 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5813 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005814 {"pymarshal_write_long_to_file",
5815 pymarshal_write_long_to_file, METH_VARARGS},
5816 {"pymarshal_write_object_to_file",
5817 pymarshal_write_object_to_file, METH_VARARGS},
5818 {"pymarshal_read_short_from_file",
5819 pymarshal_read_short_from_file, METH_VARARGS},
5820 {"pymarshal_read_long_from_file",
5821 pymarshal_read_long_from_file, METH_VARARGS},
5822 {"pymarshal_read_last_object_from_file",
5823 pymarshal_read_last_object_from_file, METH_VARARGS},
5824 {"pymarshal_read_object_from_file",
5825 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01005826 {"return_null_without_error", return_null_without_error, METH_NOARGS},
5827 {"return_result_with_error", return_result_with_error, METH_NOARGS},
5828 {"getitem_with_error", getitem_with_error, METH_VARARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005829 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005830 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5831 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005832 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005833#ifdef HAVE_CLOCK_GETTIME
5834 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5835#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005836 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5837 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005838 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5839 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005840 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005841 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005842 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005843 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5844 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5845 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005846 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005847 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5848 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5849 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005850 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005851 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005852 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5853 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005854 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5855 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005856 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005857#ifdef W_STOPCODE
5858 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5859#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005860 {"get_mapping_keys", get_mapping_keys, METH_O},
5861 {"get_mapping_values", get_mapping_values, METH_O},
5862 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005863 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005864 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005865 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005866 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5867 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005868#ifdef Py_REF_DEBUG
5869 {"negative_refcount", negative_refcount, METH_NOARGS},
5870#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005871 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005872 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005873 {"meth_varargs", meth_varargs, METH_VARARGS},
5874 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5875 {"meth_o", meth_o, METH_O},
5876 {"meth_noargs", meth_noargs, METH_NOARGS},
5877 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5878 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005879 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005880 {"without_gc", without_gc, METH_O},
Victor Stinner0e2ac212020-11-18 18:48:06 +01005881 {"test_set_type_size", test_set_type_size, METH_NOARGS},
Victor Stinner09bbebe2021-04-11 00:17:39 +02005882 {"test_refcount_macros", test_refcount_macros, METH_NOARGS},
5883 {"test_refcount_funcs", test_refcount_funcs, METH_NOARGS},
5884 {"test_py_is_macros", test_py_is_macros, METH_NOARGS},
5885 {"test_py_is_funcs", test_py_is_funcs, METH_NOARGS},
Victor Stinnere2320252021-01-18 18:24:29 +01005886 {"fatal_error", test_fatal_error, METH_VARARGS,
5887 PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005889};
5890
Thomas Hellera4ea6032003-04-17 18:55:45 +00005891#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5892
Thomas Wouters89f507f2006-12-13 04:49:30 +00005893typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 char bool_member;
5895 char byte_member;
5896 unsigned char ubyte_member;
5897 short short_member;
5898 unsigned short ushort_member;
5899 int int_member;
5900 unsigned int uint_member;
5901 long long_member;
5902 unsigned long ulong_member;
5903 Py_ssize_t pyssizet_member;
5904 float float_member;
5905 double double_member;
5906 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005907 long long longlong_member;
5908 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005909} all_structmembers;
5910
5911typedef struct {
5912 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005914} test_structmembers;
5915
5916static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5918 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5919 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5920 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5921 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5922 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5923 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5924 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5925 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5926 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5927 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5928 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5929 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5931 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005933};
5934
5935
Christian Heimes1af737c2008-01-23 08:24:23 +00005936static PyObject *
5937test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 static char *keywords[] = {
5940 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5941 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5942 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005945 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 test_structmembers *ob;
5947 const char *s = NULL;
5948 Py_ssize_t string_len = 0;
5949 ob = PyObject_New(test_structmembers, type);
5950 if (ob == NULL)
5951 return NULL;
5952 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5953 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5954 &ob->structmembers.bool_member,
5955 &ob->structmembers.byte_member,
5956 &ob->structmembers.ubyte_member,
5957 &ob->structmembers.short_member,
5958 &ob->structmembers.ushort_member,
5959 &ob->structmembers.int_member,
5960 &ob->structmembers.uint_member,
5961 &ob->structmembers.long_member,
5962 &ob->structmembers.ulong_member,
5963 &ob->structmembers.pyssizet_member,
5964 &ob->structmembers.float_member,
5965 &ob->structmembers.double_member,
5966 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 , &ob->structmembers.longlong_member,
5968 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 )) {
5970 Py_DECREF(ob);
5971 return NULL;
5972 }
5973 if (s != NULL) {
5974 if (string_len > 5) {
5975 Py_DECREF(ob);
5976 PyErr_SetString(PyExc_ValueError, "string too long");
5977 return NULL;
5978 }
5979 strcpy(ob->structmembers.inplace_member, s);
5980 }
5981 else {
5982 strcpy(ob->structmembers.inplace_member, "");
5983 }
5984 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005985}
5986
Christian Heimes1af737c2008-01-23 08:24:23 +00005987static void
5988test_structmembers_free(PyObject *ob)
5989{
Victor Stinner32bd68c2020-12-01 10:37:39 +01005990 PyObject_Free(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005991}
5992
5993static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005994 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 "test_structmembersType",
5996 sizeof(test_structmembers), /* tp_basicsize */
5997 0, /* tp_itemsize */
5998 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005999 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 0, /* tp_getattr */
6001 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006002 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 0, /* tp_repr */
6004 0, /* tp_as_number */
6005 0, /* tp_as_sequence */
6006 0, /* tp_as_mapping */
6007 0, /* tp_hash */
6008 0, /* tp_call */
6009 0, /* tp_str */
6010 PyObject_GenericGetAttr, /* tp_getattro */
6011 PyObject_GenericSetAttr, /* tp_setattro */
6012 0, /* tp_as_buffer */
6013 0, /* tp_flags */
6014 "Type containing all structmember types",
6015 0, /* traverseproc tp_traverse */
6016 0, /* tp_clear */
6017 0, /* tp_richcompare */
6018 0, /* tp_weaklistoffset */
6019 0, /* tp_iter */
6020 0, /* tp_iternext */
6021 0, /* tp_methods */
6022 test_members, /* tp_members */
6023 0,
6024 0,
6025 0,
6026 0,
6027 0,
6028 0,
6029 0,
6030 0,
6031 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00006032};
6033
6034
Benjamin Petersond51374e2014-04-09 23:55:56 -04006035typedef struct {
6036 PyObject_HEAD
6037} matmulObject;
6038
6039static PyObject *
6040matmulType_matmul(PyObject *self, PyObject *other)
6041{
6042 return Py_BuildValue("(sOO)", "matmul", self, other);
6043}
6044
6045static PyObject *
6046matmulType_imatmul(PyObject *self, PyObject *other)
6047{
6048 return Py_BuildValue("(sOO)", "imatmul", self, other);
6049}
6050
6051static void
6052matmulType_dealloc(PyObject *self)
6053{
Zachary Ware420dc562014-04-23 13:51:27 -05006054 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006055}
6056
6057static PyNumberMethods matmulType_as_number = {
6058 0, /* nb_add */
6059 0, /* nb_subtract */
6060 0, /* nb_multiply */
6061 0, /* nb_remainde r*/
6062 0, /* nb_divmod */
6063 0, /* nb_power */
6064 0, /* nb_negative */
6065 0, /* tp_positive */
6066 0, /* tp_absolute */
6067 0, /* tp_bool */
6068 0, /* nb_invert */
6069 0, /* nb_lshift */
6070 0, /* nb_rshift */
6071 0, /* nb_and */
6072 0, /* nb_xor */
6073 0, /* nb_or */
6074 0, /* nb_int */
6075 0, /* nb_reserved */
6076 0, /* nb_float */
6077 0, /* nb_inplace_add */
6078 0, /* nb_inplace_subtract */
6079 0, /* nb_inplace_multiply */
6080 0, /* nb_inplace_remainder */
6081 0, /* nb_inplace_power */
6082 0, /* nb_inplace_lshift */
6083 0, /* nb_inplace_rshift */
6084 0, /* nb_inplace_and */
6085 0, /* nb_inplace_xor */
6086 0, /* nb_inplace_or */
6087 0, /* nb_floor_divide */
6088 0, /* nb_true_divide */
6089 0, /* nb_inplace_floor_divide */
6090 0, /* nb_inplace_true_divide */
6091 0, /* nb_index */
6092 matmulType_matmul, /* nb_matrix_multiply */
6093 matmulType_imatmul /* nb_matrix_inplace_multiply */
6094};
6095
6096static PyTypeObject matmulType = {
6097 PyVarObject_HEAD_INIT(NULL, 0)
6098 "matmulType",
6099 sizeof(matmulObject), /* tp_basicsize */
6100 0, /* tp_itemsize */
6101 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006102 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006103 0, /* tp_getattr */
6104 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006105 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006106 0, /* tp_repr */
6107 &matmulType_as_number, /* tp_as_number */
6108 0, /* tp_as_sequence */
6109 0, /* tp_as_mapping */
6110 0, /* tp_hash */
6111 0, /* tp_call */
6112 0, /* tp_str */
6113 PyObject_GenericGetAttr, /* tp_getattro */
6114 PyObject_GenericSetAttr, /* tp_setattro */
6115 0, /* tp_as_buffer */
6116 0, /* tp_flags */
6117 "C level type with matrix operations defined",
6118 0, /* traverseproc tp_traverse */
6119 0, /* tp_clear */
6120 0, /* tp_richcompare */
6121 0, /* tp_weaklistoffset */
6122 0, /* tp_iter */
6123 0, /* tp_iternext */
6124 0, /* tp_methods */
6125 0, /* tp_members */
6126 0,
6127 0,
6128 0,
6129 0,
6130 0,
6131 0,
6132 0,
6133 0,
6134 PyType_GenericNew, /* tp_new */
6135 PyObject_Del, /* tp_free */
6136};
6137
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006138typedef struct {
6139 PyObject_HEAD
6140} ipowObject;
6141
6142static PyObject *
6143ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6144{
6145 return Py_BuildValue("OO", other, mod);
6146}
6147
6148static PyNumberMethods ipowType_as_number = {
6149 .nb_inplace_power = ipowType_ipow
6150};
6151
6152static PyTypeObject ipowType = {
6153 PyVarObject_HEAD_INIT(NULL, 0)
6154 .tp_name = "ipowType",
6155 .tp_basicsize = sizeof(ipowObject),
6156 .tp_as_number = &ipowType_as_number,
6157 .tp_new = PyType_GenericNew
6158};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006159
Yury Selivanov75445082015-05-11 22:57:16 -04006160typedef struct {
6161 PyObject_HEAD
6162 PyObject *ao_iterator;
6163} awaitObject;
6164
6165
6166static PyObject *
6167awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6168{
6169 PyObject *v;
6170 awaitObject *ao;
6171
6172 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6173 return NULL;
6174
6175 ao = (awaitObject *)type->tp_alloc(type, 0);
6176 if (ao == NULL) {
6177 return NULL;
6178 }
6179
6180 Py_INCREF(v);
6181 ao->ao_iterator = v;
6182
6183 return (PyObject *)ao;
6184}
6185
6186
6187static void
6188awaitObject_dealloc(awaitObject *ao)
6189{
6190 Py_CLEAR(ao->ao_iterator);
6191 Py_TYPE(ao)->tp_free(ao);
6192}
6193
6194
6195static PyObject *
6196awaitObject_await(awaitObject *ao)
6197{
6198 Py_INCREF(ao->ao_iterator);
6199 return ao->ao_iterator;
6200}
6201
6202static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006203 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006204 0, /* am_aiter */
Vladimir Matveev1e996c32020-11-10 12:09:55 -08006205 0, /* am_anext */
6206 0, /* am_send */
Yury Selivanov75445082015-05-11 22:57:16 -04006207};
6208
6209
6210static PyTypeObject awaitType = {
6211 PyVarObject_HEAD_INIT(NULL, 0)
6212 "awaitType",
6213 sizeof(awaitObject), /* tp_basicsize */
6214 0, /* tp_itemsize */
6215 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006216 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006217 0, /* tp_getattr */
6218 0, /* tp_setattr */
6219 &awaitType_as_async, /* tp_as_async */
6220 0, /* tp_repr */
6221 0, /* tp_as_number */
6222 0, /* tp_as_sequence */
6223 0, /* tp_as_mapping */
6224 0, /* tp_hash */
6225 0, /* tp_call */
6226 0, /* tp_str */
6227 PyObject_GenericGetAttr, /* tp_getattro */
6228 PyObject_GenericSetAttr, /* tp_setattro */
6229 0, /* tp_as_buffer */
6230 0, /* tp_flags */
6231 "C level type with tp_as_async",
6232 0, /* traverseproc tp_traverse */
6233 0, /* tp_clear */
6234 0, /* tp_richcompare */
6235 0, /* tp_weaklistoffset */
6236 0, /* tp_iter */
6237 0, /* tp_iternext */
6238 0, /* tp_methods */
6239 0, /* tp_members */
6240 0,
6241 0,
6242 0,
6243 0,
6244 0,
6245 0,
6246 0,
6247 0,
6248 awaitObject_new, /* tp_new */
6249 PyObject_Del, /* tp_free */
6250};
6251
6252
xdegaye56d1f5c2017-10-26 15:09:06 +02006253static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6254
6255static PyTypeObject PyRecursingInfinitelyError_Type = {
6256 PyVarObject_HEAD_INIT(NULL, 0)
6257 "RecursingInfinitelyError", /* tp_name */
6258 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6259 0, /* tp_itemsize */
6260 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006261 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006262 0, /* tp_getattr */
6263 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006264 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006265 0, /* tp_repr */
6266 0, /* tp_as_number */
6267 0, /* tp_as_sequence */
6268 0, /* tp_as_mapping */
6269 0, /* tp_hash */
6270 0, /* tp_call */
6271 0, /* tp_str */
6272 0, /* tp_getattro */
6273 0, /* tp_setattro */
6274 0, /* tp_as_buffer */
6275 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6276 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6277 0, /* tp_traverse */
6278 0, /* tp_clear */
6279 0, /* tp_richcompare */
6280 0, /* tp_weaklistoffset */
6281 0, /* tp_iter */
6282 0, /* tp_iternext */
6283 0, /* tp_methods */
6284 0, /* tp_members */
6285 0, /* tp_getset */
6286 0, /* tp_base */
6287 0, /* tp_dict */
6288 0, /* tp_descr_get */
6289 0, /* tp_descr_set */
6290 0, /* tp_dictoffset */
6291 (initproc)recurse_infinitely_error_init, /* tp_init */
6292 0, /* tp_alloc */
6293 0, /* tp_new */
6294};
6295
6296static int
6297recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6298{
6299 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6300
6301 /* Instantiating this exception starts infinite recursion. */
6302 Py_INCREF(type);
6303 PyErr_SetObject(type, NULL);
6304 return -1;
6305}
6306
6307
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006308/* Test bpo-35983: create a subclass of "list" which checks that instances
6309 * are not deallocated twice */
6310
6311typedef struct {
6312 PyListObject list;
6313 int deallocated;
6314} MyListObject;
6315
6316static PyObject *
6317MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6318{
6319 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6320 ((MyListObject*)op)->deallocated = 0;
6321 return op;
6322}
6323
6324void
6325MyList_dealloc(MyListObject* op)
6326{
6327 if (op->deallocated) {
6328 /* We cannot raise exceptions here but we still want the testsuite
6329 * to fail when we hit this */
6330 Py_FatalError("MyList instance deallocated twice");
6331 }
6332 op->deallocated = 1;
6333 PyList_Type.tp_dealloc((PyObject *)op);
6334}
6335
6336static PyTypeObject MyList_Type = {
6337 PyVarObject_HEAD_INIT(NULL, 0)
6338 "MyList",
6339 sizeof(MyListObject),
6340 0,
6341 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006342 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006343 0, /* tp_getattr */
6344 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006345 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006346 0, /* tp_repr */
6347 0, /* tp_as_number */
6348 0, /* tp_as_sequence */
6349 0, /* tp_as_mapping */
6350 0, /* tp_hash */
6351 0, /* tp_call */
6352 0, /* tp_str */
6353 0, /* tp_getattro */
6354 0, /* tp_setattro */
6355 0, /* tp_as_buffer */
6356 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6357 0, /* tp_doc */
6358 0, /* tp_traverse */
6359 0, /* tp_clear */
6360 0, /* tp_richcompare */
6361 0, /* tp_weaklistoffset */
6362 0, /* tp_iter */
6363 0, /* tp_iternext */
6364 0, /* tp_methods */
6365 0, /* tp_members */
6366 0, /* tp_getset */
6367 0, /* &PyList_Type */ /* tp_base */
6368 0, /* tp_dict */
6369 0, /* tp_descr_get */
6370 0, /* tp_descr_set */
6371 0, /* tp_dictoffset */
6372 0, /* tp_init */
6373 0, /* tp_alloc */
6374 MyList_new, /* tp_new */
6375};
6376
6377
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006378/* Test PEP 560 */
6379
6380typedef struct {
6381 PyObject_HEAD
6382 PyObject *item;
6383} PyGenericAliasObject;
6384
6385static void
6386generic_alias_dealloc(PyGenericAliasObject *self)
6387{
6388 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006389 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006390}
6391
6392static PyObject *
6393generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6394{
6395 return PyTuple_Pack(1, self->item);
6396}
6397
6398static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006399 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006400 {NULL} /* sentinel */
6401};
6402
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006403static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006404 PyVarObject_HEAD_INIT(NULL, 0)
6405 "GenericAlias",
6406 sizeof(PyGenericAliasObject),
6407 0,
6408 .tp_dealloc = (destructor)generic_alias_dealloc,
6409 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6410 .tp_methods = generic_alias_methods,
6411};
6412
6413static PyObject *
6414generic_alias_new(PyObject *item)
6415{
6416 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6417 if (o == NULL) {
6418 return NULL;
6419 }
6420 Py_INCREF(item);
6421 o->item = item;
6422 return (PyObject*) o;
6423}
6424
6425typedef struct {
6426 PyObject_HEAD
6427} PyGenericObject;
6428
6429static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006430generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006431{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006432 return generic_alias_new(item);
6433}
6434
6435static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006436 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006437 {NULL} /* sentinel */
6438};
6439
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006440static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006441 PyVarObject_HEAD_INIT(NULL, 0)
6442 "Generic",
6443 sizeof(PyGenericObject),
6444 0,
6445 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6446 .tp_methods = generic_methods,
6447};
6448
6449
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006450/* Test PEP 590 */
6451
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006452typedef struct {
6453 PyObject_HEAD
6454 vectorcallfunc vectorcall;
6455} MethodDescriptorObject;
6456
6457static PyObject *
6458MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6459 size_t nargsf, PyObject *kwnames)
6460{
6461 /* True if using the vectorcall function in MethodDescriptorObject
6462 * but False for MethodDescriptor2Object */
6463 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6464 return PyBool_FromLong(md->vectorcall != NULL);
6465}
6466
6467static PyObject *
6468MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6469{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006470 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006471 op->vectorcall = MethodDescriptor_vectorcall;
6472 return (PyObject *)op;
6473}
6474
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006475static PyObject *
6476func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6477{
6478 if (obj == Py_None || obj == NULL) {
6479 Py_INCREF(func);
6480 return func;
6481 }
6482 return PyMethod_New(func, obj);
6483}
6484
6485static PyObject *
6486nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6487{
6488 Py_INCREF(func);
6489 return func;
6490}
6491
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006492static PyObject *
6493call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6494{
6495 Py_INCREF(args);
6496 return args;
6497}
6498
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006499static PyTypeObject MethodDescriptorBase_Type = {
6500 PyVarObject_HEAD_INIT(NULL, 0)
6501 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006502 sizeof(MethodDescriptorObject),
6503 .tp_new = MethodDescriptor_new,
6504 .tp_call = PyVectorcall_Call,
6505 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6506 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006507 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006508 .tp_descr_get = func_descr_get,
6509};
6510
6511static PyTypeObject MethodDescriptorDerived_Type = {
6512 PyVarObject_HEAD_INIT(NULL, 0)
6513 "MethodDescriptorDerived",
6514 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6515};
6516
6517static PyTypeObject MethodDescriptorNopGet_Type = {
6518 PyVarObject_HEAD_INIT(NULL, 0)
6519 "MethodDescriptorNopGet",
6520 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006521 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006522 .tp_descr_get = nop_descr_get,
6523};
6524
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006525typedef struct {
6526 MethodDescriptorObject base;
6527 vectorcallfunc vectorcall;
6528} MethodDescriptor2Object;
6529
6530static PyObject *
6531MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6532{
6533 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6534 op->base.vectorcall = NULL;
6535 op->vectorcall = MethodDescriptor_vectorcall;
6536 return (PyObject *)op;
6537}
6538
6539static PyTypeObject MethodDescriptor2_Type = {
6540 PyVarObject_HEAD_INIT(NULL, 0)
6541 "MethodDescriptor2",
6542 sizeof(MethodDescriptor2Object),
6543 .tp_new = MethodDescriptor2_new,
6544 .tp_call = PyVectorcall_Call,
6545 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006546 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006547};
6548
Benjamin Peterson39403332020-09-02 11:29:06 -05006549PyDoc_STRVAR(heapdocctype__doc__,
6550"HeapDocCType(arg1, arg2)\n"
6551"--\n"
6552"\n"
6553"somedoc");
6554
6555typedef struct {
6556 PyObject_HEAD
6557} HeapDocCTypeObject;
6558
6559static PyType_Slot HeapDocCType_slots[] = {
6560 {Py_tp_doc, (char*)heapdocctype__doc__},
6561 {0},
6562};
6563
6564static PyType_Spec HeapDocCType_spec = {
6565 "_testcapi.HeapDocCType",
6566 sizeof(HeapDocCTypeObject),
6567 0,
6568 Py_TPFLAGS_DEFAULT,
6569 HeapDocCType_slots
6570};
6571
Hai Shi88c2cfd2020-11-07 00:04:47 +08006572typedef struct {
6573 PyObject_HEAD
6574} NullTpDocTypeObject;
6575
6576static PyType_Slot NullTpDocType_slots[] = {
6577 {Py_tp_doc, NULL},
6578 {0, 0},
6579};
6580
6581static PyType_Spec NullTpDocType_spec = {
6582 "_testcapi.NullTpDocType",
6583 sizeof(NullTpDocTypeObject),
6584 0,
6585 Py_TPFLAGS_DEFAULT,
6586 NullTpDocType_slots
6587};
6588
Benjamin Peterson39403332020-09-02 11:29:06 -05006589
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006590PyDoc_STRVAR(heapgctype__doc__,
6591"A heap type with GC, and with overridden dealloc.\n\n"
6592"The 'value' attribute is set to 10 in __init__.");
6593
6594typedef struct {
6595 PyObject_HEAD
6596 int value;
6597} HeapCTypeObject;
6598
6599static struct PyMemberDef heapctype_members[] = {
6600 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6601 {NULL} /* Sentinel */
6602};
6603
6604static int
6605heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6606{
6607 ((HeapCTypeObject *)self)->value = 10;
6608 return 0;
6609}
6610
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006611static int
6612heapgcctype_traverse(HeapCTypeObject *self, visitproc visit, void *arg)
6613{
6614 Py_VISIT(Py_TYPE(self));
6615 return 0;
6616}
6617
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006618static void
6619heapgcctype_dealloc(HeapCTypeObject *self)
6620{
6621 PyTypeObject *tp = Py_TYPE(self);
6622 PyObject_GC_UnTrack(self);
6623 PyObject_GC_Del(self);
6624 Py_DECREF(tp);
6625}
6626
6627static PyType_Slot HeapGcCType_slots[] = {
6628 {Py_tp_init, heapctype_init},
6629 {Py_tp_members, heapctype_members},
6630 {Py_tp_dealloc, heapgcctype_dealloc},
Miss Islington (bot)7fe9cad2021-05-31 04:25:47 -07006631 {Py_tp_traverse, heapgcctype_traverse},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006632 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006633 {0, 0},
6634};
6635
6636static PyType_Spec HeapGcCType_spec = {
6637 "_testcapi.HeapGcCType",
6638 sizeof(HeapCTypeObject),
6639 0,
6640 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6641 HeapGcCType_slots
6642};
6643
6644PyDoc_STRVAR(heapctype__doc__,
6645"A heap type without GC, but with overridden dealloc.\n\n"
6646"The 'value' attribute is set to 10 in __init__.");
6647
6648static void
6649heapctype_dealloc(HeapCTypeObject *self)
6650{
6651 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006652 PyObject_Free(self);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006653 Py_DECREF(tp);
6654}
6655
6656static PyType_Slot HeapCType_slots[] = {
6657 {Py_tp_init, heapctype_init},
6658 {Py_tp_members, heapctype_members},
6659 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006660 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006661 {0, 0},
6662};
6663
6664static PyType_Spec HeapCType_spec = {
6665 "_testcapi.HeapCType",
6666 sizeof(HeapCTypeObject),
6667 0,
6668 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6669 HeapCType_slots
6670};
6671
6672PyDoc_STRVAR(heapctypesubclass__doc__,
6673"Subclass of HeapCType, without GC.\n\n"
6674"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6675
6676typedef struct {
6677 HeapCTypeObject base;
6678 int value2;
6679} HeapCTypeSubclassObject;
6680
6681static int
6682heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6683{
6684 /* Call __init__ of the superclass */
6685 if (heapctype_init(self, args, kwargs) < 0) {
6686 return -1;
6687 }
6688 /* Initialize additional element */
6689 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6690 return 0;
6691}
6692
6693static struct PyMemberDef heapctypesubclass_members[] = {
6694 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6695 {NULL} /* Sentinel */
6696};
6697
6698static PyType_Slot HeapCTypeSubclass_slots[] = {
6699 {Py_tp_init, heapctypesubclass_init},
6700 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006701 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006702 {0, 0},
6703};
6704
6705static PyType_Spec HeapCTypeSubclass_spec = {
6706 "_testcapi.HeapCTypeSubclass",
6707 sizeof(HeapCTypeSubclassObject),
6708 0,
6709 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6710 HeapCTypeSubclass_slots
6711};
6712
scoderf7c4e232020-06-06 21:35:10 +02006713PyDoc_STRVAR(heapctypewithbuffer__doc__,
6714"Heap type with buffer support.\n\n"
6715"The buffer is set to [b'1', b'2', b'3', b'4']");
6716
6717typedef struct {
6718 HeapCTypeObject base;
6719 char buffer[4];
6720} HeapCTypeWithBufferObject;
6721
6722static int
6723heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6724{
6725 self->buffer[0] = '1';
6726 self->buffer[1] = '2';
6727 self->buffer[2] = '3';
6728 self->buffer[3] = '4';
6729 return PyBuffer_FillInfo(
6730 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6731}
6732
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006733static void
scoderf7c4e232020-06-06 21:35:10 +02006734heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6735{
6736 assert(view->obj == (void*) self);
6737}
6738
6739static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6740 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6741 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6742 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6743 {0, 0},
6744};
6745
6746static PyType_Spec HeapCTypeWithBuffer_spec = {
6747 "_testcapi.HeapCTypeWithBuffer",
6748 sizeof(HeapCTypeWithBufferObject),
6749 0,
6750 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6751 HeapCTypeWithBuffer_slots
6752};
6753
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006754PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6755"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6756"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6757"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6758
6759static int
6760heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6761{
6762 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6763 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6764 base_init(self, args, kwargs);
6765 return 0;
6766}
6767
6768static void
6769heapctypesubclasswithfinalizer_finalize(PyObject *self)
6770{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006771 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006772 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006773
6774 /* Save the current exception, if any. */
6775 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6776
6777 m = PyState_FindModule(&_testcapimodule);
6778 if (m == NULL) {
6779 goto cleanup_finalize;
6780 }
6781 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6782 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6783 if (oldtype == NULL || newtype == NULL) {
6784 goto cleanup_finalize;
6785 }
6786
6787 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6788 goto cleanup_finalize;
6789 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006790 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6791 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006792 goto cleanup_finalize;
6793 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006794 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6795 goto cleanup_finalize;
6796 }
6797 Py_DECREF(refcnt);
6798 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6799 if (refcnt == NULL) {
6800 goto cleanup_finalize;
6801 }
6802 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006803 goto cleanup_finalize;
6804 }
6805
6806cleanup_finalize:
6807 Py_XDECREF(oldtype);
6808 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006809 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006810
6811 /* Restore the saved exception. */
6812 PyErr_Restore(error_type, error_value, error_traceback);
6813}
6814
6815static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6816 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6817 {Py_tp_members, heapctypesubclass_members},
6818 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006819 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006820 {0, 0},
6821};
6822
6823static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6824 "_testcapi.HeapCTypeSubclassWithFinalizer",
6825 sizeof(HeapCTypeSubclassObject),
6826 0,
6827 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6828 HeapCTypeSubclassWithFinalizer_slots
6829};
6830
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006831typedef struct {
6832 PyObject_HEAD
6833 PyObject *dict;
6834} HeapCTypeWithDictObject;
6835
6836static void
6837heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6838{
6839
6840 PyTypeObject *tp = Py_TYPE(self);
6841 Py_XDECREF(self->dict);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006842 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006843 Py_DECREF(tp);
6844}
6845
6846static PyGetSetDef heapctypewithdict_getsetlist[] = {
6847 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6848 {NULL} /* Sentinel */
6849};
6850
6851static struct PyMemberDef heapctypewithdict_members[] = {
6852 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6853 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6854 {NULL} /* Sentinel */
6855};
6856
6857static PyType_Slot HeapCTypeWithDict_slots[] = {
6858 {Py_tp_members, heapctypewithdict_members},
6859 {Py_tp_getset, heapctypewithdict_getsetlist},
6860 {Py_tp_dealloc, heapctypewithdict_dealloc},
6861 {0, 0},
6862};
6863
6864static PyType_Spec HeapCTypeWithDict_spec = {
6865 "_testcapi.HeapCTypeWithDict",
6866 sizeof(HeapCTypeWithDictObject),
6867 0,
6868 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6869 HeapCTypeWithDict_slots
6870};
6871
6872static struct PyMemberDef heapctypewithnegativedict_members[] = {
6873 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006874 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006875 {NULL} /* Sentinel */
6876};
6877
6878static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6879 {Py_tp_members, heapctypewithnegativedict_members},
6880 {Py_tp_getset, heapctypewithdict_getsetlist},
6881 {Py_tp_dealloc, heapctypewithdict_dealloc},
6882 {0, 0},
6883};
6884
6885static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6886 "_testcapi.HeapCTypeWithNegativeDict",
6887 sizeof(HeapCTypeWithDictObject),
6888 0,
6889 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6890 HeapCTypeWithNegativeDict_slots
6891};
6892
6893typedef struct {
6894 PyObject_HEAD
6895 PyObject *weakreflist;
6896} HeapCTypeWithWeakrefObject;
6897
6898static struct PyMemberDef heapctypewithweakref_members[] = {
6899 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6900 {"__weaklistoffset__", T_PYSSIZET,
6901 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6902 {NULL} /* Sentinel */
6903};
6904
6905static void
6906heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6907{
6908
6909 PyTypeObject *tp = Py_TYPE(self);
6910 if (self->weakreflist != NULL)
6911 PyObject_ClearWeakRefs((PyObject *) self);
6912 Py_XDECREF(self->weakreflist);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006913 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006914 Py_DECREF(tp);
6915}
6916
6917static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6918 {Py_tp_members, heapctypewithweakref_members},
6919 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6920 {0, 0},
6921};
6922
6923static PyType_Spec HeapCTypeWithWeakref_spec = {
6924 "_testcapi.HeapCTypeWithWeakref",
6925 sizeof(HeapCTypeWithWeakrefObject),
6926 0,
6927 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6928 HeapCTypeWithWeakref_slots
6929};
6930
scoder148f3292020-07-03 02:09:28 +02006931PyDoc_STRVAR(heapctypesetattr__doc__,
6932"A heap type without GC, but with overridden __setattr__.\n\n"
6933"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6934
6935typedef struct {
6936 PyObject_HEAD
6937 long value;
6938} HeapCTypeSetattrObject;
6939
6940static struct PyMemberDef heapctypesetattr_members[] = {
6941 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6942 {NULL} /* Sentinel */
6943};
6944
6945static int
6946heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6947{
6948 ((HeapCTypeSetattrObject *)self)->value = 10;
6949 return 0;
6950}
6951
6952static void
6953heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6954{
6955 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006956 PyObject_Free(self);
scoder148f3292020-07-03 02:09:28 +02006957 Py_DECREF(tp);
6958}
6959
6960static int
6961heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6962{
6963 PyObject *svalue = PyUnicode_FromString("value");
6964 if (svalue == NULL)
6965 return -1;
6966 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6967 Py_DECREF(svalue);
6968 if (eq < 0)
6969 return -1;
6970 if (!eq) {
6971 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6972 }
6973 if (value == NULL) {
6974 self->value = 0;
6975 return 0;
6976 }
6977 PyObject *ivalue = PyNumber_Long(value);
6978 if (ivalue == NULL)
6979 return -1;
6980 long v = PyLong_AsLong(ivalue);
6981 Py_DECREF(ivalue);
6982 if (v == -1 && PyErr_Occurred())
6983 return -1;
6984 self->value = v;
6985 return 0;
6986}
6987
6988static PyType_Slot HeapCTypeSetattr_slots[] = {
6989 {Py_tp_init, heapctypesetattr_init},
6990 {Py_tp_members, heapctypesetattr_members},
6991 {Py_tp_setattro, heapctypesetattr_setattro},
6992 {Py_tp_dealloc, heapctypesetattr_dealloc},
6993 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6994 {0, 0},
6995};
6996
6997static PyType_Spec HeapCTypeSetattr_spec = {
6998 "_testcapi.HeapCTypeSetattr",
6999 sizeof(HeapCTypeSetattrObject),
7000 0,
7001 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7002 HeapCTypeSetattr_slots
7003};
7004
Petr Viktorinf9583772019-09-10 12:21:09 +01007005static PyMethodDef meth_instance_methods[] = {
7006 {"meth_varargs", meth_varargs, METH_VARARGS},
7007 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
7008 {"meth_o", meth_o, METH_O},
7009 {"meth_noargs", meth_noargs, METH_NOARGS},
7010 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
7011 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
7012 {NULL, NULL} /* sentinel */
7013};
7014
7015
7016static PyTypeObject MethInstance_Type = {
7017 PyVarObject_HEAD_INIT(NULL, 0)
7018 "MethInstance",
7019 sizeof(PyObject),
7020 .tp_new = PyType_GenericNew,
7021 .tp_flags = Py_TPFLAGS_DEFAULT,
7022 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01007023 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01007024 "Class with normal (instance) methods to test calling conventions"),
7025};
7026
7027static PyMethodDef meth_class_methods[] = {
7028 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
7029 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
7030 {"meth_o", meth_o, METH_O|METH_CLASS},
7031 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
7032 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
7033 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
7034 {NULL, NULL} /* sentinel */
7035};
7036
7037
7038static PyTypeObject MethClass_Type = {
7039 PyVarObject_HEAD_INIT(NULL, 0)
7040 "MethClass",
7041 sizeof(PyObject),
7042 .tp_new = PyType_GenericNew,
7043 .tp_flags = Py_TPFLAGS_DEFAULT,
7044 .tp_methods = meth_class_methods,
7045 .tp_doc = PyDoc_STR(
7046 "Class with class methods to test calling conventions"),
7047};
7048
7049static PyMethodDef meth_static_methods[] = {
7050 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
7051 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
7052 {"meth_o", meth_o, METH_O|METH_STATIC},
7053 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
7054 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
7055 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
7056 {NULL, NULL} /* sentinel */
7057};
7058
7059
7060static PyTypeObject MethStatic_Type = {
7061 PyVarObject_HEAD_INIT(NULL, 0)
7062 "MethStatic",
7063 sizeof(PyObject),
7064 .tp_new = PyType_GenericNew,
7065 .tp_flags = Py_TPFLAGS_DEFAULT,
7066 .tp_methods = meth_static_methods,
7067 .tp_doc = PyDoc_STR(
7068 "Class with static methods to test calling conventions"),
7069};
7070
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007071/* ContainerNoGC -- a simple container without GC methods */
7072
7073typedef struct {
7074 PyObject_HEAD
7075 PyObject *value;
7076} ContainerNoGCobject;
7077
7078static PyObject *
7079ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
7080{
7081 PyObject *value;
7082 char *names[] = {"value", NULL};
7083 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
7084 return NULL;
7085 }
7086 PyObject *self = type->tp_alloc(type, 0);
7087 if (self == NULL) {
7088 return NULL;
7089 }
7090 Py_INCREF(value);
7091 ((ContainerNoGCobject *)self)->value = value;
7092 return self;
7093}
7094
7095static void
7096ContainerNoGC_dealloc(ContainerNoGCobject *self)
7097{
7098 Py_DECREF(self->value);
7099 Py_TYPE(self)->tp_free((PyObject *)self);
7100}
7101
7102static PyMemberDef ContainerNoGC_members[] = {
7103 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7104 PyDoc_STR("a container value for test purposes")},
7105 {0}
7106};
7107
7108static PyTypeObject ContainerNoGC_type = {
7109 PyVarObject_HEAD_INIT(NULL, 0)
7110 "_testcapi.ContainerNoGC",
7111 sizeof(ContainerNoGCobject),
7112 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7113 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7114 .tp_members = ContainerNoGC_members,
7115 .tp_new = ContainerNoGC_new,
7116};
7117
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007118
Martin v. Löwis1a214512008-06-11 05:26:20 +00007119static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 PyModuleDef_HEAD_INIT,
7121 "_testcapi",
7122 NULL,
7123 -1,
7124 TestMethods,
7125 NULL,
7126 NULL,
7127 NULL,
7128 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007129};
7130
Nick Coghland5cacbb2015-05-23 22:24:10 +10007131/* Per PEP 489, this module will not be converted to multi-phase initialization
7132 */
7133
Mark Hammond62b1ab12002-07-23 06:31:15 +00007134PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007135PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 m = PyModule_Create(&_testcapimodule);
7140 if (m == NULL)
7141 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007142
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007143 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007144
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007145 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 Py_INCREF(&test_structmembersType);
7147 /* don't use a name starting with "test", since we don't want
7148 test_capi to automatically call this */
7149 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007150 if (PyType_Ready(&matmulType) < 0)
7151 return NULL;
7152 Py_INCREF(&matmulType);
7153 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007154 if (PyType_Ready(&ipowType) < 0) {
7155 return NULL;
7156 }
7157 Py_INCREF(&ipowType);
7158 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007159
Yury Selivanov75445082015-05-11 22:57:16 -04007160 if (PyType_Ready(&awaitType) < 0)
7161 return NULL;
7162 Py_INCREF(&awaitType);
7163 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7164
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007165 MyList_Type.tp_base = &PyList_Type;
7166 if (PyType_Ready(&MyList_Type) < 0)
7167 return NULL;
7168 Py_INCREF(&MyList_Type);
7169 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7170
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007171 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7172 return NULL;
7173 Py_INCREF(&MethodDescriptorBase_Type);
7174 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7175
7176 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7177 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7178 return NULL;
7179 Py_INCREF(&MethodDescriptorDerived_Type);
7180 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7181
7182 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7183 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7184 return NULL;
7185 Py_INCREF(&MethodDescriptorNopGet_Type);
7186 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7187
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007188 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7189 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7190 return NULL;
7191 Py_INCREF(&MethodDescriptor2_Type);
7192 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7193
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007194 if (PyType_Ready(&GenericAlias_Type) < 0)
7195 return NULL;
7196 Py_INCREF(&GenericAlias_Type);
7197 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7198
7199 if (PyType_Ready(&Generic_Type) < 0)
7200 return NULL;
7201 Py_INCREF(&Generic_Type);
7202 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7203
Petr Viktorinf9583772019-09-10 12:21:09 +01007204 if (PyType_Ready(&MethInstance_Type) < 0)
7205 return NULL;
7206 Py_INCREF(&MethInstance_Type);
7207 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7208
7209 if (PyType_Ready(&MethClass_Type) < 0)
7210 return NULL;
7211 Py_INCREF(&MethClass_Type);
7212 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7213
7214 if (PyType_Ready(&MethStatic_Type) < 0)
7215 return NULL;
7216 Py_INCREF(&MethStatic_Type);
7217 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7218
xdegaye56d1f5c2017-10-26 15:09:06 +02007219 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7220 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7221 return NULL;
7222 }
7223 Py_INCREF(&PyRecursingInfinitelyError_Type);
7224 PyModule_AddObject(m, "RecursingInfinitelyError",
7225 (PyObject *)&PyRecursingInfinitelyError_Type);
7226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7228 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7229 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7230 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7231 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7232 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7233 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7234 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7235 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7236 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7237 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7238 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7239 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7240 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7241 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7242 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007243 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7244 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7245 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7247 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007248 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249 Py_INCREF(&PyInstanceMethod_Type);
7250 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007251
Larry Hastings2a727912014-01-16 11:32:01 -08007252 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007253 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007254#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007255 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007256#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007257 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007258#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007259 Py_INCREF(v);
7260 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7263 Py_INCREF(TestError);
7264 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007265
Benjamin Peterson39403332020-09-02 11:29:06 -05007266 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7267 if (HeapDocCType == NULL) {
7268 return NULL;
7269 }
7270 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7271
Hai Shi88c2cfd2020-11-07 00:04:47 +08007272 /* bpo-41832: Add a new type to test PyType_FromSpec()
7273 now can accept a NULL tp_doc slot. */
7274 PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
7275 if (NullTpDocType == NULL) {
7276 return NULL;
7277 }
7278 PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
7279
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007280 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7281 if (HeapGcCType == NULL) {
7282 return NULL;
7283 }
7284 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7285
7286 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7287 if (HeapCType == NULL) {
7288 return NULL;
7289 }
7290 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7291 if (subclass_bases == NULL) {
7292 return NULL;
7293 }
7294 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7295 if (HeapCTypeSubclass == NULL) {
7296 return NULL;
7297 }
7298 Py_DECREF(subclass_bases);
7299 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7300
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007301 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7302 if (HeapCTypeWithDict == NULL) {
7303 return NULL;
7304 }
7305 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7306
7307 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7308 if (HeapCTypeWithNegativeDict == NULL) {
7309 return NULL;
7310 }
7311 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7312
7313 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7314 if (HeapCTypeWithWeakref == NULL) {
7315 return NULL;
7316 }
7317 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7318
scoderf7c4e232020-06-06 21:35:10 +02007319 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7320 if (HeapCTypeWithBuffer == NULL) {
7321 return NULL;
7322 }
7323 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7324
scoder148f3292020-07-03 02:09:28 +02007325 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7326 if (HeapCTypeSetattr == NULL) {
7327 return NULL;
7328 }
7329 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7330
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007331 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7332 if (subclass_with_finalizer_bases == NULL) {
7333 return NULL;
7334 }
7335 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7336 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7337 if (HeapCTypeSubclassWithFinalizer == NULL) {
7338 return NULL;
7339 }
7340 Py_DECREF(subclass_with_finalizer_bases);
7341 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7342
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007343 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7344 return NULL;
7345 }
7346 Py_INCREF(&ContainerNoGC_type);
7347 if (PyModule_AddObject(m, "ContainerNoGC",
7348 (PyObject *) &ContainerNoGC_type) < 0)
7349 return NULL;
7350
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007351 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007353}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007354
7355
7356/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7357
7358#undef Py_BuildValue
7359PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7360
7361static PyObject *
7362test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7363{
7364 PyObject *res;
7365 const char str[] = "string";
7366 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007367 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007368
7369 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7370 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007371 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007372 return NULL;
7373 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007374 PyErr_Clear();
7375
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007376 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7377 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007378 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007379 return NULL;
7380 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007381 PyErr_Clear();
7382
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007383 res = Py_BuildValue("(y#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("(u#O)", unicode, 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 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007395 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007396
7397
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007398 Py_RETURN_NONE;
7399}
Miss Islington (bot)569ca812021-05-06 20:18:42 -07007400
7401#undef PyArg_ParseTupleAndKeywords
7402PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
7403 const char *, char **, ...);
7404
7405static PyObject *
7406getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
7407{
7408 static char *keywords[] = {"", "x", NULL};
7409 const char *s;
7410 int len;
7411 int i = 0;
7412 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s#i", keywords, &s, &len, &i))
7413 return NULL;
7414 Py_RETURN_NONE;
7415}