blob: cccf9249040dfcc934bf68cd1b7309f4d12cc72f [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 Stinner5c75f372019-04-17 23:02:26 +02008/* The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
9 define, but we only want to test the public C API, not the internal
10 C API. */
11#undef Py_BUILD_CORE_MODULE
12
Neal Norwitz8866e0a2007-10-27 04:01:17 +000013#define PY_SSIZE_T_CLEAN
14
Tim Peters9ea17ac2001-02-02 05:57:15 +000015#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000016#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020017#include "marshal.h"
Victor Stinnera1c249c2018-11-01 03:15:58 +010018#include "pythread.h"
19#include "structmember.h"
20#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020021#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000022
Victor Stinner95e9cef2015-03-28 01:26:47 +010023#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020024# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010025#endif
26
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020027#ifdef HAVE_SYS_WAIT_H
28#include <sys/wait.h> /* For W_STOPCODE */
29#endif
30
Victor Stinner5ed69952018-11-06 15:59:52 +010031#ifdef Py_BUILD_CORE
32# error "_testcapi must test the public Python C API, not CPython internal C API"
33#endif
34
Petr Viktorin3562ae22019-09-12 10:44:46 +010035static struct PyModuleDef _testcapimodule;
36
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000038
Tim Peters91621db2001-06-12 20:10:01 +000039/* Raise TestError with test_name + ": " + msg, and return NULL. */
40
41static PyObject *
42raiseTestError(const char* test_name, const char* msg)
43{
Victor Stinner6ced7c42011-03-21 18:15:42 +010044 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000046}
47
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000048/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000049
50 The ones derived from autoconf on the UNIX-like OSes can be relied
51 upon (in the absence of sloppy cross-compiling), but the Windows
52 platforms have these hardcoded. Better safe than sorry.
53*/
54static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000055sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000057{
Victor Stinner499dfcf2011-03-21 13:26:24 +010058 PyErr_Format(TestError,
59 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000062}
63
64static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053065test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000066{
Tim Peters9ea17ac2001-02-02 05:57:15 +000067#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 if (FATNAME != sizeof(TYPE)) \
69 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 CHECK_SIZEOF(SIZEOF_SHORT, short);
72 CHECK_SIZEOF(SIZEOF_INT, int);
73 CHECK_SIZEOF(SIZEOF_LONG, long);
74 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
75 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070076 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000077
78#undef CHECK_SIZEOF
79
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020080 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000081}
82
Tim Peters5c4d5bf2001-02-12 22:13:26 +000083static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053084test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010085{
Ned Deilye37a1942015-03-05 15:47:10 -080086#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020087#pragma GCC diagnostic push
88#pragma GCC diagnostic ignored "-Wtype-limits"
89#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010090#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010091 if (EXPECTED != sizeof(TYPE)) { \
92 PyErr_Format(TestError, \
93 "sizeof(%s) = %u instead of %u", \
94 #TYPE, sizeof(TYPE), EXPECTED); \
95 return (PyObject*)NULL; \
96 }
Victor Stinnerf866f972013-10-29 19:59:31 +010097#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
98#define CHECK_SIGNNESS(TYPE, SIGNED) \
99 if (IS_SIGNED(TYPE) != SIGNED) { \
100 PyErr_Format(TestError, \
101 "%s signness is, instead of %i", \
102 #TYPE, IS_SIGNED(TYPE), SIGNED); \
103 return (PyObject*)NULL; \
104 }
Victor Stinner01076552013-10-29 19:39:52 +0100105
106 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100107 CHECK_SIZEOF(Py_UCS1, 1);
108 CHECK_SIZEOF(Py_UCS2, 2);
109 CHECK_SIZEOF(Py_UCS4, 4);
110 CHECK_SIGNNESS(Py_UCS1, 0);
111 CHECK_SIGNNESS(Py_UCS2, 0);
112 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700113 CHECK_SIZEOF(int32_t, 4);
114 CHECK_SIGNNESS(int32_t, 1);
115 CHECK_SIZEOF(uint32_t, 4);
116 CHECK_SIGNNESS(uint32_t, 0);
117 CHECK_SIZEOF(int64_t, 8);
118 CHECK_SIGNNESS(int64_t, 1);
119 CHECK_SIZEOF(uint64_t, 8);
120 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100121
122 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100123 CHECK_SIZEOF(size_t, sizeof(void *));
124 CHECK_SIGNNESS(size_t, 0);
125 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
126 CHECK_SIGNNESS(Py_ssize_t, 1);
127
Benjamin Petersonca470632016-09-06 13:47:26 -0700128 CHECK_SIZEOF(uintptr_t, sizeof(void *));
129 CHECK_SIGNNESS(uintptr_t, 0);
130 CHECK_SIZEOF(intptr_t, sizeof(void *));
131 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100132
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200133 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100134
Victor Stinnerf866f972013-10-29 19:59:31 +0100135#undef IS_SIGNED
136#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100137#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800138#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200139#pragma GCC diagnostic pop
140#endif
Victor Stinner01076552013-10-29 19:39:52 +0100141}
142
143
144static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530145test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 PyObject* list;
148 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000151#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 list = PyList_New(NLIST);
153 if (list == (PyObject*)NULL)
154 return (PyObject*)NULL;
155 /* list = range(NLIST) */
156 for (i = 0; i < NLIST; ++i) {
157 PyObject* anint = PyLong_FromLong(i);
158 if (anint == (PyObject*)NULL) {
159 Py_DECREF(list);
160 return (PyObject*)NULL;
161 }
162 PyList_SET_ITEM(list, i, anint);
163 }
164 /* list.reverse(), via PyList_Reverse() */
165 i = PyList_Reverse(list); /* should not blow up! */
166 if (i != 0) {
167 Py_DECREF(list);
168 return (PyObject*)NULL;
169 }
170 /* Check that list == range(29, -1, -1) now */
171 for (i = 0; i < NLIST; ++i) {
172 PyObject* anint = PyList_GET_ITEM(list, i);
173 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
174 PyErr_SetString(TestError,
175 "test_list_api: reverse screwed up");
176 Py_DECREF(list);
177 return (PyObject*)NULL;
178 }
179 }
180 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000181#undef NLIST
182
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200183 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000184}
185
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186static int
187test_dict_inner(int count)
188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 Py_ssize_t pos = 0, iterations = 0;
190 int i;
191 PyObject *dict = PyDict_New();
192 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 if (dict == NULL)
195 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 for (i = 0; i < count; i++) {
198 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200199 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200200 return -1;
201 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200202 if (PyDict_SetItem(dict, v, v) < 0) {
203 Py_DECREF(v);
204 return -1;
205 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 Py_DECREF(v);
207 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 while (PyDict_Next(dict, &pos, &k, &v)) {
210 PyObject *o;
211 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 i = PyLong_AS_LONG(v) + 1;
214 o = PyLong_FromLong(i);
215 if (o == NULL)
216 return -1;
217 if (PyDict_SetItem(dict, k, o) < 0) {
218 Py_DECREF(o);
219 return -1;
220 }
221 Py_DECREF(o);
222 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (iterations != count) {
227 PyErr_SetString(
228 TestError,
229 "test_dict_iteration: dict iteration went wrong ");
230 return -1;
231 } else {
232 return 0;
233 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000234}
235
236static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530237test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 for (i = 0; i < 200; i++) {
242 if (test_dict_inner(i) < 0) {
243 return NULL;
244 }
245 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000246
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200247 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000248}
249
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200250static PyObject*
251dict_getitem_knownhash(PyObject *self, PyObject *args)
252{
253 PyObject *mp, *key, *result;
254 Py_ssize_t hash;
255
256 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
257 &mp, &key, &hash)) {
258 return NULL;
259 }
260
261 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
262 if (result == NULL && !PyErr_Occurred()) {
263 _PyErr_SetKeyError(key);
264 return NULL;
265 }
266
267 Py_XINCREF(result);
268 return result;
269}
Tim Peters91621db2001-06-12 20:10:01 +0000270
Victor Stinner3d3f2642016-12-15 17:21:23 +0100271static PyObject*
272dict_hassplittable(PyObject *self, PyObject *arg)
273{
274 if (!PyDict_Check(arg)) {
275 PyErr_Format(PyExc_TypeError,
276 "dict_hassplittable() argument must be dict, not '%s'",
277 arg->ob_type->tp_name);
278 return NULL;
279 }
280
281 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
282}
283
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000284/* Issue #4701: Check that PyObject_Hash implicitly calls
285 * PyType_Ready if it hasn't already been called
286 */
287static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 PyVarObject_HEAD_INIT(NULL, 0)
289 "hashinheritancetester", /* Name of this type */
290 sizeof(PyObject), /* Basic object size */
291 0, /* Item size for varobject */
292 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200293 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 0, /* tp_getattr */
295 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200296 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 0, /* tp_repr */
298 0, /* tp_as_number */
299 0, /* tp_as_sequence */
300 0, /* tp_as_mapping */
301 0, /* tp_hash */
302 0, /* tp_call */
303 0, /* tp_str */
304 PyObject_GenericGetAttr, /* tp_getattro */
305 0, /* tp_setattro */
306 0, /* tp_as_buffer */
307 Py_TPFLAGS_DEFAULT, /* tp_flags */
308 0, /* tp_doc */
309 0, /* tp_traverse */
310 0, /* tp_clear */
311 0, /* tp_richcompare */
312 0, /* tp_weaklistoffset */
313 0, /* tp_iter */
314 0, /* tp_iternext */
315 0, /* tp_methods */
316 0, /* tp_members */
317 0, /* tp_getset */
318 0, /* tp_base */
319 0, /* tp_dict */
320 0, /* tp_descr_get */
321 0, /* tp_descr_set */
322 0, /* tp_dictoffset */
323 0, /* tp_init */
324 0, /* tp_alloc */
325 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000326};
327
328static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530329test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 PyTypeObject *type;
332 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000333 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 if (type->tp_dict != NULL)
338 /* The type has already been initialized. This probably means
339 -R is being used. */
340 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000341
342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 obj = PyObject_New(PyObject, type);
344 if (obj == NULL) {
345 PyErr_Clear();
346 PyErr_SetString(
347 TestError,
348 "test_lazy_hash_inheritance: failed to create object");
349 return NULL;
350 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 if (type->tp_dict != NULL) {
353 PyErr_SetString(
354 TestError,
355 "test_lazy_hash_inheritance: type initialised too soon");
356 Py_DECREF(obj);
357 return NULL;
358 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 hash = PyObject_Hash(obj);
361 if ((hash == -1) && PyErr_Occurred()) {
362 PyErr_Clear();
363 PyErr_SetString(
364 TestError,
365 "test_lazy_hash_inheritance: could not hash object");
366 Py_DECREF(obj);
367 return NULL;
368 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 if (type->tp_dict == NULL) {
371 PyErr_SetString(
372 TestError,
373 "test_lazy_hash_inheritance: type not initialised by hash()");
374 Py_DECREF(obj);
375 return NULL;
376 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 if (type->tp_hash != PyType_Type.tp_hash) {
379 PyErr_SetString(
380 TestError,
381 "test_lazy_hash_inheritance: unexpected hash function");
382 Py_DECREF(obj);
383 return NULL;
384 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000389}
390
391
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700392/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000393 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000394
395 Note that the meat of the test is contained in testcapi_long.h.
396 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700397 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000398 dependence on type names makes it impossible to use a parameterized
399 function. A giant macro would be even worse than this. A C++ template
400 would be perfect.
401
402 The "report an error" functions are deliberately not part of the #include
403 file: if the test fails, you can set a breakpoint in the appropriate
404 error function directly, and crawl back from there in the debugger.
405*/
406
407#define UNBIND(X) Py_DECREF(X); (X) = NULL
408
409static PyObject *
410raise_test_long_error(const char* msg)
411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000413}
414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415#define TESTNAME test_long_api_inner
416#define TYPENAME long
417#define F_S_TO_PY PyLong_FromLong
418#define F_PY_TO_S PyLong_AsLong
419#define F_U_TO_PY PyLong_FromUnsignedLong
420#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000421
422#include "testcapi_long.h"
423
424static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530425test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000428}
429
430#undef TESTNAME
431#undef TYPENAME
432#undef F_S_TO_PY
433#undef F_PY_TO_S
434#undef F_U_TO_PY
435#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000436
Tim Peters91621db2001-06-12 20:10:01 +0000437static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000438raise_test_longlong_error(const char* msg)
439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000441}
442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700444#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445#define F_S_TO_PY PyLong_FromLongLong
446#define F_PY_TO_S PyLong_AsLongLong
447#define F_U_TO_PY PyLong_FromUnsignedLongLong
448#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000449
450#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000451
452static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000453test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000456}
457
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000458#undef TESTNAME
459#undef TYPENAME
460#undef F_S_TO_PY
461#undef F_PY_TO_S
462#undef F_U_TO_PY
463#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000464
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000465/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
466 is tested by test_long_api_inner. This test will concentrate on proper
467 handling of overflow.
468*/
469
470static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530471test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 PyObject *num, *one, *temp;
474 long value;
475 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 /* Test that overflow is set properly for a large value. */
478 /* num is a number larger than LONG_MAX even on 64-bit platforms */
479 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
480 if (num == NULL)
481 return NULL;
482 overflow = 1234;
483 value = PyLong_AsLongAndOverflow(num, &overflow);
484 Py_DECREF(num);
485 if (value == -1 && PyErr_Occurred())
486 return NULL;
487 if (value != -1)
488 return raiseTestError("test_long_and_overflow",
489 "return value was not set to -1");
490 if (overflow != 1)
491 return raiseTestError("test_long_and_overflow",
492 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 /* Same again, with num = LONG_MAX + 1 */
495 num = PyLong_FromLong(LONG_MAX);
496 if (num == NULL)
497 return NULL;
498 one = PyLong_FromLong(1L);
499 if (one == NULL) {
500 Py_DECREF(num);
501 return NULL;
502 }
503 temp = PyNumber_Add(num, one);
504 Py_DECREF(one);
505 Py_DECREF(num);
506 num = temp;
507 if (num == NULL)
508 return NULL;
509 overflow = 0;
510 value = PyLong_AsLongAndOverflow(num, &overflow);
511 Py_DECREF(num);
512 if (value == -1 && PyErr_Occurred())
513 return NULL;
514 if (value != -1)
515 return raiseTestError("test_long_and_overflow",
516 "return value was not set to -1");
517 if (overflow != 1)
518 return raiseTestError("test_long_and_overflow",
519 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 /* Test that overflow is set properly for a large negative value. */
522 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
523 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
524 if (num == NULL)
525 return NULL;
526 overflow = 1234;
527 value = PyLong_AsLongAndOverflow(num, &overflow);
528 Py_DECREF(num);
529 if (value == -1 && PyErr_Occurred())
530 return NULL;
531 if (value != -1)
532 return raiseTestError("test_long_and_overflow",
533 "return value was not set to -1");
534 if (overflow != -1)
535 return raiseTestError("test_long_and_overflow",
536 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 /* Same again, with num = LONG_MIN - 1 */
539 num = PyLong_FromLong(LONG_MIN);
540 if (num == NULL)
541 return NULL;
542 one = PyLong_FromLong(1L);
543 if (one == NULL) {
544 Py_DECREF(num);
545 return NULL;
546 }
547 temp = PyNumber_Subtract(num, one);
548 Py_DECREF(one);
549 Py_DECREF(num);
550 num = temp;
551 if (num == NULL)
552 return NULL;
553 overflow = 0;
554 value = PyLong_AsLongAndOverflow(num, &overflow);
555 Py_DECREF(num);
556 if (value == -1 && PyErr_Occurred())
557 return NULL;
558 if (value != -1)
559 return raiseTestError("test_long_and_overflow",
560 "return value was not set to -1");
561 if (overflow != -1)
562 return raiseTestError("test_long_and_overflow",
563 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 /* Test that overflow is cleared properly for small values. */
566 num = PyLong_FromString("FF", NULL, 16);
567 if (num == NULL)
568 return NULL;
569 overflow = 1234;
570 value = PyLong_AsLongAndOverflow(num, &overflow);
571 Py_DECREF(num);
572 if (value == -1 && PyErr_Occurred())
573 return NULL;
574 if (value != 0xFF)
575 return raiseTestError("test_long_and_overflow",
576 "expected return value 0xFF");
577 if (overflow != 0)
578 return raiseTestError("test_long_and_overflow",
579 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 num = PyLong_FromString("-FF", NULL, 16);
582 if (num == NULL)
583 return NULL;
584 overflow = 0;
585 value = PyLong_AsLongAndOverflow(num, &overflow);
586 Py_DECREF(num);
587 if (value == -1 && PyErr_Occurred())
588 return NULL;
589 if (value != -0xFF)
590 return raiseTestError("test_long_and_overflow",
591 "expected return value 0xFF");
592 if (overflow != 0)
593 return raiseTestError("test_long_and_overflow",
594 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 num = PyLong_FromLong(LONG_MAX);
597 if (num == NULL)
598 return NULL;
599 overflow = 1234;
600 value = PyLong_AsLongAndOverflow(num, &overflow);
601 Py_DECREF(num);
602 if (value == -1 && PyErr_Occurred())
603 return NULL;
604 if (value != LONG_MAX)
605 return raiseTestError("test_long_and_overflow",
606 "expected return value LONG_MAX");
607 if (overflow != 0)
608 return raiseTestError("test_long_and_overflow",
609 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 num = PyLong_FromLong(LONG_MIN);
612 if (num == NULL)
613 return NULL;
614 overflow = 0;
615 value = PyLong_AsLongAndOverflow(num, &overflow);
616 Py_DECREF(num);
617 if (value == -1 && PyErr_Occurred())
618 return NULL;
619 if (value != LONG_MIN)
620 return raiseTestError("test_long_and_overflow",
621 "expected return value LONG_MIN");
622 if (overflow != 0)
623 return raiseTestError("test_long_and_overflow",
624 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000625
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200626 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000627}
628
Mark Dickinson93f562c2010-01-30 10:30:15 +0000629/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700630 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000631 concentrate on proper handling of overflow.
632*/
633
634static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530635test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700638 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 /* Test that overflow is set properly for a large value. */
642 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
643 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
644 if (num == NULL)
645 return NULL;
646 overflow = 1234;
647 value = PyLong_AsLongLongAndOverflow(num, &overflow);
648 Py_DECREF(num);
649 if (value == -1 && PyErr_Occurred())
650 return NULL;
651 if (value != -1)
652 return raiseTestError("test_long_long_and_overflow",
653 "return value was not set to -1");
654 if (overflow != 1)
655 return raiseTestError("test_long_long_and_overflow",
656 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* Same again, with num = PY_LLONG_MAX + 1 */
659 num = PyLong_FromLongLong(PY_LLONG_MAX);
660 if (num == NULL)
661 return NULL;
662 one = PyLong_FromLong(1L);
663 if (one == NULL) {
664 Py_DECREF(num);
665 return NULL;
666 }
667 temp = PyNumber_Add(num, one);
668 Py_DECREF(one);
669 Py_DECREF(num);
670 num = temp;
671 if (num == NULL)
672 return NULL;
673 overflow = 0;
674 value = PyLong_AsLongLongAndOverflow(num, &overflow);
675 Py_DECREF(num);
676 if (value == -1 && PyErr_Occurred())
677 return NULL;
678 if (value != -1)
679 return raiseTestError("test_long_long_and_overflow",
680 "return value was not set to -1");
681 if (overflow != 1)
682 return raiseTestError("test_long_long_and_overflow",
683 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 /* Test that overflow is set properly for a large negative value. */
686 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
687 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
688 if (num == NULL)
689 return NULL;
690 overflow = 1234;
691 value = PyLong_AsLongLongAndOverflow(num, &overflow);
692 Py_DECREF(num);
693 if (value == -1 && PyErr_Occurred())
694 return NULL;
695 if (value != -1)
696 return raiseTestError("test_long_long_and_overflow",
697 "return value was not set to -1");
698 if (overflow != -1)
699 return raiseTestError("test_long_long_and_overflow",
700 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 /* Same again, with num = PY_LLONG_MIN - 1 */
703 num = PyLong_FromLongLong(PY_LLONG_MIN);
704 if (num == NULL)
705 return NULL;
706 one = PyLong_FromLong(1L);
707 if (one == NULL) {
708 Py_DECREF(num);
709 return NULL;
710 }
711 temp = PyNumber_Subtract(num, one);
712 Py_DECREF(one);
713 Py_DECREF(num);
714 num = temp;
715 if (num == NULL)
716 return NULL;
717 overflow = 0;
718 value = PyLong_AsLongLongAndOverflow(num, &overflow);
719 Py_DECREF(num);
720 if (value == -1 && PyErr_Occurred())
721 return NULL;
722 if (value != -1)
723 return raiseTestError("test_long_long_and_overflow",
724 "return value was not set to -1");
725 if (overflow != -1)
726 return raiseTestError("test_long_long_and_overflow",
727 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 /* Test that overflow is cleared properly for small values. */
730 num = PyLong_FromString("FF", NULL, 16);
731 if (num == NULL)
732 return NULL;
733 overflow = 1234;
734 value = PyLong_AsLongLongAndOverflow(num, &overflow);
735 Py_DECREF(num);
736 if (value == -1 && PyErr_Occurred())
737 return NULL;
738 if (value != 0xFF)
739 return raiseTestError("test_long_long_and_overflow",
740 "expected return value 0xFF");
741 if (overflow != 0)
742 return raiseTestError("test_long_long_and_overflow",
743 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 num = PyLong_FromString("-FF", NULL, 16);
746 if (num == NULL)
747 return NULL;
748 overflow = 0;
749 value = PyLong_AsLongLongAndOverflow(num, &overflow);
750 Py_DECREF(num);
751 if (value == -1 && PyErr_Occurred())
752 return NULL;
753 if (value != -0xFF)
754 return raiseTestError("test_long_long_and_overflow",
755 "expected return value 0xFF");
756 if (overflow != 0)
757 return raiseTestError("test_long_long_and_overflow",
758 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 num = PyLong_FromLongLong(PY_LLONG_MAX);
761 if (num == NULL)
762 return NULL;
763 overflow = 1234;
764 value = PyLong_AsLongLongAndOverflow(num, &overflow);
765 Py_DECREF(num);
766 if (value == -1 && PyErr_Occurred())
767 return NULL;
768 if (value != PY_LLONG_MAX)
769 return raiseTestError("test_long_long_and_overflow",
770 "expected return value PY_LLONG_MAX");
771 if (overflow != 0)
772 return raiseTestError("test_long_long_and_overflow",
773 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 num = PyLong_FromLongLong(PY_LLONG_MIN);
776 if (num == NULL)
777 return NULL;
778 overflow = 0;
779 value = PyLong_AsLongLongAndOverflow(num, &overflow);
780 Py_DECREF(num);
781 if (value == -1 && PyErr_Occurred())
782 return NULL;
783 if (value != PY_LLONG_MIN)
784 return raiseTestError("test_long_long_and_overflow",
785 "expected return value PY_LLONG_MIN");
786 if (overflow != 0)
787 return raiseTestError("test_long_long_and_overflow",
788 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000789
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200790 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000791}
792
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200793/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
794 non-integer arguments are handled correctly. It should be extended to
795 test overflow handling.
796 */
797
798static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530799test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200800{
801 size_t out_u;
802 Py_ssize_t out_s;
803
804 Py_INCREF(Py_None);
805
806 out_u = PyLong_AsSize_t(Py_None);
807 if (out_u != (size_t)-1 || !PyErr_Occurred())
808 return raiseTestError("test_long_as_size_t",
809 "PyLong_AsSize_t(None) didn't complain");
810 if (!PyErr_ExceptionMatches(PyExc_TypeError))
811 return raiseTestError("test_long_as_size_t",
812 "PyLong_AsSize_t(None) raised "
813 "something other than TypeError");
814 PyErr_Clear();
815
816 out_s = PyLong_AsSsize_t(Py_None);
817 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
818 return raiseTestError("test_long_as_size_t",
819 "PyLong_AsSsize_t(None) didn't complain");
820 if (!PyErr_ExceptionMatches(PyExc_TypeError))
821 return raiseTestError("test_long_as_size_t",
822 "PyLong_AsSsize_t(None) raised "
823 "something other than TypeError");
824 PyErr_Clear();
825
826 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
827 return Py_None;
828}
829
Zackery Spytzdd492d92019-06-07 08:22:58 -0600830static PyObject *
831test_long_as_unsigned_long_long_mask(PyObject *self,
832 PyObject *Py_UNUSED(ignored))
833{
834 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
835
836 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
837 return raiseTestError("test_long_as_unsigned_long_long_mask",
838 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
839 "complain");
840 }
841 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
842 return raiseTestError("test_long_as_unsigned_long_long_mask",
843 "PyLong_AsUnsignedLongLongMask(NULL) raised "
844 "something other than SystemError");
845 }
846 PyErr_Clear();
847 Py_RETURN_NONE;
848}
849
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200850/* Test the PyLong_AsDouble API. At present this just tests that
851 non-integer arguments are handled correctly.
852 */
853
854static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530855test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200856{
857 double out;
858
859 Py_INCREF(Py_None);
860
861 out = PyLong_AsDouble(Py_None);
862 if (out != -1.0 || !PyErr_Occurred())
863 return raiseTestError("test_long_as_double",
864 "PyLong_AsDouble(None) didn't complain");
865 if (!PyErr_ExceptionMatches(PyExc_TypeError))
866 return raiseTestError("test_long_as_double",
867 "PyLong_AsDouble(None) raised "
868 "something other than TypeError");
869 PyErr_Clear();
870
871 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
872 return Py_None;
873}
874
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700875/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000876 for both long and int arguments. The test may leak a little memory if
877 it fails.
878*/
879static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530880test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700883 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 tuple = PyTuple_New(1);
886 if (tuple == NULL)
887 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 num = PyLong_FromLong(42);
890 if (num == NULL)
891 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300896 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300898 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 if (value != 42)
900 return raiseTestError("test_L_code",
901 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 Py_DECREF(num);
904 num = PyLong_FromLong(42);
905 if (num == NULL)
906 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300911 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300913 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 if (value != 42)
915 return raiseTestError("test_L_code",
916 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200919 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000920}
921
Serhiy Storchakace412872016-05-08 23:36:44 +0300922static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300923return_none(void *unused)
924{
925 Py_RETURN_NONE;
926}
927
928static PyObject *
929raise_error(void *unused)
930{
931 PyErr_SetNone(PyExc_ValueError);
932 return NULL;
933}
934
935static int
936test_buildvalue_N_error(const char *fmt)
937{
938 PyObject *arg, *res;
939
940 arg = PyList_New(0);
941 if (arg == NULL) {
942 return -1;
943 }
944
945 Py_INCREF(arg);
946 res = Py_BuildValue(fmt, return_none, NULL, arg);
947 if (res == NULL) {
948 return -1;
949 }
950 Py_DECREF(res);
951 if (Py_REFCNT(arg) != 1) {
952 PyErr_Format(TestError, "test_buildvalue_N: "
953 "arg was not decrefed in successful "
954 "Py_BuildValue(\"%s\")", fmt);
955 return -1;
956 }
957
958 Py_INCREF(arg);
959 res = Py_BuildValue(fmt, raise_error, NULL, arg);
960 if (res != NULL || !PyErr_Occurred()) {
961 PyErr_Format(TestError, "test_buildvalue_N: "
962 "Py_BuildValue(\"%s\") didn't complain", fmt);
963 return -1;
964 }
965 PyErr_Clear();
966 if (Py_REFCNT(arg) != 1) {
967 PyErr_Format(TestError, "test_buildvalue_N: "
968 "arg was not decrefed in failed "
969 "Py_BuildValue(\"%s\")", fmt);
970 return -1;
971 }
972 Py_DECREF(arg);
973 return 0;
974}
975
976static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200977test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300978{
979 PyObject *arg, *res;
980
981 arg = PyList_New(0);
982 if (arg == NULL) {
983 return NULL;
984 }
985 Py_INCREF(arg);
986 res = Py_BuildValue("N", arg);
987 if (res == NULL) {
988 return NULL;
989 }
990 if (res != arg) {
991 return raiseTestError("test_buildvalue_N",
992 "Py_BuildValue(\"N\") returned wrong result");
993 }
994 if (Py_REFCNT(arg) != 2) {
995 return raiseTestError("test_buildvalue_N",
996 "arg was not decrefed in Py_BuildValue(\"N\")");
997 }
998 Py_DECREF(res);
999 Py_DECREF(arg);
1000
1001 if (test_buildvalue_N_error("O&N") < 0)
1002 return NULL;
1003 if (test_buildvalue_N_error("(O&N)") < 0)
1004 return NULL;
1005 if (test_buildvalue_N_error("[O&N]") < 0)
1006 return NULL;
1007 if (test_buildvalue_N_error("{O&N}") < 0)
1008 return NULL;
1009 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1010 return NULL;
1011
1012 Py_RETURN_NONE;
1013}
1014
1015
1016static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001017get_args(PyObject *self, PyObject *args)
1018{
1019 if (args == NULL) {
1020 args = Py_None;
1021 }
1022 Py_INCREF(args);
1023 return args;
1024}
1025
1026static PyObject *
1027get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1028{
1029 if (kwargs == NULL) {
1030 kwargs = Py_None;
1031 }
1032 Py_INCREF(kwargs);
1033 return kwargs;
1034}
1035
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001036/* Test tuple argument processing */
1037static PyObject *
1038getargs_tuple(PyObject *self, PyObject *args)
1039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 int a, b, c;
1041 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1042 return NULL;
1043 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001044}
1045
Christian Heimes380f7f22008-02-28 11:19:05 +00001046/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001047static PyObject *
1048getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001051 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1055 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1056 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1057 return NULL;
1058 return Py_BuildValue("iiiiiiiiii",
1059 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1060 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001061}
1062
Larry Hastings83a9f482012-03-20 20:06:16 +00001063/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1064static PyObject *
1065getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1066{
1067 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1068 int required = -1;
1069 int optional = -1;
1070 int keyword_only = -1;
1071
1072 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1073 &required, &optional, &keyword_only))
1074 return NULL;
1075 return Py_BuildValue("iii", required, optional, keyword_only);
1076}
1077
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001078/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1079static PyObject *
1080getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1081{
1082 static char *keywords[] = {"", "", "keyword", NULL};
1083 int required = -1;
1084 int optional = -1;
1085 int keyword = -1;
1086
1087 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1088 &required, &optional, &keyword))
1089 return NULL;
1090 return Py_BuildValue("iii", required, optional, keyword);
1091}
1092
Thomas Heller3457e4b2003-04-24 16:14:27 +00001093/* Functions to call PyArg_ParseTuple with integer format codes,
1094 and return the result.
1095*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001096static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001097getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 unsigned char value;
1100 if (!PyArg_ParseTuple(args, "b", &value))
1101 return NULL;
1102 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001103}
1104
Thomas Heller3457e4b2003-04-24 16:14:27 +00001105static PyObject *
1106getargs_B(PyObject *self, PyObject *args)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 unsigned char value;
1109 if (!PyArg_ParseTuple(args, "B", &value))
1110 return NULL;
1111 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001112}
1113
1114static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001115getargs_h(PyObject *self, PyObject *args)
1116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 short value;
1118 if (!PyArg_ParseTuple(args, "h", &value))
1119 return NULL;
1120 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001121}
1122
1123static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001124getargs_H(PyObject *self, PyObject *args)
1125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 unsigned short value;
1127 if (!PyArg_ParseTuple(args, "H", &value))
1128 return NULL;
1129 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001130}
1131
1132static PyObject *
1133getargs_I(PyObject *self, PyObject *args)
1134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 unsigned int value;
1136 if (!PyArg_ParseTuple(args, "I", &value))
1137 return NULL;
1138 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001139}
1140
1141static PyObject *
1142getargs_k(PyObject *self, PyObject *args)
1143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 unsigned long value;
1145 if (!PyArg_ParseTuple(args, "k", &value))
1146 return NULL;
1147 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001148}
1149
1150static PyObject *
1151getargs_i(PyObject *self, PyObject *args)
1152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 int value;
1154 if (!PyArg_ParseTuple(args, "i", &value))
1155 return NULL;
1156 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001157}
1158
Thomas Hellera4ea6032003-04-17 18:55:45 +00001159static PyObject *
1160getargs_l(PyObject *self, PyObject *args)
1161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 long value;
1163 if (!PyArg_ParseTuple(args, "l", &value))
1164 return NULL;
1165 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166}
1167
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001168static PyObject *
1169getargs_n(PyObject *self, PyObject *args)
1170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 Py_ssize_t value;
1172 if (!PyArg_ParseTuple(args, "n", &value))
1173 return NULL;
1174 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175}
1176
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001177static PyObject *
1178getargs_p(PyObject *self, PyObject *args)
1179{
1180 int value;
1181 if (!PyArg_ParseTuple(args, "p", &value))
1182 return NULL;
1183 return PyLong_FromLong(value);
1184}
1185
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001187getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001188{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001189 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 if (!PyArg_ParseTuple(args, "L", &value))
1191 return NULL;
1192 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193}
1194
Thomas Hellera4ea6032003-04-17 18:55:45 +00001195static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001196getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001198 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 if (!PyArg_ParseTuple(args, "K", &value))
1200 return NULL;
1201 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001202}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001203
1204/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001205 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301207test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 PyObject *tuple, *num;
1210 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 tuple = PyTuple_New(1);
1213 if (tuple == NULL)
1214 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 /* a number larger than ULONG_MAX even on 64-bit platforms */
1217 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1218 if (num == NULL)
1219 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 value = PyLong_AsUnsignedLongMask(num);
1222 if (value != ULONG_MAX)
1223 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001224 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001229 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001231 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 if (value != ULONG_MAX)
1233 return raiseTestError("test_k_code",
1234 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 Py_DECREF(num);
1237 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1238 if (num == NULL)
1239 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 value = PyLong_AsUnsignedLongMask(num);
1242 if (value != (unsigned long)-0x42)
1243 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001244 "PyLong_AsUnsignedLongMask() returned wrong "
1245 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001250 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (value != (unsigned long)-0x42)
1254 return raiseTestError("test_k_code",
1255 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001258 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001259}
1260
Victor Stinner06e49dd2010-06-13 18:21:50 +00001261static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001262getargs_f(PyObject *self, PyObject *args)
1263{
1264 float f;
1265 if (!PyArg_ParseTuple(args, "f", &f))
1266 return NULL;
1267 return PyFloat_FromDouble(f);
1268}
1269
1270static PyObject *
1271getargs_d(PyObject *self, PyObject *args)
1272{
1273 double d;
1274 if (!PyArg_ParseTuple(args, "d", &d))
1275 return NULL;
1276 return PyFloat_FromDouble(d);
1277}
1278
1279static PyObject *
1280getargs_D(PyObject *self, PyObject *args)
1281{
1282 Py_complex cval;
1283 if (!PyArg_ParseTuple(args, "D", &cval))
1284 return NULL;
1285 return PyComplex_FromCComplex(cval);
1286}
1287
1288static PyObject *
1289getargs_S(PyObject *self, PyObject *args)
1290{
1291 PyObject *obj;
1292 if (!PyArg_ParseTuple(args, "S", &obj))
1293 return NULL;
1294 Py_INCREF(obj);
1295 return obj;
1296}
1297
1298static PyObject *
1299getargs_Y(PyObject *self, PyObject *args)
1300{
1301 PyObject *obj;
1302 if (!PyArg_ParseTuple(args, "Y", &obj))
1303 return NULL;
1304 Py_INCREF(obj);
1305 return obj;
1306}
1307
1308static PyObject *
1309getargs_U(PyObject *self, PyObject *args)
1310{
1311 PyObject *obj;
1312 if (!PyArg_ParseTuple(args, "U", &obj))
1313 return NULL;
1314 Py_INCREF(obj);
1315 return obj;
1316}
1317
1318static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001319getargs_c(PyObject *self, PyObject *args)
1320{
1321 char c;
1322 if (!PyArg_ParseTuple(args, "c", &c))
1323 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001324 return PyLong_FromLong((unsigned char)c);
1325}
1326
1327static PyObject *
1328getargs_C(PyObject *self, PyObject *args)
1329{
1330 int c;
1331 if (!PyArg_ParseTuple(args, "C", &c))
1332 return NULL;
1333 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001334}
1335
1336static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001337getargs_s(PyObject *self, PyObject *args)
1338{
1339 char *str;
1340 if (!PyArg_ParseTuple(args, "s", &str))
1341 return NULL;
1342 return PyBytes_FromString(str);
1343}
1344
1345static PyObject *
1346getargs_s_star(PyObject *self, PyObject *args)
1347{
1348 Py_buffer buffer;
1349 PyObject *bytes;
1350 if (!PyArg_ParseTuple(args, "s*", &buffer))
1351 return NULL;
1352 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1353 PyBuffer_Release(&buffer);
1354 return bytes;
1355}
1356
1357static PyObject *
1358getargs_s_hash(PyObject *self, PyObject *args)
1359{
1360 char *str;
1361 Py_ssize_t size;
1362 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1363 return NULL;
1364 return PyBytes_FromStringAndSize(str, size);
1365}
1366
1367static PyObject *
1368getargs_z(PyObject *self, PyObject *args)
1369{
1370 char *str;
1371 if (!PyArg_ParseTuple(args, "z", &str))
1372 return NULL;
1373 if (str != NULL)
1374 return PyBytes_FromString(str);
1375 else
1376 Py_RETURN_NONE;
1377}
1378
1379static PyObject *
1380getargs_z_star(PyObject *self, PyObject *args)
1381{
1382 Py_buffer buffer;
1383 PyObject *bytes;
1384 if (!PyArg_ParseTuple(args, "z*", &buffer))
1385 return NULL;
1386 if (buffer.buf != NULL)
1387 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1388 else {
1389 Py_INCREF(Py_None);
1390 bytes = Py_None;
1391 }
1392 PyBuffer_Release(&buffer);
1393 return bytes;
1394}
1395
1396static PyObject *
1397getargs_z_hash(PyObject *self, PyObject *args)
1398{
1399 char *str;
1400 Py_ssize_t size;
1401 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1402 return NULL;
1403 if (str != NULL)
1404 return PyBytes_FromStringAndSize(str, size);
1405 else
1406 Py_RETURN_NONE;
1407}
1408
1409static PyObject *
1410getargs_y(PyObject *self, PyObject *args)
1411{
1412 char *str;
1413 if (!PyArg_ParseTuple(args, "y", &str))
1414 return NULL;
1415 return PyBytes_FromString(str);
1416}
1417
1418static PyObject *
1419getargs_y_star(PyObject *self, PyObject *args)
1420{
1421 Py_buffer buffer;
1422 PyObject *bytes;
1423 if (!PyArg_ParseTuple(args, "y*", &buffer))
1424 return NULL;
1425 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1426 PyBuffer_Release(&buffer);
1427 return bytes;
1428}
1429
1430static PyObject *
1431getargs_y_hash(PyObject *self, PyObject *args)
1432{
1433 char *str;
1434 Py_ssize_t size;
1435 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1436 return NULL;
1437 return PyBytes_FromStringAndSize(str, size);
1438}
1439
1440static PyObject *
1441getargs_u(PyObject *self, PyObject *args)
1442{
1443 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001444 if (!PyArg_ParseTuple(args, "u", &str))
1445 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001446 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001447}
1448
1449static PyObject *
1450getargs_u_hash(PyObject *self, PyObject *args)
1451{
1452 Py_UNICODE *str;
1453 Py_ssize_t size;
1454 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1455 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001456 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001457}
1458
1459static PyObject *
1460getargs_Z(PyObject *self, PyObject *args)
1461{
1462 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001463 if (!PyArg_ParseTuple(args, "Z", &str))
1464 return NULL;
1465 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001466 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001467 } else
1468 Py_RETURN_NONE;
1469}
1470
1471static PyObject *
1472getargs_Z_hash(PyObject *self, PyObject *args)
1473{
1474 Py_UNICODE *str;
1475 Py_ssize_t size;
1476 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1477 return NULL;
1478 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001479 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001480 else
1481 Py_RETURN_NONE;
1482}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001483
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001484static PyObject *
1485getargs_es(PyObject *self, PyObject *args)
1486{
1487 PyObject *arg, *result;
1488 const char *encoding = NULL;
1489 char *str;
1490
1491 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1492 return NULL;
1493 if (!PyArg_Parse(arg, "es", encoding, &str))
1494 return NULL;
1495 result = PyBytes_FromString(str);
1496 PyMem_Free(str);
1497 return result;
1498}
1499
1500static PyObject *
1501getargs_et(PyObject *self, PyObject *args)
1502{
1503 PyObject *arg, *result;
1504 const char *encoding = NULL;
1505 char *str;
1506
1507 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1508 return NULL;
1509 if (!PyArg_Parse(arg, "et", encoding, &str))
1510 return NULL;
1511 result = PyBytes_FromString(str);
1512 PyMem_Free(str);
1513 return result;
1514}
1515
1516static PyObject *
1517getargs_es_hash(PyObject *self, PyObject *args)
1518{
1519 PyObject *arg, *result;
1520 const char *encoding = NULL;
1521 PyByteArrayObject *buffer = NULL;
1522 char *str = NULL;
1523 Py_ssize_t size;
1524
1525 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1526 return NULL;
1527 if (buffer != NULL) {
1528 str = PyByteArray_AS_STRING(buffer);
1529 size = PyByteArray_GET_SIZE(buffer);
1530 }
1531 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1532 return NULL;
1533 result = PyBytes_FromStringAndSize(str, size);
1534 if (buffer == NULL)
1535 PyMem_Free(str);
1536 return result;
1537}
1538
1539static PyObject *
1540getargs_et_hash(PyObject *self, PyObject *args)
1541{
1542 PyObject *arg, *result;
1543 const char *encoding = NULL;
1544 PyByteArrayObject *buffer = NULL;
1545 char *str = NULL;
1546 Py_ssize_t size;
1547
1548 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1549 return NULL;
1550 if (buffer != NULL) {
1551 str = PyByteArray_AS_STRING(buffer);
1552 size = PyByteArray_GET_SIZE(buffer);
1553 }
1554 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1555 return NULL;
1556 result = PyBytes_FromStringAndSize(str, size);
1557 if (buffer == NULL)
1558 PyMem_Free(str);
1559 return result;
1560}
1561
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001562/* Test the s and z codes for PyArg_ParseTuple.
1563*/
1564static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301565test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566{
1567 /* Unicode strings should be accepted */
1568 PyObject *tuple, *obj;
1569 char *value;
1570
1571 tuple = PyTuple_New(1);
1572 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001574
1575 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001577 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001579
1580 PyTuple_SET_ITEM(tuple, 0, obj);
1581
1582 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001584 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001585 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1586 return NULL;
1587 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001588
Oren Milmanba7d7362017-08-29 11:58:27 +03001589 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1590 return NULL;
1591 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001592
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001593 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001594 Py_RETURN_NONE;
1595}
1596
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001597static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001598parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001599{
Larry Hastings8f904da2012-06-22 03:56:29 -07001600 PyObject *sub_args;
1601 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001602 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001603 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001604
Larry Hastings8f904da2012-06-22 03:56:29 -07001605 Py_ssize_t i, size;
1606 char *keywords[8 + 1]; /* space for NULL at end */
1607 PyObject *o;
1608 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001609
Larry Hastings8f904da2012-06-22 03:56:29 -07001610 int result;
1611 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001612
Larry Hastings22701e82012-08-08 14:52:22 -07001613 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001614
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001615 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001616 &sub_args, &sub_kwargs,
1617 &sub_format, &sub_keywords))
1618 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001619
Larry Hastings8f904da2012-06-22 03:56:29 -07001620 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1621 PyErr_SetString(PyExc_ValueError,
1622 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1623 return NULL;
1624 }
1625
1626 memset(buffers, 0, sizeof(buffers));
1627 memset(converted, 0, sizeof(converted));
1628 memset(keywords, 0, sizeof(keywords));
1629
1630 size = PySequence_Fast_GET_SIZE(sub_keywords);
1631 if (size > 8) {
1632 PyErr_SetString(PyExc_ValueError,
1633 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1634 goto exit;
1635 }
1636
1637 for (i = 0; i < size; i++) {
1638 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1639 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1640 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001641 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001642 goto exit;
1643 }
1644 keywords[i] = PyBytes_AS_STRING(converted[i]);
1645 }
1646
1647 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1648 sub_format, keywords,
1649 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1650 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1651
1652 if (result) {
1653 return_value = Py_None;
1654 Py_INCREF(Py_None);
1655 }
1656
1657exit:
1658 size = sizeof(converted) / sizeof(converted[0]);
1659 for (i = 0; i < size; i++) {
1660 Py_XDECREF(converted[i]);
1661 }
1662 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001663}
1664
Benjamin Peterson92035012008-12-27 16:00:54 +00001665static volatile int x;
1666
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001667/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1668 of an error.
1669*/
1670static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301671test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 PyObject *tuple, *obj;
1674 Py_UNICODE *value;
1675 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1678 /* Just use the macro and check that it compiles */
1679 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 tuple = PyTuple_New(1);
1682 if (tuple == NULL)
1683 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 obj = PyUnicode_Decode("test", strlen("test"),
1686 "ascii", NULL);
1687 if (obj == NULL)
1688 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001693 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 if (value != PyUnicode_AS_UNICODE(obj))
1697 return raiseTestError("test_u_code",
1698 "u code returned wrong value for u'test'");
1699 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001700 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001702 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 if (value != PyUnicode_AS_UNICODE(obj) ||
1704 len != PyUnicode_GET_SIZE(obj))
1705 return raiseTestError("test_u_code",
1706 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001709 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001710}
1711
Guido van Rossumfb67be22007-08-29 18:38:11 +00001712/* Test Z and Z# codes for PyArg_ParseTuple */
1713static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301714test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001717 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 tuple = PyTuple_New(2);
1721 if (tuple == NULL)
1722 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 obj = PyUnicode_FromString("test");
1725 PyTuple_SET_ITEM(tuple, 0, obj);
1726 Py_INCREF(Py_None);
1727 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 /* swap values on purpose */
1730 value1 = NULL;
1731 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001734 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001736 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 if (value1 != PyUnicode_AS_UNICODE(obj))
1738 return raiseTestError("test_Z_code",
1739 "Z code returned wrong value for 'test'");
1740 if (value2 != NULL)
1741 return raiseTestError("test_Z_code",
1742 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 value1 = NULL;
1745 value2 = PyUnicode_AS_UNICODE(obj);
1746 len1 = -1;
1747 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001750 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1751 &value2, &len2))
1752 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001754 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1756 len1 != PyUnicode_GET_SIZE(obj))
1757 return raiseTestError("test_Z_code",
1758 "Z# code returned wrong values for 'test'");
1759 if (value2 != NULL ||
1760 len2 != 0)
1761 return raiseTestError("test_Z_code",
1762 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 Py_DECREF(tuple);
1765 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001766}
1767
Thomas Wouters477c8d52006-05-27 19:21:47 +00001768static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301769test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001770{
1771#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1773 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001774 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001775#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1777 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1782 if (wide == NULL)
1783 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1786 if (utf8 == NULL) {
1787 Py_DECREF(wide);
1788 return NULL;
1789 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001790
Victor Stinner8ef18872011-11-21 02:06:57 +01001791 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 Py_DECREF(wide);
1793 Py_DECREF(utf8);
1794 return raiseTestError("test_widechar",
1795 "wide string and utf8 string "
1796 "have different length");
1797 }
1798 if (PyUnicode_Compare(wide, utf8)) {
1799 Py_DECREF(wide);
1800 Py_DECREF(utf8);
1801 if (PyErr_Occurred())
1802 return NULL;
1803 return raiseTestError("test_widechar",
1804 "wide string and utf8 string "
1805 "are different");
1806 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 Py_DECREF(wide);
1809 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001810
1811#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1812 wide = PyUnicode_FromWideChar(invalid, 1);
1813 if (wide == NULL)
1814 PyErr_Clear();
1815 else
1816 return raiseTestError("test_widechar",
1817 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1818
1819 wide = PyUnicode_FromUnicode(invalid, 1);
1820 if (wide == NULL)
1821 PyErr_Clear();
1822 else
1823 return raiseTestError("test_widechar",
1824 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001825
1826 wide = PyUnicode_FromUnicode(NULL, 1);
1827 if (wide == NULL)
1828 return NULL;
1829 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001830 if (_PyUnicode_Ready(wide) < 0) {
1831 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001832 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001833 }
1834 else {
1835 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001836 return raiseTestError("test_widechar",
1837 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001838 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001839#endif
1840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001842}
1843
1844static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001845unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001846{
1847 PyObject *unicode, *result;
1848 Py_ssize_t buflen, size;
1849 wchar_t *buffer;
1850
1851 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1852 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001853 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001854 if (buffer == NULL)
1855 return PyErr_NoMemory();
1856
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001857 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001858 if (size == -1) {
1859 PyMem_Free(buffer);
1860 return NULL;
1861 }
1862
1863 if (size < buflen)
1864 buflen = size + 1;
1865 else
1866 buflen = size;
1867 result = PyUnicode_FromWideChar(buffer, buflen);
1868 PyMem_Free(buffer);
1869 if (result == NULL)
1870 return NULL;
1871
1872 return Py_BuildValue("(Nn)", result, size);
1873}
1874
1875static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001876unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001877{
1878 PyObject *unicode, *result;
1879 Py_ssize_t size;
1880 wchar_t *buffer;
1881
1882 if (!PyArg_ParseTuple(args, "U", &unicode))
1883 return NULL;
1884
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001885 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001886 if (buffer == NULL)
1887 return NULL;
1888
1889 result = PyUnicode_FromWideChar(buffer, size + 1);
1890 PyMem_Free(buffer);
1891 if (result == NULL)
1892 return NULL;
1893 return Py_BuildValue("(Nn)", result, size);
1894}
1895
1896static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001897unicode_asucs4(PyObject *self, PyObject *args)
1898{
1899 PyObject *unicode, *result;
1900 Py_UCS4 *buffer;
1901 int copy_null;
1902 Py_ssize_t str_len, buf_len;
1903
1904 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1905 return NULL;
1906 }
1907
1908 buf_len = str_len + 1;
1909 buffer = PyMem_NEW(Py_UCS4, buf_len);
1910 if (buffer == NULL) {
1911 return PyErr_NoMemory();
1912 }
1913 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1914 buffer[str_len] = 0xffffU;
1915
1916 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1917 PyMem_FREE(buffer);
1918 return NULL;
1919 }
1920
1921 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1922 PyMem_FREE(buffer);
1923 return result;
1924}
1925
1926static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001927unicode_findchar(PyObject *self, PyObject *args)
1928{
1929 PyObject *str;
1930 int direction;
1931 unsigned int ch;
1932 Py_ssize_t result;
1933 Py_ssize_t start, end;
1934
1935 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1936 &start, &end, &direction)) {
1937 return NULL;
1938 }
1939
1940 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1941 if (result == -2)
1942 return NULL;
1943 else
1944 return PyLong_FromSsize_t(result);
1945}
1946
1947static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001948unicode_copycharacters(PyObject *self, PyObject *args)
1949{
1950 PyObject *from, *to, *to_copy;
1951 Py_ssize_t from_start, to_start, how_many, copied;
1952
1953 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1954 &from, &from_start, &how_many)) {
1955 return NULL;
1956 }
1957
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001958 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1959 PyUnicode_MAX_CHAR_VALUE(to)))) {
1960 return NULL;
1961 }
1962 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1963 Py_DECREF(to_copy);
1964 return NULL;
1965 }
1966
1967 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1968 from_start, how_many)) < 0) {
1969 Py_DECREF(to_copy);
1970 return NULL;
1971 }
1972
1973 return Py_BuildValue("(Nn)", to_copy, copied);
1974}
1975
1976static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001977unicode_encodedecimal(PyObject *self, PyObject *args)
1978{
1979 Py_UNICODE *unicode;
1980 Py_ssize_t length;
1981 char *errors = NULL;
1982 PyObject *decimal;
1983 Py_ssize_t decimal_length, new_length;
1984 int res;
1985
1986 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1987 return NULL;
1988
1989 decimal_length = length * 7; /* len('&#8364;') */
1990 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1991 if (decimal == NULL)
1992 return NULL;
1993
1994 res = PyUnicode_EncodeDecimal(unicode, length,
1995 PyBytes_AS_STRING(decimal),
1996 errors);
1997 if (res < 0) {
1998 Py_DECREF(decimal);
1999 return NULL;
2000 }
2001
2002 new_length = strlen(PyBytes_AS_STRING(decimal));
2003 assert(new_length <= decimal_length);
2004 res = _PyBytes_Resize(&decimal, new_length);
2005 if (res < 0)
2006 return NULL;
2007
2008 return decimal;
2009}
2010
2011static PyObject *
2012unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2013{
2014 Py_UNICODE *unicode;
2015 Py_ssize_t length;
2016 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2017 return NULL;
2018 return PyUnicode_TransformDecimalToASCII(unicode, length);
2019}
2020
2021static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002022unicode_legacy_string(PyObject *self, PyObject *args)
2023{
2024 Py_UNICODE *data;
2025 Py_ssize_t len;
2026 PyObject *u;
2027
2028 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2029 return NULL;
2030
2031 u = PyUnicode_FromUnicode(NULL, len);
2032 if (u == NULL)
2033 return NULL;
2034
2035 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2036
2037 if (len > 0) { /* The empty string is always ready. */
2038 assert(!PyUnicode_IS_READY(u));
2039 }
2040
2041 return u;
2042}
2043
2044static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002045getargs_w_star(PyObject *self, PyObject *args)
2046{
2047 Py_buffer buffer;
2048 PyObject *result;
2049 char *str;
2050
2051 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2052 return NULL;
2053
2054 if (2 <= buffer.len) {
2055 str = buffer.buf;
2056 str[0] = '[';
2057 str[buffer.len-1] = ']';
2058 }
2059
2060 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2061 PyBuffer_Release(&buffer);
2062 return result;
2063}
2064
2065
2066static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302067test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 /* Test that formats can begin with '|'. See issue #4720. */
2070 PyObject *tuple, *dict = NULL;
2071 static char *kwlist[] = {NULL};
2072 int result;
2073 tuple = PyTuple_New(0);
2074 if (!tuple)
2075 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002076 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 dict = PyDict_New();
2080 if (!dict)
2081 goto done;
2082 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002083 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 Py_DECREF(tuple);
2085 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002086 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002088 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 else {
2090 Py_RETURN_NONE;
2091 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002092}
2093
2094static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002095codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 const char *encoding, *errors = NULL;
2098 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2099 &encoding, &errors))
2100 return NULL;
2101 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002102}
2103
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104static PyObject *
2105codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 const char *encoding, *errors = NULL;
2108 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2109 &encoding, &errors))
2110 return NULL;
2111 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002112}
2113
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002114
Tim Peters5b8132f2003-01-31 15:52:05 +00002115/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002116static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302117test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 struct triple {
2120 long input;
2121 size_t nbits;
2122 int sign;
2123 } testcases[] = {{0, 0, 0},
2124 {1L, 1, 1},
2125 {-1L, 1, -1},
2126 {2L, 2, 1},
2127 {-2L, 2, -1},
2128 {3L, 2, 1},
2129 {-3L, 2, -1},
2130 {4L, 3, 1},
2131 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002132 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 {-0x7fffL, 15, -1},
2134 {0xffffL, 16, 1},
2135 {-0xffffL, 16, -1},
2136 {0xfffffffL, 28, 1},
2137 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002138 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002139
Victor Stinner63941882011-09-29 00:42:28 +02002140 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002141 size_t nbits;
2142 int sign;
2143 PyObject *plong;
2144
2145 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002146 if (plong == NULL)
2147 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002148 nbits = _PyLong_NumBits(plong);
2149 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 Py_DECREF(plong);
2152 if (nbits != testcases[i].nbits)
2153 return raiseTestError("test_long_numbits",
2154 "wrong result for _PyLong_NumBits");
2155 if (sign != testcases[i].sign)
2156 return raiseTestError("test_long_numbits",
2157 "wrong result for _PyLong_Sign");
2158 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002159 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002160}
2161
Thomas Heller519a0422007-11-15 20:48:54 +00002162/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002163
2164static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302165test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2168 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2169 Py_XDECREF(o1);
2170 Py_XDECREF(o2);
2171 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002172}
2173
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002174static PyObject *
2175raise_exception(PyObject *self, PyObject *args)
2176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 PyObject *exc;
2178 PyObject *exc_args, *v;
2179 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2182 &exc, &num_args))
2183 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 exc_args = PyTuple_New(num_args);
2186 if (exc_args == NULL)
2187 return NULL;
2188 for (i = 0; i < num_args; ++i) {
2189 v = PyLong_FromLong(i);
2190 if (v == NULL) {
2191 Py_DECREF(exc_args);
2192 return NULL;
2193 }
2194 PyTuple_SET_ITEM(exc_args, i, v);
2195 }
2196 PyErr_SetObject(exc, exc_args);
2197 Py_DECREF(exc_args);
2198 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002199}
Tim Peters91621db2001-06-12 20:10:01 +00002200
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002201static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002202set_errno(PyObject *self, PyObject *args)
2203{
2204 int new_errno;
2205
2206 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2207 return NULL;
2208
2209 errno = new_errno;
2210 Py_RETURN_NONE;
2211}
2212
2213static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002214test_set_exc_info(PyObject *self, PyObject *args)
2215{
2216 PyObject *orig_exc;
2217 PyObject *new_type, *new_value, *new_tb;
2218 PyObject *type, *value, *tb;
2219 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2220 &new_type, &new_value, &new_tb))
2221 return NULL;
2222
2223 PyErr_GetExcInfo(&type, &value, &tb);
2224
2225 Py_INCREF(new_type);
2226 Py_INCREF(new_value);
2227 Py_INCREF(new_tb);
2228 PyErr_SetExcInfo(new_type, new_value, new_tb);
2229
2230 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2231 Py_XDECREF(type);
2232 Py_XDECREF(value);
2233 Py_XDECREF(tb);
2234 return orig_exc;
2235}
Benjamin Peterson16323982010-02-03 01:13:41 +00002236
2237static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002238
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002239static PyObject *
2240test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (PyDateTimeAPI) {
2242 if (test_run_counter) {
2243 /* Probably regrtest.py -R */
2244 Py_RETURN_NONE;
2245 }
2246 else {
2247 PyErr_SetString(PyExc_AssertionError,
2248 "PyDateTime_CAPI somehow initialized");
2249 return NULL;
2250 }
2251 }
2252 test_run_counter++;
2253 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (PyDateTimeAPI)
2256 Py_RETURN_NONE;
2257 else
2258 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002259}
2260
Paul Ganssle04af5b12018-01-24 17:29:30 -05002261/* Functions exposing the C API type checking for testing */
2262#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2263 PyObject *obj; \
2264 int exact = 0; \
2265 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2266 return NULL; \
2267 } \
2268 int rv = exact?exact_method(obj):check_method(obj); \
2269 if (rv) { \
2270 Py_RETURN_TRUE; \
2271 } else { \
2272 Py_RETURN_FALSE; \
2273 }
2274
2275static PyObject *
2276datetime_check_date(PyObject *self, PyObject *args) {
2277 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2278}
2279
2280static PyObject *
2281datetime_check_time(PyObject *self, PyObject *args) {
2282 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2283}
2284
2285static PyObject *
2286datetime_check_datetime(PyObject *self, PyObject *args) {
2287 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2288}
2289
2290static PyObject *
2291datetime_check_delta(PyObject *self, PyObject *args) {
2292 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2293}
2294
2295static PyObject *
2296datetime_check_tzinfo(PyObject *self, PyObject *args) {
2297 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2298}
2299
2300
2301/* Makes three variations on timezone representing UTC-5:
2302 1. timezone with offset and name from PyDateTimeAPI
2303 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2304 3. timezone with offset (no name) from PyTimeZone_FromOffset
2305*/
2306static PyObject *
2307make_timezones_capi(PyObject *self, PyObject *args) {
2308 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2309 PyObject *name = PyUnicode_FromString("EST");
2310
2311 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2312 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2313 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2314
2315 Py_DecRef(offset);
2316 Py_DecRef(name);
2317
2318 PyObject *rv = PyTuple_New(3);
2319
2320 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2321 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2322 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2323
2324 return rv;
2325}
2326
2327static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002328get_timezones_offset_zero(PyObject *self, PyObject *args) {
2329 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2330 PyObject *name = PyUnicode_FromString("");
2331
2332 // These two should return the UTC singleton
2333 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2334 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2335
2336 // This one will return +00:00 zone, but not the UTC singleton
2337 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2338
2339 Py_DecRef(offset);
2340 Py_DecRef(name);
2341
2342 PyObject *rv = PyTuple_New(3);
2343 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2344 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2345 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2346
2347 return rv;
2348}
2349
2350static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002351get_timezone_utc_capi(PyObject* self, PyObject *args) {
2352 int macro = 0;
2353 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2354 return NULL;
2355 }
2356 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002357 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002358 return PyDateTime_TimeZone_UTC;
2359 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002360 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002361 return PyDateTimeAPI->TimeZone_UTC;
2362 }
2363}
2364
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002365static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002366get_date_fromdate(PyObject *self, PyObject *args)
2367{
2368 PyObject *rv = NULL;
2369 int macro;
2370 int year, month, day;
2371
2372 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2373 return NULL;
2374 }
2375
2376 if (macro) {
2377 rv = PyDate_FromDate(year, month, day);
2378 }
2379 else {
2380 rv = PyDateTimeAPI->Date_FromDate(
2381 year, month, day,
2382 PyDateTimeAPI->DateType);
2383 }
2384 return rv;
2385}
2386
2387static PyObject *
2388get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2389{
2390 PyObject *rv = NULL;
2391 int macro;
2392 int year, month, day;
2393 int hour, minute, second, microsecond;
2394
2395 if (!PyArg_ParseTuple(args, "piiiiiii",
2396 &macro,
2397 &year, &month, &day,
2398 &hour, &minute, &second, &microsecond)) {
2399 return NULL;
2400 }
2401
2402 if (macro) {
2403 rv = PyDateTime_FromDateAndTime(
2404 year, month, day,
2405 hour, minute, second, microsecond);
2406 }
2407 else {
2408 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2409 year, month, day,
2410 hour, minute, second, microsecond,
2411 Py_None,
2412 PyDateTimeAPI->DateTimeType);
2413 }
2414 return rv;
2415}
2416
2417static PyObject *
2418get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2419{
2420 PyObject *rv = NULL;
2421 int macro;
2422 int year, month, day;
2423 int hour, minute, second, microsecond, fold;
2424
2425 if (!PyArg_ParseTuple(args, "piiiiiiii",
2426 &macro,
2427 &year, &month, &day,
2428 &hour, &minute, &second, &microsecond,
2429 &fold)) {
2430 return NULL;
2431 }
2432
2433 if (macro) {
2434 rv = PyDateTime_FromDateAndTimeAndFold(
2435 year, month, day,
2436 hour, minute, second, microsecond,
2437 fold);
2438 }
2439 else {
2440 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2441 year, month, day,
2442 hour, minute, second, microsecond,
2443 Py_None,
2444 fold,
2445 PyDateTimeAPI->DateTimeType);
2446 }
2447 return rv;
2448}
2449
2450static PyObject *
2451get_time_fromtime(PyObject *self, PyObject *args)
2452{
2453 PyObject *rv = NULL;
2454 int macro;
2455 int hour, minute, second, microsecond;
2456
2457 if (!PyArg_ParseTuple(args, "piiii",
2458 &macro,
2459 &hour, &minute, &second, &microsecond)) {
2460 return NULL;
2461 }
2462
2463 if (macro) {
2464 rv = PyTime_FromTime(hour, minute, second, microsecond);
2465 }
2466 else {
2467 rv = PyDateTimeAPI->Time_FromTime(
2468 hour, minute, second, microsecond,
2469 Py_None,
2470 PyDateTimeAPI->TimeType);
2471 }
2472 return rv;
2473}
2474
2475static PyObject *
2476get_time_fromtimeandfold(PyObject *self, PyObject *args)
2477{
2478 PyObject *rv = NULL;
2479 int macro;
2480 int hour, minute, second, microsecond, fold;
2481
2482 if (!PyArg_ParseTuple(args, "piiiii",
2483 &macro,
2484 &hour, &minute, &second, &microsecond,
2485 &fold)) {
2486 return NULL;
2487 }
2488
2489 if (macro) {
2490 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2491 }
2492 else {
2493 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2494 hour, minute, second, microsecond,
2495 Py_None,
2496 fold,
2497 PyDateTimeAPI->TimeType);
2498 }
2499 return rv;
2500}
2501
2502static PyObject *
2503get_delta_fromdsu(PyObject *self, PyObject *args)
2504{
2505 PyObject *rv = NULL;
2506 int macro;
2507 int days, seconds, microseconds;
2508
2509 if (!PyArg_ParseTuple(args, "piii",
2510 &macro,
2511 &days, &seconds, &microseconds)) {
2512 return NULL;
2513 }
2514
2515 if (macro) {
2516 rv = PyDelta_FromDSU(days, seconds, microseconds);
2517 }
2518 else {
2519 rv = PyDateTimeAPI->Delta_FromDelta(
2520 days, seconds, microseconds, 1,
2521 PyDateTimeAPI->DeltaType);
2522 }
2523
2524 return rv;
2525}
2526
2527static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002528get_date_fromtimestamp(PyObject* self, PyObject *args)
2529{
2530 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2531 int macro = 0;
2532
2533 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2534 return NULL;
2535 }
2536
2537 // Construct the argument tuple
2538 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2539 return NULL;
2540 }
2541
2542 // Pass along to the API function
2543 if (macro) {
2544 rv = PyDate_FromTimestamp(tsargs);
2545 }
2546 else {
2547 rv = PyDateTimeAPI->Date_FromTimestamp(
2548 (PyObject *)PyDateTimeAPI->DateType, tsargs
2549 );
2550 }
2551
2552 Py_DECREF(tsargs);
2553 return rv;
2554}
2555
2556static PyObject *
2557get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2558{
2559 int macro = 0;
2560 int usetz = 0;
2561 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2562 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2563 return NULL;
2564 }
2565
2566 // Construct the argument tuple
2567 if (usetz) {
2568 tsargs = PyTuple_Pack(2, ts, tzinfo);
2569 }
2570 else {
2571 tsargs = PyTuple_Pack(1, ts);
2572 }
2573
2574 if (tsargs == NULL) {
2575 return NULL;
2576 }
2577
2578 // Pass along to the API function
2579 if (macro) {
2580 rv = PyDateTime_FromTimestamp(tsargs);
2581 }
2582 else {
2583 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2584 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2585 );
2586 }
2587
2588 Py_DECREF(tsargs);
2589 return rv;
2590}
2591
Benjamin Peterson16323982010-02-03 01:13:41 +00002592
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002593/* test_thread_state spawns a thread of its own, and that thread releases
2594 * `thread_done` when it's finished. The driver code has to know when the
2595 * thread finishes, because the thread uses a PyObject (the callable) that
2596 * may go away when the driver finishes. The former lack of this explicit
2597 * synchronization caused rare segfaults, so rare that they were seen only
2598 * on a Mac buildbot (although they were possible on any box).
2599 */
2600static PyThread_type_lock thread_done = NULL;
2601
Benjamin Petersona786b022008-08-25 21:05:21 +00002602static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002603_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 PyObject *rc;
2606 int success;
2607 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002608 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 success = (rc != NULL);
2610 Py_XDECREF(rc);
2611 PyGILState_Release(s);
2612 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002613}
2614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002615/* Same thing, but releases `thread_done` when it returns. This variant
2616 * should be called only from threads spawned by test_thread_state().
2617 */
2618static void
2619_make_call_from_thread(void *callable)
2620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 _make_call(callable);
2622 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002623}
2624
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002625static PyObject *
2626test_thread_state(PyObject *self, PyObject *args)
2627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 PyObject *fn;
2629 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2632 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (!PyCallable_Check(fn)) {
2635 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2636 fn->ob_type->tp_name);
2637 return NULL;
2638 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 /* Ensure Python is set up for threading */
2641 PyEval_InitThreads();
2642 thread_done = PyThread_allocate_lock();
2643 if (thread_done == NULL)
2644 return PyErr_NoMemory();
2645 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 /* Start a new thread with our callback. */
2648 PyThread_start_new_thread(_make_call_from_thread, fn);
2649 /* Make the callback with the thread lock held by this thread */
2650 success &= _make_call(fn);
2651 /* Do it all again, but this time with the thread-lock released */
2652 Py_BEGIN_ALLOW_THREADS
2653 success &= _make_call(fn);
2654 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2655 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 /* And once more with and without a thread
2658 XXX - should use a lock and work out exactly what we are trying
2659 to test <wink>
2660 */
2661 Py_BEGIN_ALLOW_THREADS
2662 PyThread_start_new_thread(_make_call_from_thread, fn);
2663 success &= _make_call(fn);
2664 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2665 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 /* Release lock we acquired above. This is required on HP-UX. */
2668 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 PyThread_free_lock(thread_done);
2671 if (!success)
2672 return NULL;
2673 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002674}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002675
2676/* test Py_AddPendingCalls using threads */
2677static int _pending_callback(void *arg)
2678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 /* we assume the argument is callable object to which we own a reference */
2680 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002681 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 Py_DECREF(callable);
2683 Py_XDECREF(r);
2684 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002685}
2686
2687/* The following requests n callbacks to _pending_callback. It can be
2688 * run from any python thread.
2689 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002690static PyObject *
2691pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 PyObject *callable;
2694 int r;
2695 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2696 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 /* create the reference for the callbackwhile we hold the lock */
2699 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 Py_BEGIN_ALLOW_THREADS
2702 r = Py_AddPendingCall(&_pending_callback, callable);
2703 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 if (r<0) {
2706 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002707 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002709 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002710}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002711
Neal Norwitzb0d26332007-08-25 00:49:05 +00002712/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002713static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002714test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 PyObject *result;
2717 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002718
Alexander Belopolskye239d232010-12-08 23:31:48 +00002719#define CHECK_1_FORMAT(FORMAT, TYPE) \
2720 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2721 if (result == NULL) \
2722 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002723 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002724 msg = FORMAT " failed at 1"; \
2725 goto Fail; \
2726 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 CHECK_1_FORMAT("%d", int);
2730 CHECK_1_FORMAT("%ld", long);
2731 /* The z width modifier was added in Python 2.5. */
2732 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 /* The u type code was added in Python 2.5. */
2735 CHECK_1_FORMAT("%u", unsigned int);
2736 CHECK_1_FORMAT("%lu", unsigned long);
2737 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002740 CHECK_1_FORMAT("%llu", unsigned long long);
2741 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002744
2745 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 Py_XDECREF(result);
2747 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002748
2749#undef CHECK_1_FORMAT
2750}
2751
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002752
2753static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302754test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2756 int result;
2757 if (py_s == NULL)
2758 return NULL;
2759 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2760 Py_DECREF(py_s);
2761 if (!result) {
2762 PyErr_SetString(TestError, "Python string ending in NULL "
2763 "should not compare equal to c string.");
2764 return NULL;
2765 }
2766 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002767}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002768
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002769/* This is here to provide a docstring for test_descr. */
2770static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302771test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002774}
2775
Mark Dickinson725bfd82009-05-03 20:33:40 +00002776/* Test PyOS_string_to_double. */
2777static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302778test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002780 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782#define CHECK_STRING(STR, expected) \
2783 result = PyOS_string_to_double(STR, NULL, NULL); \
2784 if (result == -1.0 && PyErr_Occurred()) \
2785 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002786 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 msg = "conversion of " STR " to float failed"; \
2788 goto fail; \
2789 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791#define CHECK_INVALID(STR) \
2792 result = PyOS_string_to_double(STR, NULL, NULL); \
2793 if (result == -1.0 && PyErr_Occurred()) { \
2794 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2795 PyErr_Clear(); \
2796 else \
2797 return NULL; \
2798 } \
2799 else { \
2800 msg = "conversion of " STR " didn't raise ValueError"; \
2801 goto fail; \
2802 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 CHECK_STRING("0.1", 0.1);
2805 CHECK_STRING("1.234", 1.234);
2806 CHECK_STRING("-1.35", -1.35);
2807 CHECK_STRING(".1e01", 1.0);
2808 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 CHECK_INVALID(" 0.1");
2811 CHECK_INVALID("\t\n-3");
2812 CHECK_INVALID(".123 ");
2813 CHECK_INVALID("3\n");
2814 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002817 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002819#undef CHECK_STRING
2820#undef CHECK_INVALID
2821}
2822
2823
Benjamin Petersonb173f782009-05-05 22:31:58 +00002824/* Coverage testing of capsule objects. */
2825
2826static const char *capsule_name = "capsule name";
2827static char *capsule_pointer = "capsule pointer";
2828static char *capsule_context = "capsule context";
2829static const char *capsule_error = NULL;
2830static int
2831capsule_destructor_call_count = 0;
2832
2833static void
2834capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 capsule_destructor_call_count++;
2836 if (PyCapsule_GetContext(o) != capsule_context) {
2837 capsule_error = "context did not match in destructor!";
2838 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2839 capsule_error = "destructor did not match in destructor! (woah!)";
2840 } else if (PyCapsule_GetName(o) != capsule_name) {
2841 capsule_error = "name did not match in destructor!";
2842 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2843 capsule_error = "pointer did not match in destructor!";
2844 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002845}
2846
2847typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 char *name;
2849 char *module;
2850 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002851} known_capsule;
2852
2853static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002854test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 PyObject *object;
2857 const char *error = NULL;
2858 void *pointer;
2859 void *pointer2;
2860 known_capsule known_capsules[] = {
2861 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2862 KNOWN_CAPSULE("_socket", "CAPI"),
2863 KNOWN_CAPSULE("_curses", "_C_API"),
2864 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2865 { NULL, NULL },
2866 };
2867 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002868
2869#define FAIL(x) { error = (x); goto exit; }
2870
2871#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 if (capsule_error) { \
2873 FAIL(capsule_error); \
2874 } \
2875 else if (!capsule_destructor_call_count) { \
2876 FAIL("destructor not called!"); \
2877 } \
2878 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2881 PyCapsule_SetContext(object, capsule_context);
2882 capsule_destructor(object);
2883 CHECK_DESTRUCTOR;
2884 Py_DECREF(object);
2885 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 object = PyCapsule_New(known, "ignored", NULL);
2888 PyCapsule_SetPointer(object, capsule_pointer);
2889 PyCapsule_SetName(object, capsule_name);
2890 PyCapsule_SetDestructor(object, capsule_destructor);
2891 PyCapsule_SetContext(object, capsule_context);
2892 capsule_destructor(object);
2893 CHECK_DESTRUCTOR;
2894 /* intentionally access using the wrong name */
2895 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2896 if (!PyErr_Occurred()) {
2897 FAIL("PyCapsule_GetPointer should have failed but did not!");
2898 }
2899 PyErr_Clear();
2900 if (pointer2) {
2901 if (pointer2 == capsule_pointer) {
2902 FAIL("PyCapsule_GetPointer should not have"
2903 " returned the internal pointer!");
2904 } else {
2905 FAIL("PyCapsule_GetPointer should have "
2906 "returned NULL pointer but did not!");
2907 }
2908 }
2909 PyCapsule_SetDestructor(object, NULL);
2910 Py_DECREF(object);
2911 if (capsule_destructor_call_count) {
2912 FAIL("destructor called when it should not have been!");
2913 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 for (known = &known_capsules[0]; known->module != NULL; known++) {
2916 /* yeah, ordinarily I wouldn't do this either,
2917 but it's fine for this test harness.
2918 */
2919 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002920#undef FAIL
2921#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 { \
2923 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2924 x, known->module, known->attribute); \
2925 error = buffer; \
2926 goto exit; \
2927 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 PyObject *module = PyImport_ImportModule(known->module);
2930 if (module) {
2931 pointer = PyCapsule_Import(known->name, 0);
2932 if (!pointer) {
2933 Py_DECREF(module);
2934 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2935 }
2936 object = PyObject_GetAttrString(module, known->attribute);
2937 if (!object) {
2938 Py_DECREF(module);
2939 return NULL;
2940 }
2941 pointer2 = PyCapsule_GetPointer(object,
2942 "weebles wobble but they don't fall down");
2943 if (!PyErr_Occurred()) {
2944 Py_DECREF(object);
2945 Py_DECREF(module);
2946 FAIL("PyCapsule_GetPointer should have failed but did not!");
2947 }
2948 PyErr_Clear();
2949 if (pointer2) {
2950 Py_DECREF(module);
2951 Py_DECREF(object);
2952 if (pointer2 == pointer) {
2953 FAIL("PyCapsule_GetPointer should not have"
2954 " returned its internal pointer!");
2955 } else {
2956 FAIL("PyCapsule_GetPointer should have"
2957 " returned NULL pointer but did not!");
2958 }
2959 }
2960 Py_DECREF(object);
2961 Py_DECREF(module);
2962 }
2963 else
2964 PyErr_Clear();
2965 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002966
2967 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 if (error) {
2969 return raiseTestError("test_capsule", error);
2970 }
2971 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002972#undef FAIL
2973}
2974
Guido van Rossumddefaf32007-01-14 03:31:43 +00002975#ifdef HAVE_GETTIMEOFDAY
2976/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002977static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 e->tv_sec -= s->tv_sec;
2980 e->tv_usec -= s->tv_usec;
2981 if (e->tv_usec < 0) {
2982 e->tv_sec -=1;
2983 e->tv_usec += 1000000;
2984 }
2985 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002986}
2987
2988static PyObject *
2989profile_int(PyObject *self, PyObject* args)
2990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 int i, k;
2992 struct timeval start, stop;
2993 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 /* Test 1: Allocate and immediately deallocate
2996 many small integers */
2997 gettimeofday(&start, NULL);
2998 for(k=0; k < 20000; k++)
2999 for(i=0; i < 1000; i++) {
3000 single = PyLong_FromLong(i);
3001 Py_DECREF(single);
3002 }
3003 gettimeofday(&stop, NULL);
3004 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 /* Test 2: Allocate and immediately deallocate
3007 many large integers */
3008 gettimeofday(&start, NULL);
3009 for(k=0; k < 20000; k++)
3010 for(i=0; i < 1000; i++) {
3011 single = PyLong_FromLong(i+1000000);
3012 Py_DECREF(single);
3013 }
3014 gettimeofday(&stop, NULL);
3015 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 /* Test 3: Allocate a few integers, then release
3018 them all simultaneously. */
3019 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003020 if (multiple == NULL)
3021 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 gettimeofday(&start, NULL);
3023 for(k=0; k < 20000; k++) {
3024 for(i=0; i < 1000; i++) {
3025 multiple[i] = PyLong_FromLong(i+1000000);
3026 }
3027 for(i=0; i < 1000; i++) {
3028 Py_DECREF(multiple[i]);
3029 }
3030 }
3031 gettimeofday(&stop, NULL);
3032 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003033 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 /* Test 4: Allocate many integers, then release
3036 them all simultaneously. */
3037 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003038 if (multiple == NULL)
3039 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 gettimeofday(&start, NULL);
3041 for(k=0; k < 20; k++) {
3042 for(i=0; i < 1000000; i++) {
3043 multiple[i] = PyLong_FromLong(i+1000000);
3044 }
3045 for(i=0; i < 1000000; i++) {
3046 Py_DECREF(multiple[i]);
3047 }
3048 }
3049 gettimeofday(&stop, NULL);
3050 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003051 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 /* Test 5: Allocate many integers < 32000 */
3054 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003055 if (multiple == NULL)
3056 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 gettimeofday(&start, NULL);
3058 for(k=0; k < 10; k++) {
3059 for(i=0; i < 1000000; i++) {
3060 multiple[i] = PyLong_FromLong(i+1000);
3061 }
3062 for(i=0; i < 1000000; i++) {
3063 Py_DECREF(multiple[i]);
3064 }
3065 }
3066 gettimeofday(&stop, NULL);
3067 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003068 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 /* Test 6: Perform small int addition */
3071 op1 = PyLong_FromLong(1);
3072 gettimeofday(&start, NULL);
3073 for(i=0; i < 10000000; i++) {
3074 result = PyNumber_Add(op1, op1);
3075 Py_DECREF(result);
3076 }
3077 gettimeofday(&stop, NULL);
3078 Py_DECREF(op1);
3079 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 /* Test 7: Perform medium int addition */
3082 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003083 if (op1 == NULL)
3084 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 gettimeofday(&start, NULL);
3086 for(i=0; i < 10000000; i++) {
3087 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003088 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 }
3090 gettimeofday(&stop, NULL);
3091 Py_DECREF(op1);
3092 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003093
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003094 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003095}
3096#endif
3097
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003098/* To test the format of tracebacks as printed out. */
3099static PyObject *
3100traceback_print(PyObject *self, PyObject *args)
3101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 PyObject *file;
3103 PyObject *traceback;
3104 int result;
3105
3106 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3107 &traceback, &file))
3108 return NULL;
3109
3110 result = PyTraceBack_Print(traceback, file);
3111 if (result < 0)
3112 return NULL;
3113 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003114}
3115
Benjamin Petersone6528212008-07-15 15:32:09 +00003116/* To test the format of exceptions as printed out. */
3117static PyObject *
3118exception_print(PyObject *self, PyObject *args)
3119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 PyObject *value;
3121 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 if (!PyArg_ParseTuple(args, "O:exception_print",
3124 &value))
3125 return NULL;
3126 if (!PyExceptionInstance_Check(value)) {
3127 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3128 return NULL;
3129 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 tb = PyException_GetTraceback(value);
3132 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3133 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003136}
3137
3138
3139
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003140
3141/* reliably raise a MemoryError */
3142static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303143raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 PyErr_NoMemory();
3146 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003147}
3148
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003149/* Issue 6012 */
3150static PyObject *str1, *str2;
3151static int
3152failing_converter(PyObject *obj, void *arg)
3153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 /* Clone str1, then let the conversion fail. */
3155 assert(str1);
3156 str2 = str1;
3157 Py_INCREF(str2);
3158 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003159}
3160static PyObject*
3161argparsing(PyObject *o, PyObject *args)
3162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 PyObject *res;
3164 str1 = str2 = NULL;
3165 if (!PyArg_ParseTuple(args, "O&O&",
3166 PyUnicode_FSConverter, &str1,
3167 failing_converter, &str2)) {
3168 if (!str2)
3169 /* argument converter not called? */
3170 return NULL;
3171 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003172 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 Py_DECREF(str2);
3174 PyErr_Clear();
3175 return res;
3176 }
3177 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003178}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003179
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003180/* To test that the result of PyCode_NewEmpty has the right members. */
3181static PyObject *
3182code_newempty(PyObject *self, PyObject *args)
3183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 const char *filename;
3185 const char *funcname;
3186 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3189 &filename, &funcname, &firstlineno))
3190 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003193}
3194
Georg Brandl1e28a272009-12-28 08:41:01 +00003195/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3196 Run via Lib/test/test_exceptions.py */
3197static PyObject *
3198make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 const char *name;
3201 const char *doc = NULL;
3202 PyObject *base = NULL;
3203 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3208 "s|sOO:make_exception_with_doc", kwlist,
3209 &name, &doc, &base, &dict))
3210 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003213}
3214
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003215static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303216make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003217{
3218 Py_buffer info;
3219 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3220 return NULL;
3221 return PyMemoryView_FromBuffer(&info);
3222}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003223
Stefan Krah7213fcc2015-02-01 16:19:23 +01003224static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003225test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003226{
3227 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3228 int init[5] = {0, 1, 2, 3, 4};
3229 Py_ssize_t itemsize = sizeof(int);
3230 Py_ssize_t shape = 5;
3231 Py_ssize_t strides = 2 * itemsize;
3232 Py_buffer view = {
3233 data,
3234 NULL,
3235 5 * itemsize,
3236 itemsize,
3237 1,
3238 1,
3239 NULL,
3240 &shape,
3241 &strides,
3242 NULL,
3243 NULL
3244 };
3245 int *ptr;
3246 int i;
3247
3248 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3249 ptr = view.buf;
3250 for (i = 0; i < 5; i++) {
3251 if (ptr[2*i] != i) {
3252 PyErr_SetString(TestError,
3253 "test_from_contiguous: incorrect result");
3254 return NULL;
3255 }
3256 }
3257
3258 view.buf = &data[8];
3259 view.strides[0] = -2 * itemsize;
3260
3261 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3262 ptr = view.buf;
3263 for (i = 0; i < 5; i++) {
3264 if (*(ptr-2*i) != i) {
3265 PyErr_SetString(TestError,
3266 "test_from_contiguous: incorrect result");
3267 return NULL;
3268 }
3269 }
3270
3271 Py_RETURN_NONE;
3272}
Stefan Krah650c1e82015-02-03 21:43:23 +01003273
Stefan Kraha7559c02015-02-03 22:27:21 +01003274#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003275extern PyTypeObject _PyBytesIOBuffer_Type;
3276
Stefan Krah5178d912015-02-03 16:57:21 +01003277static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003278test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003279{
Stefan Krah650c1e82015-02-03 21:43:23 +01003280 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003281 PyObject *b;
3282 char *dummy[1];
3283 int ret, match;
3284
Stefan Krah650c1e82015-02-03 21:43:23 +01003285 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003286 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3287 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3288 PyErr_Clear();
3289 if (ret != -1 || match == 0)
3290 goto error;
3291
Stefan Krah650c1e82015-02-03 21:43:23 +01003292 /* bytesiobuf_getbuffer() */
3293 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003294 if (b == NULL) {
3295 return NULL;
3296 }
3297
3298 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3299 Py_DECREF(b);
3300 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3301 PyErr_Clear();
3302 if (ret != -1 || match == 0)
3303 goto error;
3304
3305 Py_RETURN_NONE;
3306
3307error:
3308 PyErr_SetString(TestError,
3309 "test_pep3118_obsolete_write_locks: failure");
3310 return NULL;
3311}
Stefan Kraha7559c02015-02-03 22:27:21 +01003312#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003313
Stefan Krah650c1e82015-02-03 21:43:23 +01003314/* This tests functions that historically supported write locks. It is
3315 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3316 is entitled to segfault in that case. */
3317static PyObject *
3318getbuffer_with_null_view(PyObject* self, PyObject *obj)
3319{
3320 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3321 return NULL;
3322
3323 Py_RETURN_NONE;
3324}
3325
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003326/* Test that the fatal error from not having a current thread doesn't
3327 cause an infinite loop. Run via Lib/test/test_capi.py */
3328static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303329crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003330{
3331 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003332 /* Using PyThreadState_Get() directly allows the test to pass in
3333 !pydebug mode. However, the test only actually tests anything
3334 in pydebug mode, since that's where the infinite loop was in
3335 the first place. */
3336 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003337 Py_END_ALLOW_THREADS
3338 return NULL;
3339}
3340
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003341/* To run some code in a sub-interpreter. */
3342static PyObject *
3343run_in_subinterp(PyObject *self, PyObject *args)
3344{
3345 const char *code;
3346 int r;
3347 PyThreadState *substate, *mainstate;
3348
3349 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3350 &code))
3351 return NULL;
3352
3353 mainstate = PyThreadState_Get();
3354
3355 PyThreadState_Swap(NULL);
3356
3357 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003358 if (substate == NULL) {
3359 /* Since no new thread state was created, there is no exception to
3360 propagate; raise a fresh one after swapping in the old thread
3361 state. */
3362 PyThreadState_Swap(mainstate);
3363 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3364 return NULL;
3365 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003366 r = PyRun_SimpleString(code);
3367 Py_EndInterpreter(substate);
3368
3369 PyThreadState_Swap(mainstate);
3370
3371 return PyLong_FromLong(r);
3372}
3373
Victor Stinner3c1b3792014-02-17 00:02:43 +01003374static int
3375check_time_rounding(int round)
3376{
Victor Stinner74474232015-09-02 01:43:56 +02003377 if (round != _PyTime_ROUND_FLOOR
3378 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003379 && round != _PyTime_ROUND_HALF_EVEN
3380 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003381 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3382 return -1;
3383 }
3384 return 0;
3385}
3386
Victor Stinner5d272cc2012-03-13 13:35:55 +01003387static PyObject *
3388test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3389{
3390 PyObject *obj;
3391 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003392 int round;
3393 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003394 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003395 if (check_time_rounding(round) < 0)
3396 return NULL;
3397 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003398 return NULL;
3399 return _PyLong_FromTime_t(sec);
3400}
3401
3402static PyObject *
3403test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3404{
3405 PyObject *obj;
3406 time_t sec;
3407 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003408 int round;
3409 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003410 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003411 if (check_time_rounding(round) < 0)
3412 return NULL;
3413 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003414 return NULL;
3415 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3416}
3417
Victor Stinner643cd682012-03-02 22:54:03 +01003418static PyObject *
3419test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3420{
3421 PyObject *obj;
3422 time_t sec;
3423 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003424 int round;
3425 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003426 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003427 if (check_time_rounding(round) < 0)
3428 return NULL;
3429 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003430 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003431 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003432}
3433
Antoine Pitrou796564c2013-07-30 19:59:21 +02003434static void
3435slot_tp_del(PyObject *self)
3436{
3437 _Py_IDENTIFIER(__tp_del__);
3438 PyObject *del, *res;
3439 PyObject *error_type, *error_value, *error_traceback;
3440
3441 /* Temporarily resurrect the object. */
3442 assert(self->ob_refcnt == 0);
3443 self->ob_refcnt = 1;
3444
3445 /* Save the current exception, if any. */
3446 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3447
3448 /* Execute __del__ method, if any. */
3449 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3450 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003451 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003452 if (res == NULL)
3453 PyErr_WriteUnraisable(del);
3454 else
3455 Py_DECREF(res);
3456 Py_DECREF(del);
3457 }
3458
3459 /* Restore the saved exception. */
3460 PyErr_Restore(error_type, error_value, error_traceback);
3461
3462 /* Undo the temporary resurrection; can't use DECREF here, it would
3463 * cause a recursive call.
3464 */
3465 assert(self->ob_refcnt > 0);
3466 if (--self->ob_refcnt == 0)
3467 return; /* this is the normal path out */
3468
3469 /* __del__ resurrected it! Make it look like the original Py_DECREF
3470 * never happened.
3471 */
3472 {
3473 Py_ssize_t refcnt = self->ob_refcnt;
3474 _Py_NewReference(self);
3475 self->ob_refcnt = refcnt;
3476 }
INADA Naokid8521422018-05-17 11:07:21 +09003477 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003478 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3479 * we need to undo that. */
3480 _Py_DEC_REFTOTAL;
3481 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3482 * chain, so no more to do there.
3483 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3484 * _Py_NewReference bumped tp_allocs: both of those need to be
3485 * undone.
3486 */
3487#ifdef COUNT_ALLOCS
3488 --Py_TYPE(self)->tp_frees;
3489 --Py_TYPE(self)->tp_allocs;
3490#endif
3491}
3492
3493static PyObject *
3494with_tp_del(PyObject *self, PyObject *args)
3495{
3496 PyObject *obj;
3497 PyTypeObject *tp;
3498
3499 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3500 return NULL;
3501 tp = (PyTypeObject *) obj;
3502 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3503 PyErr_Format(PyExc_TypeError,
3504 "heap type expected, got %R", obj);
3505 return NULL;
3506 }
3507 tp->tp_del = slot_tp_del;
3508 Py_INCREF(obj);
3509 return obj;
3510}
3511
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003512static PyMethodDef ml;
3513
3514static PyObject *
3515create_cfunction(PyObject *self, PyObject *args)
3516{
3517 return PyCFunction_NewEx(&ml, self, NULL);
3518}
3519
3520static PyMethodDef ml = {
3521 "create_cfunction",
3522 create_cfunction,
3523 METH_NOARGS,
3524 NULL
3525};
3526
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003527static PyObject *
3528_test_incref(PyObject *ob)
3529{
3530 Py_INCREF(ob);
3531 return ob;
3532}
3533
3534static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303535test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003536{
3537 PyObject *obj = PyLong_FromLong(0);
3538 Py_XINCREF(_test_incref(obj));
3539 Py_DECREF(obj);
3540 Py_DECREF(obj);
3541 Py_DECREF(obj);
3542 Py_RETURN_NONE;
3543}
3544
3545static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303546test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003547{
3548 PyObject *obj = PyLong_FromLong(0);
3549 Py_INCREF(_test_incref(obj));
3550 Py_DECREF(obj);
3551 Py_DECREF(obj);
3552 Py_DECREF(obj);
3553 Py_RETURN_NONE;
3554}
3555
3556static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303557test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003558{
3559 Py_XDECREF(PyLong_FromLong(0));
3560 Py_RETURN_NONE;
3561}
3562
3563static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303564test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003565{
3566 Py_DECREF(PyLong_FromLong(0));
3567 Py_RETURN_NONE;
3568}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003569
Victor Stinner0507bf52013-07-07 02:05:46 +02003570static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003571test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3572 PyObject *Py_UNUSED(args))
3573{
3574 PyStructSequence_Desc descr;
3575 PyStructSequence_Field descr_fields[3];
3576
3577 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3578 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3579 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3580
3581 descr.name = "_testcapi.test_descr";
3582 descr.doc = "This is used to test for memory leaks in NewType";
3583 descr.fields = descr_fields;
3584 descr.n_in_sequence = 1;
3585
3586 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3587 assert(structseq_type != NULL);
3588 assert(PyType_Check(structseq_type));
3589 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3590 Py_DECREF(structseq_type);
3591
3592 Py_RETURN_NONE;
3593}
3594
3595static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303596test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003597{
3598 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003599 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003600 Py_DecRef(obj);
3601 Py_DecRef(obj);
3602 Py_RETURN_NONE;
3603}
3604
3605static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303606test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003607{
3608 void *ptr;
3609
Victor Stinnerdb067af2014-05-02 22:31:14 +02003610 ptr = PyMem_RawMalloc(0);
3611 if (ptr == NULL) {
3612 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3613 return NULL;
3614 }
3615 PyMem_RawFree(ptr);
3616
3617 ptr = PyMem_RawCalloc(0, 0);
3618 if (ptr == NULL) {
3619 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3620 return NULL;
3621 }
3622 PyMem_RawFree(ptr);
3623
Victor Stinner0507bf52013-07-07 02:05:46 +02003624 ptr = PyMem_Malloc(0);
3625 if (ptr == NULL) {
3626 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3627 return NULL;
3628 }
3629 PyMem_Free(ptr);
3630
Victor Stinnerdb067af2014-05-02 22:31:14 +02003631 ptr = PyMem_Calloc(0, 0);
3632 if (ptr == NULL) {
3633 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3634 return NULL;
3635 }
3636 PyMem_Free(ptr);
3637
Victor Stinner0507bf52013-07-07 02:05:46 +02003638 ptr = PyObject_Malloc(0);
3639 if (ptr == NULL) {
3640 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3641 return NULL;
3642 }
3643 PyObject_Free(ptr);
3644
Victor Stinnerdb067af2014-05-02 22:31:14 +02003645 ptr = PyObject_Calloc(0, 0);
3646 if (ptr == NULL) {
3647 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3648 return NULL;
3649 }
3650 PyObject_Free(ptr);
3651
Victor Stinner0507bf52013-07-07 02:05:46 +02003652 Py_RETURN_NONE;
3653}
3654
3655typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003656 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003657
3658 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003659 size_t calloc_nelem;
3660 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003661 void *realloc_ptr;
3662 size_t realloc_new_size;
3663 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003664 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003665} alloc_hook_t;
3666
Victor Stinner9ed83c42017-10-31 12:18:10 -07003667static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003668{
3669 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003670 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003671 hook->malloc_size = size;
3672 return hook->alloc.malloc(hook->alloc.ctx, size);
3673}
3674
Victor Stinner9ed83c42017-10-31 12:18:10 -07003675static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003676{
3677 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003678 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003679 hook->calloc_nelem = nelem;
3680 hook->calloc_elsize = elsize;
3681 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3682}
3683
Victor Stinner9ed83c42017-10-31 12:18:10 -07003684static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003685{
3686 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003687 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003688 hook->realloc_ptr = ptr;
3689 hook->realloc_new_size = new_size;
3690 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3691}
3692
Victor Stinner9ed83c42017-10-31 12:18:10 -07003693static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003694{
3695 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003696 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003697 hook->free_ptr = ptr;
3698 hook->alloc.free(hook->alloc.ctx, ptr);
3699}
3700
3701static PyObject *
3702test_setallocators(PyMemAllocatorDomain domain)
3703{
3704 PyObject *res = NULL;
3705 const char *error_msg;
3706 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003707 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003708 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003709 void *ptr, *ptr2;
3710
Victor Stinnerdb067af2014-05-02 22:31:14 +02003711 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003712
3713 alloc.ctx = &hook;
3714 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003715 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003716 alloc.realloc = &hook_realloc;
3717 alloc.free = &hook_free;
3718 PyMem_GetAllocator(domain, &hook.alloc);
3719 PyMem_SetAllocator(domain, &alloc);
3720
Victor Stinner9ed83c42017-10-31 12:18:10 -07003721 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003722 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003723 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003724 switch(domain)
3725 {
3726 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3727 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3728 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3729 default: ptr = NULL; break;
3730 }
3731
Victor Stinner9ed83c42017-10-31 12:18:10 -07003732#define CHECK_CTX(FUNC) \
3733 if (hook.ctx != &hook) { \
3734 error_msg = FUNC " wrong context"; \
3735 goto fail; \
3736 } \
3737 hook.ctx = NULL; /* reset for next check */
3738
Victor Stinner0507bf52013-07-07 02:05:46 +02003739 if (ptr == NULL) {
3740 error_msg = "malloc failed";
3741 goto fail;
3742 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003743 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003744 if (hook.malloc_size != size) {
3745 error_msg = "malloc invalid size";
3746 goto fail;
3747 }
3748
3749 size2 = 200;
3750 switch(domain)
3751 {
3752 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3753 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3754 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003755 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003756 }
3757
3758 if (ptr2 == NULL) {
3759 error_msg = "realloc failed";
3760 goto fail;
3761 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003762 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003763 if (hook.realloc_ptr != ptr
3764 || hook.realloc_new_size != size2) {
3765 error_msg = "realloc invalid parameters";
3766 goto fail;
3767 }
3768
3769 switch(domain)
3770 {
3771 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3772 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3773 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3774 }
3775
Victor Stinner9ed83c42017-10-31 12:18:10 -07003776 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003777 if (hook.free_ptr != ptr2) {
3778 error_msg = "free invalid pointer";
3779 goto fail;
3780 }
3781
Victor Stinner9ed83c42017-10-31 12:18:10 -07003782 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003783 nelem = 2;
3784 elsize = 5;
3785 switch(domain)
3786 {
3787 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3788 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3789 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3790 default: ptr = NULL; break;
3791 }
3792
3793 if (ptr == NULL) {
3794 error_msg = "calloc failed";
3795 goto fail;
3796 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003797 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003798 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3799 error_msg = "calloc invalid nelem or elsize";
3800 goto fail;
3801 }
3802
Victor Stinner9ed83c42017-10-31 12:18:10 -07003803 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003804 switch(domain)
3805 {
3806 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3807 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3808 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3809 }
3810
Victor Stinner9ed83c42017-10-31 12:18:10 -07003811 CHECK_CTX("calloc free");
3812 if (hook.free_ptr != ptr) {
3813 error_msg = "calloc free invalid pointer";
3814 goto fail;
3815 }
3816
Victor Stinner0507bf52013-07-07 02:05:46 +02003817 Py_INCREF(Py_None);
3818 res = Py_None;
3819 goto finally;
3820
3821fail:
3822 PyErr_SetString(PyExc_RuntimeError, error_msg);
3823
3824finally:
3825 PyMem_SetAllocator(domain, &hook.alloc);
3826 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003827
3828#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003829}
3830
3831static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303832test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003833{
3834 return test_setallocators(PYMEM_DOMAIN_RAW);
3835}
3836
3837static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303838test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003839{
3840 return test_setallocators(PYMEM_DOMAIN_MEM);
3841}
3842
3843static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303844test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003845{
3846 return test_setallocators(PYMEM_DOMAIN_OBJ);
3847}
3848
xdegaye85f64302017-07-01 14:14:45 +02003849/* Most part of the following code is inherited from the pyfailmalloc project
3850 * written by Victor Stinner. */
3851static struct {
3852 int installed;
3853 PyMemAllocatorEx raw;
3854 PyMemAllocatorEx mem;
3855 PyMemAllocatorEx obj;
3856} FmHook;
3857
3858static struct {
3859 int start;
3860 int stop;
3861 Py_ssize_t count;
3862} FmData;
3863
3864static int
3865fm_nomemory(void)
3866{
3867 FmData.count++;
3868 if (FmData.count > FmData.start &&
3869 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3870 return 1;
3871 }
3872 return 0;
3873}
3874
3875static void *
3876hook_fmalloc(void *ctx, size_t size)
3877{
3878 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3879 if (fm_nomemory()) {
3880 return NULL;
3881 }
3882 return alloc->malloc(alloc->ctx, size);
3883}
3884
3885static void *
3886hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3887{
3888 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3889 if (fm_nomemory()) {
3890 return NULL;
3891 }
3892 return alloc->calloc(alloc->ctx, nelem, elsize);
3893}
3894
3895static void *
3896hook_frealloc(void *ctx, void *ptr, size_t new_size)
3897{
3898 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3899 if (fm_nomemory()) {
3900 return NULL;
3901 }
3902 return alloc->realloc(alloc->ctx, ptr, new_size);
3903}
3904
3905static void
3906hook_ffree(void *ctx, void *ptr)
3907{
3908 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3909 alloc->free(alloc->ctx, ptr);
3910}
3911
3912static void
3913fm_setup_hooks(void)
3914{
3915 PyMemAllocatorEx alloc;
3916
3917 if (FmHook.installed) {
3918 return;
3919 }
3920 FmHook.installed = 1;
3921
3922 alloc.malloc = hook_fmalloc;
3923 alloc.calloc = hook_fcalloc;
3924 alloc.realloc = hook_frealloc;
3925 alloc.free = hook_ffree;
3926 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3927 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3928 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3929
3930 alloc.ctx = &FmHook.raw;
3931 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3932
3933 alloc.ctx = &FmHook.mem;
3934 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3935
3936 alloc.ctx = &FmHook.obj;
3937 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3938}
3939
3940static void
3941fm_remove_hooks(void)
3942{
3943 if (FmHook.installed) {
3944 FmHook.installed = 0;
3945 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3946 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3947 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3948 }
3949}
3950
3951static PyObject*
3952set_nomemory(PyObject *self, PyObject *args)
3953{
3954 /* Memory allocation fails after 'start' allocation requests, and until
3955 * 'stop' allocation requests except when 'stop' is negative or equal
3956 * to 0 (default) in which case allocation failures never stop. */
3957 FmData.count = 0;
3958 FmData.stop = 0;
3959 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3960 return NULL;
3961 }
3962 fm_setup_hooks();
3963 Py_RETURN_NONE;
3964}
3965
3966static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303967remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003968{
3969 fm_remove_hooks();
3970 Py_RETURN_NONE;
3971}
3972
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003973PyDoc_STRVAR(docstring_empty,
3974""
3975);
3976
3977PyDoc_STRVAR(docstring_no_signature,
3978"This docstring has no signature."
3979);
3980
3981PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003982"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003983"\n"
3984"This docstring has an invalid signature."
3985);
3986
Larry Hastings2623c8c2014-02-08 22:15:29 -08003987PyDoc_STRVAR(docstring_with_invalid_signature2,
3988"docstring_with_invalid_signature2($module, /, boo)\n"
3989"\n"
3990"--\n"
3991"\n"
3992"This docstring also has an invalid signature."
3993);
3994
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003995PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003996"docstring_with_signature($module, /, sig)\n"
3997"--\n"
3998"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003999"This docstring has a valid signature."
4000);
4001
Zachary Ware8ef887c2015-04-13 18:22:35 -05004002PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4003"docstring_with_signature_but_no_doc($module, /, sig)\n"
4004"--\n"
4005"\n"
4006);
4007
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004008PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004009"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4010"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004011"\n"
4012"\n"
4013"This docstring has a valid signature and some extra newlines."
4014);
4015
Larry Hastings16c51912014-01-07 11:53:01 -08004016PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004017"docstring_with_signature_with_defaults(module, s='avocado',\n"
4018" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4019" local=the_number_three, sys=sys.maxsize,\n"
4020" exp=sys.maxsize - 1)\n"
4021"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004022"\n"
4023"\n"
4024"\n"
4025"This docstring has a valid signature with parameters,\n"
4026"and the parameters take defaults of varying types."
4027);
4028
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004029typedef struct {
4030 PyThread_type_lock start_event;
4031 PyThread_type_lock exit_event;
4032 PyObject *callback;
4033} test_c_thread_t;
4034
4035static void
4036temporary_c_thread(void *data)
4037{
4038 test_c_thread_t *test_c_thread = data;
4039 PyGILState_STATE state;
4040 PyObject *res;
4041
4042 PyThread_release_lock(test_c_thread->start_event);
4043
4044 /* Allocate a Python thread state for this thread */
4045 state = PyGILState_Ensure();
4046
Victor Stinner3466bde2016-09-05 18:16:01 -07004047 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004048 Py_CLEAR(test_c_thread->callback);
4049
4050 if (res == NULL) {
4051 PyErr_Print();
4052 }
4053 else {
4054 Py_DECREF(res);
4055 }
4056
4057 /* Destroy the Python thread state for this thread */
4058 PyGILState_Release(state);
4059
4060 PyThread_release_lock(test_c_thread->exit_event);
4061
4062 PyThread_exit_thread();
4063}
4064
4065static PyObject *
4066call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4067{
4068 PyObject *res = NULL;
4069 test_c_thread_t test_c_thread;
4070 long thread;
4071
4072 PyEval_InitThreads();
4073
4074 test_c_thread.start_event = PyThread_allocate_lock();
4075 test_c_thread.exit_event = PyThread_allocate_lock();
4076 test_c_thread.callback = NULL;
4077 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4078 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4079 goto exit;
4080 }
4081
4082 Py_INCREF(callback);
4083 test_c_thread.callback = callback;
4084
4085 PyThread_acquire_lock(test_c_thread.start_event, 1);
4086 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4087
4088 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4089 if (thread == -1) {
4090 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4091 PyThread_release_lock(test_c_thread.start_event);
4092 PyThread_release_lock(test_c_thread.exit_event);
4093 goto exit;
4094 }
4095
4096 PyThread_acquire_lock(test_c_thread.start_event, 1);
4097 PyThread_release_lock(test_c_thread.start_event);
4098
4099 Py_BEGIN_ALLOW_THREADS
4100 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4101 PyThread_release_lock(test_c_thread.exit_event);
4102 Py_END_ALLOW_THREADS
4103
4104 Py_INCREF(Py_None);
4105 res = Py_None;
4106
4107exit:
4108 Py_CLEAR(test_c_thread.callback);
4109 if (test_c_thread.start_event)
4110 PyThread_free_lock(test_c_thread.start_event);
4111 if (test_c_thread.exit_event)
4112 PyThread_free_lock(test_c_thread.exit_event);
4113 return res;
4114}
Victor Stinner13105102013-12-13 02:17:29 +01004115
Serhiy Storchakab5181342015-02-06 08:58:56 +02004116/* marshal */
4117
4118static PyObject*
4119pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4120{
4121 long value;
4122 char *filename;
4123 int version;
4124 FILE *fp;
4125
4126 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4127 &value, &filename, &version))
4128 return NULL;
4129
4130 fp = fopen(filename, "wb");
4131 if (fp == NULL) {
4132 PyErr_SetFromErrno(PyExc_OSError);
4133 return NULL;
4134 }
4135
4136 PyMarshal_WriteLongToFile(value, fp, version);
4137
4138 fclose(fp);
4139 if (PyErr_Occurred())
4140 return NULL;
4141 Py_RETURN_NONE;
4142}
4143
4144static PyObject*
4145pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4146{
4147 PyObject *obj;
4148 char *filename;
4149 int version;
4150 FILE *fp;
4151
4152 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4153 &obj, &filename, &version))
4154 return NULL;
4155
4156 fp = fopen(filename, "wb");
4157 if (fp == NULL) {
4158 PyErr_SetFromErrno(PyExc_OSError);
4159 return NULL;
4160 }
4161
4162 PyMarshal_WriteObjectToFile(obj, fp, version);
4163
4164 fclose(fp);
4165 if (PyErr_Occurred())
4166 return NULL;
4167 Py_RETURN_NONE;
4168}
4169
4170static PyObject*
4171pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4172{
4173 int value;
4174 long pos;
4175 char *filename;
4176 FILE *fp;
4177
4178 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4179 return NULL;
4180
4181 fp = fopen(filename, "rb");
4182 if (fp == NULL) {
4183 PyErr_SetFromErrno(PyExc_OSError);
4184 return NULL;
4185 }
4186
4187 value = PyMarshal_ReadShortFromFile(fp);
4188 pos = ftell(fp);
4189
4190 fclose(fp);
4191 if (PyErr_Occurred())
4192 return NULL;
4193 return Py_BuildValue("il", value, pos);
4194}
4195
4196static PyObject*
4197pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4198{
4199 long value, pos;
4200 char *filename;
4201 FILE *fp;
4202
4203 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4204 return NULL;
4205
4206 fp = fopen(filename, "rb");
4207 if (fp == NULL) {
4208 PyErr_SetFromErrno(PyExc_OSError);
4209 return NULL;
4210 }
4211
4212 value = PyMarshal_ReadLongFromFile(fp);
4213 pos = ftell(fp);
4214
4215 fclose(fp);
4216 if (PyErr_Occurred())
4217 return NULL;
4218 return Py_BuildValue("ll", value, pos);
4219}
4220
4221static PyObject*
4222pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4223{
4224 PyObject *obj;
4225 long pos;
4226 char *filename;
4227 FILE *fp;
4228
4229 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4230 return NULL;
4231
4232 fp = fopen(filename, "rb");
4233 if (fp == NULL) {
4234 PyErr_SetFromErrno(PyExc_OSError);
4235 return NULL;
4236 }
4237
4238 obj = PyMarshal_ReadLastObjectFromFile(fp);
4239 pos = ftell(fp);
4240
4241 fclose(fp);
4242 return Py_BuildValue("Nl", obj, pos);
4243}
4244
4245static PyObject*
4246pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4247{
4248 PyObject *obj;
4249 long pos;
4250 char *filename;
4251 FILE *fp;
4252
4253 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4254 return NULL;
4255
4256 fp = fopen(filename, "rb");
4257 if (fp == NULL) {
4258 PyErr_SetFromErrno(PyExc_OSError);
4259 return NULL;
4260 }
4261
4262 obj = PyMarshal_ReadObjectFromFile(fp);
4263 pos = ftell(fp);
4264
4265 fclose(fp);
4266 return Py_BuildValue("Nl", obj, pos);
4267}
4268
Victor Stinnerefde1462015-03-21 15:04:43 +01004269static PyObject*
4270return_null_without_error(PyObject *self, PyObject *args)
4271{
4272 /* invalid call: return NULL without setting an error,
4273 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4274 PyErr_Clear();
4275 return NULL;
4276}
4277
4278static PyObject*
4279return_result_with_error(PyObject *self, PyObject *args)
4280{
4281 /* invalid call: return a result with an error set,
4282 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4283 PyErr_SetNone(PyExc_ValueError);
4284 Py_RETURN_NONE;
4285}
4286
Victor Stinner992c43f2015-03-27 17:12:45 +01004287static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004288test_pytime_fromseconds(PyObject *self, PyObject *args)
4289{
4290 int seconds;
4291 _PyTime_t ts;
4292
4293 if (!PyArg_ParseTuple(args, "i", &seconds))
4294 return NULL;
4295 ts = _PyTime_FromSeconds(seconds);
4296 return _PyTime_AsNanosecondsObject(ts);
4297}
4298
4299static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004300test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4301{
4302 PyObject *obj;
4303 int round;
4304 _PyTime_t ts;
4305
4306 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4307 return NULL;
4308 if (check_time_rounding(round) < 0)
4309 return NULL;
4310 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4311 return NULL;
4312 return _PyTime_AsNanosecondsObject(ts);
4313}
4314
Victor Stinner4bfb4602015-03-27 22:27:24 +01004315static PyObject *
4316test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4317{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004318 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004319 _PyTime_t ts;
4320 double d;
4321
Victor Stinnerc29b5852017-11-02 07:28:27 -07004322 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004323 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004324 }
4325 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4326 return NULL;
4327 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004328 d = _PyTime_AsSecondsDouble(ts);
4329 return PyFloat_FromDouble(d);
4330}
4331
Victor Stinner95e9cef2015-03-28 01:26:47 +01004332static PyObject *
4333test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4334{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004335 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004336 int round;
4337 _PyTime_t t;
4338 struct timeval tv;
4339 PyObject *seconds;
4340
Victor Stinnerc29b5852017-11-02 07:28:27 -07004341 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004342 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004343 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004344 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004345 }
4346 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004347 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004348 }
4349 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4350 return NULL;
4351 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004352
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004353 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004354 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004355 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004356 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004357 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4358}
4359
Victor Stinner34dc0f42015-03-27 18:19:03 +01004360#ifdef HAVE_CLOCK_GETTIME
4361static PyObject *
4362test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4363{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004364 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004365 _PyTime_t t;
4366 struct timespec ts;
4367
Victor Stinnerc29b5852017-11-02 07:28:27 -07004368 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004369 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004370 }
4371 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004372 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004373 }
4374 if (_PyTime_AsTimespec(t, &ts) == -1) {
4375 return NULL;
4376 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004377 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4378}
4379#endif
4380
Victor Stinner62d1c702015-04-01 17:47:07 +02004381static PyObject *
4382test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4383{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004384 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004385 int round;
4386 _PyTime_t t, ms;
4387
Victor Stinnerc29b5852017-11-02 07:28:27 -07004388 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004389 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004390 }
4391 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004392 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004393 }
4394 if (check_time_rounding(round) < 0) {
4395 return NULL;
4396 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004397 ms = _PyTime_AsMilliseconds(t, round);
4398 /* This conversion rely on the fact that _PyTime_t is a number of
4399 nanoseconds */
4400 return _PyTime_AsNanosecondsObject(ms);
4401}
4402
4403static PyObject *
4404test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4405{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004406 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004407 int round;
4408 _PyTime_t t, ms;
4409
Victor Stinnerc29b5852017-11-02 07:28:27 -07004410 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004411 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004412 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004413 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004414 }
4415 if (check_time_rounding(round) < 0) {
4416 return NULL;
4417 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004418 ms = _PyTime_AsMicroseconds(t, round);
4419 /* This conversion rely on the fact that _PyTime_t is a number of
4420 nanoseconds */
4421 return _PyTime_AsNanosecondsObject(ms);
4422}
4423
Victor Stinner50856d52015-10-13 00:11:21 +02004424static PyObject*
4425get_recursion_depth(PyObject *self, PyObject *args)
4426{
Victor Stinner50b48572018-11-01 01:51:40 +01004427 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004428
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004429 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004430 return PyLong_FromLong(tstate->recursion_depth - 1);
4431}
4432
Victor Stinner34be807c2016-03-14 12:04:26 +01004433static PyObject*
4434pymem_buffer_overflow(PyObject *self, PyObject *args)
4435{
4436 char *buffer;
4437
4438 /* Deliberate buffer overflow to check that PyMem_Free() detects
4439 the overflow when debug hooks are installed. */
4440 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004441 if (buffer == NULL) {
4442 PyErr_NoMemory();
4443 return NULL;
4444 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004445 buffer[16] = 'x';
4446 PyMem_Free(buffer);
4447
4448 Py_RETURN_NONE;
4449}
4450
4451static PyObject*
4452pymem_api_misuse(PyObject *self, PyObject *args)
4453{
4454 char *buffer;
4455
4456 /* Deliberate misusage of Python allocators:
4457 allococate with PyMem but release with PyMem_Raw. */
4458 buffer = PyMem_Malloc(16);
4459 PyMem_RawFree(buffer);
4460
4461 Py_RETURN_NONE;
4462}
4463
Victor Stinnerc4aec362016-03-14 22:26:53 +01004464static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004465pymem_malloc_without_gil(PyObject *self, PyObject *args)
4466{
4467 char *buffer;
4468
4469 /* Deliberate bug to test debug hooks on Python memory allocators:
4470 call PyMem_Malloc() without holding the GIL */
4471 Py_BEGIN_ALLOW_THREADS
4472 buffer = PyMem_Malloc(10);
4473 Py_END_ALLOW_THREADS
4474
4475 PyMem_Free(buffer);
4476
4477 Py_RETURN_NONE;
4478}
4479
Victor Stinner5d39e042017-11-29 17:20:38 +01004480
4481static PyObject*
4482test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4483{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004484 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004485 if (name == NULL) {
4486 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4487 return NULL;
4488 }
4489 return PyUnicode_FromString(name);
4490}
4491
4492
Victor Stinnerad524372016-03-16 12:12:53 +01004493static PyObject*
Victor Stinner35762662019-06-07 17:41:39 +02004494test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004495{
Victor Stinner35762662019-06-07 17:41:39 +02004496 if (!_PyObject_IsFreed(op)) {
4497 return raiseTestError(test_name, "object is not seen as freed");
4498 }
4499 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004500}
4501
4502
4503static PyObject*
Victor Stinner35762662019-06-07 17:41:39 +02004504check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004505{
4506 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4507 if (op == NULL) {
4508 return NULL;
4509 }
4510 /* Initialize reference count to avoid early crash in ceval or GC */
4511 Py_REFCNT(op) = 1;
4512 /* object fields like ob_type are uninitialized! */
Victor Stinner35762662019-06-07 17:41:39 +02004513 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004514}
4515
4516
4517static PyObject*
Victor Stinner35762662019-06-07 17:41:39 +02004518check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004519{
4520 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4521 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4522 if (op == NULL) {
4523 return NULL;
4524 }
4525 /* Initialize reference count to avoid early crash in ceval or GC */
4526 Py_REFCNT(op) = 1;
4527 /* ob_type field is after the memory block: part of "forbidden bytes"
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -07004528 when using debug hooks on memory allocators! */
Victor Stinner35762662019-06-07 17:41:39 +02004529 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004530}
4531
4532
4533static PyObject*
Victor Stinner35762662019-06-07 17:41:39 +02004534check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004535{
4536 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4537 if (op == NULL) {
4538 return NULL;
4539 }
4540 Py_TYPE(op)->tp_dealloc(op);
4541 /* Reset reference count to avoid early crash in ceval or GC */
4542 Py_REFCNT(op) = 1;
4543 /* object memory is freed! */
Victor Stinner35762662019-06-07 17:41:39 +02004544 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004545}
4546
4547
4548static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004549pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4550{
4551 char *buffer;
4552
Victor Stinnerad524372016-03-16 12:12:53 +01004553 /* Deliberate bug to test debug hooks on Python memory allocators:
4554 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004555 Py_BEGIN_ALLOW_THREADS
4556 buffer = PyObject_Malloc(10);
4557 Py_END_ALLOW_THREADS
4558
4559 PyObject_Free(buffer);
4560
4561 Py_RETURN_NONE;
4562}
4563
Victor Stinner10b73e12016-03-22 13:39:05 +01004564static PyObject *
4565tracemalloc_track(PyObject *self, PyObject *args)
4566{
4567 unsigned int domain;
4568 PyObject *ptr_obj;
4569 void *ptr;
4570 Py_ssize_t size;
4571 int release_gil = 0;
4572 int res;
4573
4574 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4575 return NULL;
4576 ptr = PyLong_AsVoidPtr(ptr_obj);
4577 if (PyErr_Occurred())
4578 return NULL;
4579
4580 if (release_gil) {
4581 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004582 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004583 Py_END_ALLOW_THREADS
4584 }
4585 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004586 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004587 }
4588
4589 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004590 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004591 return NULL;
4592 }
4593
4594 Py_RETURN_NONE;
4595}
4596
4597static PyObject *
4598tracemalloc_untrack(PyObject *self, PyObject *args)
4599{
4600 unsigned int domain;
4601 PyObject *ptr_obj;
4602 void *ptr;
4603 int res;
4604
4605 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4606 return NULL;
4607 ptr = PyLong_AsVoidPtr(ptr_obj);
4608 if (PyErr_Occurred())
4609 return NULL;
4610
Victor Stinner5ea4c062017-06-20 17:46:36 +02004611 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004612 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004613 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004614 return NULL;
4615 }
4616
4617 Py_RETURN_NONE;
4618}
4619
4620static PyObject *
4621tracemalloc_get_traceback(PyObject *self, PyObject *args)
4622{
4623 unsigned int domain;
4624 PyObject *ptr_obj;
4625 void *ptr;
4626
4627 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4628 return NULL;
4629 ptr = PyLong_AsVoidPtr(ptr_obj);
4630 if (PyErr_Occurred())
4631 return NULL;
4632
Benjamin Petersonca470632016-09-06 13:47:26 -07004633 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004634}
4635
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004636static PyObject *
4637dict_get_version(PyObject *self, PyObject *args)
4638{
4639 PyDictObject *dict;
4640 uint64_t version;
4641
4642 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4643 return NULL;
4644
4645 version = dict->ma_version_tag;
4646
4647 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4648 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4649}
4650
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004651
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004652static PyObject *
4653raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4654{
4655 PyGenObject *gen;
4656
4657 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4658 return NULL;
4659
4660 /* This is used in a test to check what happens if a signal arrives just
4661 as we're in the process of entering a yield from chain (see
4662 bpo-30039).
4663
4664 Needs to be done in C, because:
4665 - we don't have a Python wrapper for raise()
4666 - we need to make sure that the Python-level signal handler doesn't run
4667 *before* we enter the generator frame, which is impossible in Python
4668 because we check for signals before every bytecode operation.
4669 */
4670 raise(SIGINT);
4671 return _PyGen_Send(gen, Py_None);
4672}
4673
4674
Victor Stinner3b5cf852017-06-09 16:48:45 +02004675static int
4676fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4677{
4678 if (args == Py_None) {
4679 *stack = NULL;
4680 *nargs = 0;
4681 }
4682 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004683 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004684 *nargs = PyTuple_GET_SIZE(args);
4685 }
4686 else {
4687 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4688 return -1;
4689 }
4690 return 0;
4691}
4692
4693
4694static PyObject *
4695test_pyobject_fastcall(PyObject *self, PyObject *args)
4696{
4697 PyObject *func, *func_args;
4698 PyObject **stack;
4699 Py_ssize_t nargs;
4700
4701 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4702 return NULL;
4703 }
4704
4705 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4706 return NULL;
4707 }
4708 return _PyObject_FastCall(func, stack, nargs);
4709}
4710
4711
4712static PyObject *
4713test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4714{
4715 PyObject *func, *func_args, *kwargs;
4716 PyObject **stack;
4717 Py_ssize_t nargs;
4718
4719 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4720 return NULL;
4721 }
4722
4723 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4724 return NULL;
4725 }
4726
4727 if (kwargs == Py_None) {
4728 kwargs = NULL;
4729 }
4730 else if (!PyDict_Check(kwargs)) {
4731 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4732 return NULL;
4733 }
4734
4735 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4736}
4737
4738
4739static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004740test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004741{
4742 PyObject *func, *func_args, *kwnames = NULL;
4743 PyObject **stack;
4744 Py_ssize_t nargs, nkw;
4745
4746 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4747 return NULL;
4748 }
4749
4750 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4751 return NULL;
4752 }
4753
4754 if (kwnames == Py_None) {
4755 kwnames = NULL;
4756 }
4757 else if (PyTuple_Check(kwnames)) {
4758 nkw = PyTuple_GET_SIZE(kwnames);
4759 if (nargs < nkw) {
4760 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4761 return NULL;
4762 }
4763 nargs -= nkw;
4764 }
4765 else {
4766 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4767 return NULL;
4768 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004769 return _PyObject_Vectorcall(func, stack, nargs, kwnames);
4770}
4771
4772
4773static PyObject *
4774test_pyvectorcall_call(PyObject *self, PyObject *args)
4775{
4776 PyObject *func;
4777 PyObject *argstuple;
4778 PyObject *kwargs = NULL;
4779
4780 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4781 return NULL;
4782 }
4783
4784 if (!PyTuple_Check(argstuple)) {
4785 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4786 return NULL;
4787 }
4788 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4789 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4790 return NULL;
4791 }
4792
4793 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004794}
4795
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004796
Victor Stinner64fa4492017-07-10 14:37:49 +02004797static PyObject*
4798stack_pointer(PyObject *self, PyObject *args)
4799{
4800 int v = 5;
4801 return PyLong_FromVoidPtr(&v);
4802}
4803
Victor Stinner3b5cf852017-06-09 16:48:45 +02004804
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004805#ifdef W_STOPCODE
4806static PyObject*
4807py_w_stopcode(PyObject *self, PyObject *args)
4808{
4809 int sig, status;
4810 if (!PyArg_ParseTuple(args, "i", &sig)) {
4811 return NULL;
4812 }
4813 status = W_STOPCODE(sig);
4814 return PyLong_FromLong(status);
4815}
4816#endif
4817
4818
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004819static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004820get_mapping_keys(PyObject* self, PyObject *obj)
4821{
4822 return PyMapping_Keys(obj);
4823}
4824
4825static PyObject *
4826get_mapping_values(PyObject* self, PyObject *obj)
4827{
4828 return PyMapping_Values(obj);
4829}
4830
4831static PyObject *
4832get_mapping_items(PyObject* self, PyObject *obj)
4833{
4834 return PyMapping_Items(obj);
4835}
4836
4837
4838static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004839test_pythread_tss_key_state(PyObject *self, PyObject *args)
4840{
4841 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4842 if (PyThread_tss_is_created(&tss_key)) {
4843 return raiseTestError("test_pythread_tss_key_state",
4844 "TSS key not in an uninitialized state at "
4845 "creation time");
4846 }
4847 if (PyThread_tss_create(&tss_key) != 0) {
4848 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4849 return NULL;
4850 }
4851 if (!PyThread_tss_is_created(&tss_key)) {
4852 return raiseTestError("test_pythread_tss_key_state",
4853 "PyThread_tss_create succeeded, "
4854 "but with TSS key in an uninitialized state");
4855 }
4856 if (PyThread_tss_create(&tss_key) != 0) {
4857 return raiseTestError("test_pythread_tss_key_state",
4858 "PyThread_tss_create unsuccessful with "
4859 "an already initialized key");
4860 }
4861#define CHECK_TSS_API(expr) \
4862 (void)(expr); \
4863 if (!PyThread_tss_is_created(&tss_key)) { \
4864 return raiseTestError("test_pythread_tss_key_state", \
4865 "TSS key initialization state was not " \
4866 "preserved after calling " #expr); }
4867 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4868 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4869#undef CHECK_TSS_API
4870 PyThread_tss_delete(&tss_key);
4871 if (PyThread_tss_is_created(&tss_key)) {
4872 return raiseTestError("test_pythread_tss_key_state",
4873 "PyThread_tss_delete called, but did not "
4874 "set the key state to uninitialized");
4875 }
4876
4877 Py_tss_t *ptr_key = PyThread_tss_alloc();
4878 if (ptr_key == NULL) {
4879 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4880 return NULL;
4881 }
4882 if (PyThread_tss_is_created(ptr_key)) {
4883 return raiseTestError("test_pythread_tss_key_state",
4884 "TSS key not in an uninitialized state at "
4885 "allocation time");
4886 }
4887 PyThread_tss_free(ptr_key);
4888 ptr_key = NULL;
4889 Py_RETURN_NONE;
4890}
4891
4892
Yury Selivanovf23746a2018-01-22 19:11:18 -05004893static PyObject*
4894new_hamt(PyObject *self, PyObject *args)
4895{
4896 return _PyContext_NewHamtForTests();
4897}
4898
4899
jdemeyer5a306202018-10-19 23:50:06 +02004900/* def bad_get(self, obj, cls):
4901 cls()
4902 return repr(self)
4903*/
4904static PyObject*
4905bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4906{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004907 PyObject *self, *obj, *cls;
4908 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02004909 return NULL;
4910 }
4911
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004912 PyObject *res = PyObject_CallObject(cls, NULL);
jdemeyer5a306202018-10-19 23:50:06 +02004913 if (res == NULL) {
4914 return NULL;
4915 }
4916 Py_DECREF(res);
4917
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004918 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02004919}
4920
4921
Victor Stinner3d4226a2018-08-29 22:21:32 +02004922static PyObject *
4923encode_locale_ex(PyObject *self, PyObject *args)
4924{
4925 PyObject *unicode;
4926 int current_locale = 0;
4927 wchar_t *wstr;
4928 PyObject *res = NULL;
4929 const char *errors = NULL;
4930
4931 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4932 return NULL;
4933 }
4934 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4935 if (wstr == NULL) {
4936 return NULL;
4937 }
4938 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4939
4940 char *str = NULL;
4941 size_t error_pos;
4942 const char *reason = NULL;
4943 int ret = _Py_EncodeLocaleEx(wstr,
4944 &str, &error_pos, &reason,
4945 current_locale, error_handler);
4946 PyMem_Free(wstr);
4947
4948 switch(ret) {
4949 case 0:
4950 res = PyBytes_FromString(str);
4951 PyMem_RawFree(str);
4952 break;
4953 case -1:
4954 PyErr_NoMemory();
4955 break;
4956 case -2:
4957 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4958 error_pos, reason);
4959 break;
4960 case -3:
4961 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4962 break;
4963 default:
4964 PyErr_SetString(PyExc_ValueError, "unknow error code");
4965 break;
4966 }
4967 return res;
4968}
4969
4970
4971static PyObject *
4972decode_locale_ex(PyObject *self, PyObject *args)
4973{
4974 char *str;
4975 int current_locale = 0;
4976 PyObject *res = NULL;
4977 const char *errors = NULL;
4978
4979 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4980 return NULL;
4981 }
4982 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4983
4984 wchar_t *wstr = NULL;
4985 size_t wlen = 0;
4986 const char *reason = NULL;
4987 int ret = _Py_DecodeLocaleEx(str,
4988 &wstr, &wlen, &reason,
4989 current_locale, error_handler);
4990
4991 switch(ret) {
4992 case 0:
4993 res = PyUnicode_FromWideChar(wstr, wlen);
4994 PyMem_RawFree(wstr);
4995 break;
4996 case -1:
4997 PyErr_NoMemory();
4998 break;
4999 case -2:
5000 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5001 wlen, reason);
5002 break;
5003 case -3:
5004 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5005 break;
5006 default:
5007 PyErr_SetString(PyExc_ValueError, "unknow error code");
5008 break;
5009 }
5010 return res;
5011}
5012
5013
Victor Stinner18618e652018-10-25 17:28:11 +02005014#ifdef Py_REF_DEBUG
5015static PyObject *
5016negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5017{
5018 PyObject *obj = PyUnicode_FromString("negative_refcount");
5019 if (obj == NULL) {
5020 return NULL;
5021 }
5022 assert(Py_REFCNT(obj) == 1);
5023
5024 Py_REFCNT(obj) = 0;
5025 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5026 Py_DECREF(obj);
5027
5028 Py_RETURN_NONE;
5029}
5030#endif
5031
5032
Victor Stinneref9d9b62019-05-22 11:28:22 +02005033static PyObject*
5034test_write_unraisable_exc(PyObject *self, PyObject *args)
5035{
Victor Stinner71c52e32019-05-27 08:57:14 +02005036 PyObject *exc, *err_msg, *obj;
5037 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005038 return NULL;
5039 }
5040
Victor Stinner71c52e32019-05-27 08:57:14 +02005041 const char *err_msg_utf8;
5042 if (err_msg != Py_None) {
5043 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5044 if (err_msg_utf8 == NULL) {
5045 return NULL;
5046 }
5047 }
5048 else {
5049 err_msg_utf8 = NULL;
5050 }
5051
Victor Stinneref9d9b62019-05-22 11:28:22 +02005052 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005053 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005054 Py_RETURN_NONE;
5055}
5056
5057
Tim Peters9ea17ac2001-02-02 05:57:15 +00005058static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305060 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005061 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305062 {"test_config", test_config, METH_NOARGS},
5063 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005064 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005065 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5066 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5067 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5068 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5069 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5070 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005071 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005072 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005073 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5074 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5075 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5076 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5077 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5078 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005079 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5080 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305081 {"test_list_api", test_list_api, METH_NOARGS},
5082 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005083 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005084 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305085 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5086 {"test_long_api", test_long_api, METH_NOARGS},
5087 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5088 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5089 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5090 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005091 {"test_structseq_newtype_doesnt_leak",
5092 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305093 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5094 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5095 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5096 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdd492d92019-06-07 08:22:58 -06005097 {"test_long_as_unsigned_long_long_mask",
5098 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305099 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5100 {"test_k_code", test_k_code, METH_NOARGS},
5101 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005102 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305103 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305105 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005106 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305107 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5108 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5109 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005111 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005112#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005113 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005114#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005115 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005116 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005117 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005118 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005120 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005122 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005123 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005124 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005125 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005126 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 {"getargs_b", getargs_b, METH_VARARGS},
5128 {"getargs_B", getargs_B, METH_VARARGS},
5129 {"getargs_h", getargs_h, METH_VARARGS},
5130 {"getargs_H", getargs_H, METH_VARARGS},
5131 {"getargs_I", getargs_I, METH_VARARGS},
5132 {"getargs_k", getargs_k, METH_VARARGS},
5133 {"getargs_i", getargs_i, METH_VARARGS},
5134 {"getargs_l", getargs_l, METH_VARARGS},
5135 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005136 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 {"getargs_L", getargs_L, METH_VARARGS},
5138 {"getargs_K", getargs_K, METH_VARARGS},
5139 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305140 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5141 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005142 {"getargs_f", getargs_f, METH_VARARGS},
5143 {"getargs_d", getargs_d, METH_VARARGS},
5144 {"getargs_D", getargs_D, METH_VARARGS},
5145 {"getargs_S", getargs_S, METH_VARARGS},
5146 {"getargs_Y", getargs_Y, METH_VARARGS},
5147 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005148 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005149 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005150 {"getargs_s", getargs_s, METH_VARARGS},
5151 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5152 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5153 {"getargs_z", getargs_z, METH_VARARGS},
5154 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5155 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5156 {"getargs_y", getargs_y, METH_VARARGS},
5157 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5158 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5159 {"getargs_u", getargs_u, METH_VARARGS},
5160 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5161 {"getargs_Z", getargs_Z, METH_VARARGS},
5162 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005163 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005164 {"getargs_es", getargs_es, METH_VARARGS},
5165 {"getargs_et", getargs_et, METH_VARARGS},
5166 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5167 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005169 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005171 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305172 {"test_s_code", test_s_code, METH_NOARGS},
5173 {"test_u_code", test_u_code, METH_NOARGS},
5174 {"test_Z_code", test_Z_code, METH_NOARGS},
5175 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005176 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5177 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005178 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005179 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005180 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005181 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5182 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005183 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005184 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005186#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005187 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005188#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005189 {"traceback_print", traceback_print, METH_VARARGS},
5190 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005191 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005192 {"argparsing", argparsing, METH_VARARGS},
5193 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005194 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305196 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005197 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305198 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005199 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005200 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5201 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005202 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005203 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005204 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305205 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5206 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5207 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5208 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005209 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5210 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305211 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005212 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005213 {"no_docstring",
5214 (PyCFunction)test_with_docstring, METH_NOARGS},
5215 {"docstring_empty",
5216 (PyCFunction)test_with_docstring, METH_NOARGS,
5217 docstring_empty},
5218 {"docstring_no_signature",
5219 (PyCFunction)test_with_docstring, METH_NOARGS,
5220 docstring_no_signature},
5221 {"docstring_with_invalid_signature",
5222 (PyCFunction)test_with_docstring, METH_NOARGS,
5223 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005224 {"docstring_with_invalid_signature2",
5225 (PyCFunction)test_with_docstring, METH_NOARGS,
5226 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005227 {"docstring_with_signature",
5228 (PyCFunction)test_with_docstring, METH_NOARGS,
5229 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005230 {"docstring_with_signature_but_no_doc",
5231 (PyCFunction)test_with_docstring, METH_NOARGS,
5232 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005233 {"docstring_with_signature_and_extra_newlines",
5234 (PyCFunction)test_with_docstring, METH_NOARGS,
5235 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005236 {"docstring_with_signature_with_defaults",
5237 (PyCFunction)test_with_docstring, METH_NOARGS,
5238 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005239 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5240 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005241 {"pymarshal_write_long_to_file",
5242 pymarshal_write_long_to_file, METH_VARARGS},
5243 {"pymarshal_write_object_to_file",
5244 pymarshal_write_object_to_file, METH_VARARGS},
5245 {"pymarshal_read_short_from_file",
5246 pymarshal_read_short_from_file, METH_VARARGS},
5247 {"pymarshal_read_long_from_file",
5248 pymarshal_read_long_from_file, METH_VARARGS},
5249 {"pymarshal_read_last_object_from_file",
5250 pymarshal_read_last_object_from_file, METH_VARARGS},
5251 {"pymarshal_read_object_from_file",
5252 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005253 {"return_null_without_error",
5254 return_null_without_error, METH_NOARGS},
5255 {"return_result_with_error",
5256 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005257 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005258 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5259 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005260 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005261#ifdef HAVE_CLOCK_GETTIME
5262 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5263#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005264 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5265 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02005266 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005267 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5268 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005269 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005270 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner35762662019-06-07 17:41:39 +02005271 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5272 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5273 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005274 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005275 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5276 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5277 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005278 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005279 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005280 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5281 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005282 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5283 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005284 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005285#ifdef W_STOPCODE
5286 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5287#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005288 {"get_mapping_keys", get_mapping_keys, METH_O},
5289 {"get_mapping_values", get_mapping_values, METH_O},
5290 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005291 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005292 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005293 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005294 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5295 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005296#ifdef Py_REF_DEBUG
5297 {"negative_refcount", negative_refcount, METH_NOARGS},
5298#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005299 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005301};
5302
Thomas Hellera4ea6032003-04-17 18:55:45 +00005303#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5304
Thomas Wouters89f507f2006-12-13 04:49:30 +00005305typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 char bool_member;
5307 char byte_member;
5308 unsigned char ubyte_member;
5309 short short_member;
5310 unsigned short ushort_member;
5311 int int_member;
5312 unsigned int uint_member;
5313 long long_member;
5314 unsigned long ulong_member;
5315 Py_ssize_t pyssizet_member;
5316 float float_member;
5317 double double_member;
5318 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005319 long long longlong_member;
5320 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005321} all_structmembers;
5322
5323typedef struct {
5324 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005326} test_structmembers;
5327
5328static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5330 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5331 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5332 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5333 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5334 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5335 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5336 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5337 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5338 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5339 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5340 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5341 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5343 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005345};
5346
5347
Christian Heimes1af737c2008-01-23 08:24:23 +00005348static PyObject *
5349test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 static char *keywords[] = {
5352 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5353 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5354 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005357 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 test_structmembers *ob;
5359 const char *s = NULL;
5360 Py_ssize_t string_len = 0;
5361 ob = PyObject_New(test_structmembers, type);
5362 if (ob == NULL)
5363 return NULL;
5364 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5365 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5366 &ob->structmembers.bool_member,
5367 &ob->structmembers.byte_member,
5368 &ob->structmembers.ubyte_member,
5369 &ob->structmembers.short_member,
5370 &ob->structmembers.ushort_member,
5371 &ob->structmembers.int_member,
5372 &ob->structmembers.uint_member,
5373 &ob->structmembers.long_member,
5374 &ob->structmembers.ulong_member,
5375 &ob->structmembers.pyssizet_member,
5376 &ob->structmembers.float_member,
5377 &ob->structmembers.double_member,
5378 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 , &ob->structmembers.longlong_member,
5380 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 )) {
5382 Py_DECREF(ob);
5383 return NULL;
5384 }
5385 if (s != NULL) {
5386 if (string_len > 5) {
5387 Py_DECREF(ob);
5388 PyErr_SetString(PyExc_ValueError, "string too long");
5389 return NULL;
5390 }
5391 strcpy(ob->structmembers.inplace_member, s);
5392 }
5393 else {
5394 strcpy(ob->structmembers.inplace_member, "");
5395 }
5396 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005397}
5398
Christian Heimes1af737c2008-01-23 08:24:23 +00005399static void
5400test_structmembers_free(PyObject *ob)
5401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005403}
5404
5405static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005406 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 "test_structmembersType",
5408 sizeof(test_structmembers), /* tp_basicsize */
5409 0, /* tp_itemsize */
5410 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005411 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 0, /* tp_getattr */
5413 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005414 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 0, /* tp_repr */
5416 0, /* tp_as_number */
5417 0, /* tp_as_sequence */
5418 0, /* tp_as_mapping */
5419 0, /* tp_hash */
5420 0, /* tp_call */
5421 0, /* tp_str */
5422 PyObject_GenericGetAttr, /* tp_getattro */
5423 PyObject_GenericSetAttr, /* tp_setattro */
5424 0, /* tp_as_buffer */
5425 0, /* tp_flags */
5426 "Type containing all structmember types",
5427 0, /* traverseproc tp_traverse */
5428 0, /* tp_clear */
5429 0, /* tp_richcompare */
5430 0, /* tp_weaklistoffset */
5431 0, /* tp_iter */
5432 0, /* tp_iternext */
5433 0, /* tp_methods */
5434 test_members, /* tp_members */
5435 0,
5436 0,
5437 0,
5438 0,
5439 0,
5440 0,
5441 0,
5442 0,
5443 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005444};
5445
5446
Benjamin Petersond51374e2014-04-09 23:55:56 -04005447typedef struct {
5448 PyObject_HEAD
5449} matmulObject;
5450
5451static PyObject *
5452matmulType_matmul(PyObject *self, PyObject *other)
5453{
5454 return Py_BuildValue("(sOO)", "matmul", self, other);
5455}
5456
5457static PyObject *
5458matmulType_imatmul(PyObject *self, PyObject *other)
5459{
5460 return Py_BuildValue("(sOO)", "imatmul", self, other);
5461}
5462
5463static void
5464matmulType_dealloc(PyObject *self)
5465{
Zachary Ware420dc562014-04-23 13:51:27 -05005466 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005467}
5468
5469static PyNumberMethods matmulType_as_number = {
5470 0, /* nb_add */
5471 0, /* nb_subtract */
5472 0, /* nb_multiply */
5473 0, /* nb_remainde r*/
5474 0, /* nb_divmod */
5475 0, /* nb_power */
5476 0, /* nb_negative */
5477 0, /* tp_positive */
5478 0, /* tp_absolute */
5479 0, /* tp_bool */
5480 0, /* nb_invert */
5481 0, /* nb_lshift */
5482 0, /* nb_rshift */
5483 0, /* nb_and */
5484 0, /* nb_xor */
5485 0, /* nb_or */
5486 0, /* nb_int */
5487 0, /* nb_reserved */
5488 0, /* nb_float */
5489 0, /* nb_inplace_add */
5490 0, /* nb_inplace_subtract */
5491 0, /* nb_inplace_multiply */
5492 0, /* nb_inplace_remainder */
5493 0, /* nb_inplace_power */
5494 0, /* nb_inplace_lshift */
5495 0, /* nb_inplace_rshift */
5496 0, /* nb_inplace_and */
5497 0, /* nb_inplace_xor */
5498 0, /* nb_inplace_or */
5499 0, /* nb_floor_divide */
5500 0, /* nb_true_divide */
5501 0, /* nb_inplace_floor_divide */
5502 0, /* nb_inplace_true_divide */
5503 0, /* nb_index */
5504 matmulType_matmul, /* nb_matrix_multiply */
5505 matmulType_imatmul /* nb_matrix_inplace_multiply */
5506};
5507
5508static PyTypeObject matmulType = {
5509 PyVarObject_HEAD_INIT(NULL, 0)
5510 "matmulType",
5511 sizeof(matmulObject), /* tp_basicsize */
5512 0, /* tp_itemsize */
5513 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005514 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005515 0, /* tp_getattr */
5516 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005517 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005518 0, /* tp_repr */
5519 &matmulType_as_number, /* tp_as_number */
5520 0, /* tp_as_sequence */
5521 0, /* tp_as_mapping */
5522 0, /* tp_hash */
5523 0, /* tp_call */
5524 0, /* tp_str */
5525 PyObject_GenericGetAttr, /* tp_getattro */
5526 PyObject_GenericSetAttr, /* tp_setattro */
5527 0, /* tp_as_buffer */
5528 0, /* tp_flags */
5529 "C level type with matrix operations defined",
5530 0, /* traverseproc tp_traverse */
5531 0, /* tp_clear */
5532 0, /* tp_richcompare */
5533 0, /* tp_weaklistoffset */
5534 0, /* tp_iter */
5535 0, /* tp_iternext */
5536 0, /* tp_methods */
5537 0, /* tp_members */
5538 0,
5539 0,
5540 0,
5541 0,
5542 0,
5543 0,
5544 0,
5545 0,
5546 PyType_GenericNew, /* tp_new */
5547 PyObject_Del, /* tp_free */
5548};
5549
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005550typedef struct {
5551 PyObject_HEAD
5552} ipowObject;
5553
5554static PyObject *
5555ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5556{
5557 return Py_BuildValue("OO", other, mod);
5558}
5559
5560static PyNumberMethods ipowType_as_number = {
5561 .nb_inplace_power = ipowType_ipow
5562};
5563
5564static PyTypeObject ipowType = {
5565 PyVarObject_HEAD_INIT(NULL, 0)
5566 .tp_name = "ipowType",
5567 .tp_basicsize = sizeof(ipowObject),
5568 .tp_as_number = &ipowType_as_number,
5569 .tp_new = PyType_GenericNew
5570};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005571
Yury Selivanov75445082015-05-11 22:57:16 -04005572typedef struct {
5573 PyObject_HEAD
5574 PyObject *ao_iterator;
5575} awaitObject;
5576
5577
5578static PyObject *
5579awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5580{
5581 PyObject *v;
5582 awaitObject *ao;
5583
5584 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5585 return NULL;
5586
5587 ao = (awaitObject *)type->tp_alloc(type, 0);
5588 if (ao == NULL) {
5589 return NULL;
5590 }
5591
5592 Py_INCREF(v);
5593 ao->ao_iterator = v;
5594
5595 return (PyObject *)ao;
5596}
5597
5598
5599static void
5600awaitObject_dealloc(awaitObject *ao)
5601{
5602 Py_CLEAR(ao->ao_iterator);
5603 Py_TYPE(ao)->tp_free(ao);
5604}
5605
5606
5607static PyObject *
5608awaitObject_await(awaitObject *ao)
5609{
5610 Py_INCREF(ao->ao_iterator);
5611 return ao->ao_iterator;
5612}
5613
5614static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005615 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005616 0, /* am_aiter */
5617 0 /* am_anext */
5618};
5619
5620
5621static PyTypeObject awaitType = {
5622 PyVarObject_HEAD_INIT(NULL, 0)
5623 "awaitType",
5624 sizeof(awaitObject), /* tp_basicsize */
5625 0, /* tp_itemsize */
5626 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005627 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005628 0, /* tp_getattr */
5629 0, /* tp_setattr */
5630 &awaitType_as_async, /* tp_as_async */
5631 0, /* tp_repr */
5632 0, /* tp_as_number */
5633 0, /* tp_as_sequence */
5634 0, /* tp_as_mapping */
5635 0, /* tp_hash */
5636 0, /* tp_call */
5637 0, /* tp_str */
5638 PyObject_GenericGetAttr, /* tp_getattro */
5639 PyObject_GenericSetAttr, /* tp_setattro */
5640 0, /* tp_as_buffer */
5641 0, /* tp_flags */
5642 "C level type with tp_as_async",
5643 0, /* traverseproc tp_traverse */
5644 0, /* tp_clear */
5645 0, /* tp_richcompare */
5646 0, /* tp_weaklistoffset */
5647 0, /* tp_iter */
5648 0, /* tp_iternext */
5649 0, /* tp_methods */
5650 0, /* tp_members */
5651 0,
5652 0,
5653 0,
5654 0,
5655 0,
5656 0,
5657 0,
5658 0,
5659 awaitObject_new, /* tp_new */
5660 PyObject_Del, /* tp_free */
5661};
5662
5663
xdegaye56d1f5c2017-10-26 15:09:06 +02005664static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5665
5666static PyTypeObject PyRecursingInfinitelyError_Type = {
5667 PyVarObject_HEAD_INIT(NULL, 0)
5668 "RecursingInfinitelyError", /* tp_name */
5669 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5670 0, /* tp_itemsize */
5671 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005672 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005673 0, /* tp_getattr */
5674 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005675 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005676 0, /* tp_repr */
5677 0, /* tp_as_number */
5678 0, /* tp_as_sequence */
5679 0, /* tp_as_mapping */
5680 0, /* tp_hash */
5681 0, /* tp_call */
5682 0, /* tp_str */
5683 0, /* tp_getattro */
5684 0, /* tp_setattro */
5685 0, /* tp_as_buffer */
5686 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5687 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5688 0, /* tp_traverse */
5689 0, /* tp_clear */
5690 0, /* tp_richcompare */
5691 0, /* tp_weaklistoffset */
5692 0, /* tp_iter */
5693 0, /* tp_iternext */
5694 0, /* tp_methods */
5695 0, /* tp_members */
5696 0, /* tp_getset */
5697 0, /* tp_base */
5698 0, /* tp_dict */
5699 0, /* tp_descr_get */
5700 0, /* tp_descr_set */
5701 0, /* tp_dictoffset */
5702 (initproc)recurse_infinitely_error_init, /* tp_init */
5703 0, /* tp_alloc */
5704 0, /* tp_new */
5705};
5706
5707static int
5708recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5709{
5710 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5711
5712 /* Instantiating this exception starts infinite recursion. */
5713 Py_INCREF(type);
5714 PyErr_SetObject(type, NULL);
5715 return -1;
5716}
5717
5718
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005719/* Test bpo-35983: create a subclass of "list" which checks that instances
5720 * are not deallocated twice */
5721
5722typedef struct {
5723 PyListObject list;
5724 int deallocated;
5725} MyListObject;
5726
5727static PyObject *
5728MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5729{
5730 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5731 ((MyListObject*)op)->deallocated = 0;
5732 return op;
5733}
5734
5735void
5736MyList_dealloc(MyListObject* op)
5737{
5738 if (op->deallocated) {
5739 /* We cannot raise exceptions here but we still want the testsuite
5740 * to fail when we hit this */
5741 Py_FatalError("MyList instance deallocated twice");
5742 }
5743 op->deallocated = 1;
5744 PyList_Type.tp_dealloc((PyObject *)op);
5745}
5746
5747static PyTypeObject MyList_Type = {
5748 PyVarObject_HEAD_INIT(NULL, 0)
5749 "MyList",
5750 sizeof(MyListObject),
5751 0,
5752 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005753 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005754 0, /* tp_getattr */
5755 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005756 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005757 0, /* tp_repr */
5758 0, /* tp_as_number */
5759 0, /* tp_as_sequence */
5760 0, /* tp_as_mapping */
5761 0, /* tp_hash */
5762 0, /* tp_call */
5763 0, /* tp_str */
5764 0, /* tp_getattro */
5765 0, /* tp_setattro */
5766 0, /* tp_as_buffer */
5767 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5768 0, /* tp_doc */
5769 0, /* tp_traverse */
5770 0, /* tp_clear */
5771 0, /* tp_richcompare */
5772 0, /* tp_weaklistoffset */
5773 0, /* tp_iter */
5774 0, /* tp_iternext */
5775 0, /* tp_methods */
5776 0, /* tp_members */
5777 0, /* tp_getset */
5778 0, /* &PyList_Type */ /* tp_base */
5779 0, /* tp_dict */
5780 0, /* tp_descr_get */
5781 0, /* tp_descr_set */
5782 0, /* tp_dictoffset */
5783 0, /* tp_init */
5784 0, /* tp_alloc */
5785 MyList_new, /* tp_new */
5786};
5787
5788
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005789/* Test PEP 560 */
5790
5791typedef struct {
5792 PyObject_HEAD
5793 PyObject *item;
5794} PyGenericAliasObject;
5795
5796static void
5797generic_alias_dealloc(PyGenericAliasObject *self)
5798{
5799 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005800 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005801}
5802
5803static PyObject *
5804generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5805{
5806 return PyTuple_Pack(1, self->item);
5807}
5808
5809static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005810 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005811 {NULL} /* sentinel */
5812};
5813
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005814static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005815 PyVarObject_HEAD_INIT(NULL, 0)
5816 "GenericAlias",
5817 sizeof(PyGenericAliasObject),
5818 0,
5819 .tp_dealloc = (destructor)generic_alias_dealloc,
5820 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5821 .tp_methods = generic_alias_methods,
5822};
5823
5824static PyObject *
5825generic_alias_new(PyObject *item)
5826{
5827 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5828 if (o == NULL) {
5829 return NULL;
5830 }
5831 Py_INCREF(item);
5832 o->item = item;
5833 return (PyObject*) o;
5834}
5835
5836typedef struct {
5837 PyObject_HEAD
5838} PyGenericObject;
5839
5840static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005841generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005842{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005843 return generic_alias_new(item);
5844}
5845
5846static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005847 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005848 {NULL} /* sentinel */
5849};
5850
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005851static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005852 PyVarObject_HEAD_INIT(NULL, 0)
5853 "Generic",
5854 sizeof(PyGenericObject),
5855 0,
5856 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5857 .tp_methods = generic_methods,
5858};
5859
5860
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005861/* Test PEP 590 */
5862
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005863typedef struct {
5864 PyObject_HEAD
5865 vectorcallfunc vectorcall;
5866} MethodDescriptorObject;
5867
5868static PyObject *
5869MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
5870 size_t nargsf, PyObject *kwnames)
5871{
5872 /* True if using the vectorcall function in MethodDescriptorObject
5873 * but False for MethodDescriptor2Object */
5874 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
5875 return PyBool_FromLong(md->vectorcall != NULL);
5876}
5877
5878static PyObject *
5879MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
5880{
Petr Viktorine584cbf2019-06-03 01:08:14 +02005881 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005882 op->vectorcall = MethodDescriptor_vectorcall;
5883 return (PyObject *)op;
5884}
5885
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005886static PyObject *
5887func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5888{
5889 if (obj == Py_None || obj == NULL) {
5890 Py_INCREF(func);
5891 return func;
5892 }
5893 return PyMethod_New(func, obj);
5894}
5895
5896static PyObject *
5897nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5898{
5899 Py_INCREF(func);
5900 return func;
5901}
5902
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005903static PyObject *
5904call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
5905{
5906 Py_INCREF(args);
5907 return args;
5908}
5909
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005910static PyTypeObject MethodDescriptorBase_Type = {
5911 PyVarObject_HEAD_INIT(NULL, 0)
5912 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005913 sizeof(MethodDescriptorObject),
5914 .tp_new = MethodDescriptor_new,
5915 .tp_call = PyVectorcall_Call,
5916 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
5917 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
5918 Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005919 .tp_descr_get = func_descr_get,
5920};
5921
5922static PyTypeObject MethodDescriptorDerived_Type = {
5923 PyVarObject_HEAD_INIT(NULL, 0)
5924 "MethodDescriptorDerived",
5925 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5926};
5927
5928static PyTypeObject MethodDescriptorNopGet_Type = {
5929 PyVarObject_HEAD_INIT(NULL, 0)
5930 "MethodDescriptorNopGet",
5931 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005932 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005933 .tp_descr_get = nop_descr_get,
5934};
5935
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005936typedef struct {
5937 MethodDescriptorObject base;
5938 vectorcallfunc vectorcall;
5939} MethodDescriptor2Object;
5940
5941static PyObject *
5942MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
5943{
5944 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
5945 op->base.vectorcall = NULL;
5946 op->vectorcall = MethodDescriptor_vectorcall;
5947 return (PyObject *)op;
5948}
5949
5950static PyTypeObject MethodDescriptor2_Type = {
5951 PyVarObject_HEAD_INIT(NULL, 0)
5952 "MethodDescriptor2",
5953 sizeof(MethodDescriptor2Object),
5954 .tp_new = MethodDescriptor2_new,
5955 .tp_call = PyVectorcall_Call,
5956 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
5957 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL,
5958};
5959
Petr Viktorin3562ae22019-09-12 10:44:46 +01005960PyDoc_STRVAR(heapgctype__doc__,
5961"A heap type with GC, and with overridden dealloc.\n\n"
5962"The 'value' attribute is set to 10 in __init__.");
5963
5964typedef struct {
5965 PyObject_HEAD
5966 int value;
5967} HeapCTypeObject;
5968
5969static struct PyMemberDef heapctype_members[] = {
5970 {"value", T_INT, offsetof(HeapCTypeObject, value)},
5971 {NULL} /* Sentinel */
5972};
5973
5974static int
5975heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
5976{
5977 ((HeapCTypeObject *)self)->value = 10;
5978 return 0;
5979}
5980
5981static void
5982heapgcctype_dealloc(HeapCTypeObject *self)
5983{
5984 PyTypeObject *tp = Py_TYPE(self);
5985 PyObject_GC_UnTrack(self);
5986 PyObject_GC_Del(self);
5987 Py_DECREF(tp);
5988}
5989
5990static PyType_Slot HeapGcCType_slots[] = {
5991 {Py_tp_init, heapctype_init},
5992 {Py_tp_members, heapctype_members},
5993 {Py_tp_dealloc, heapgcctype_dealloc},
5994 {Py_tp_doc, (char*)heapgctype__doc__},
5995 {0, 0},
5996};
5997
5998static PyType_Spec HeapGcCType_spec = {
5999 "_testcapi.HeapGcCType",
6000 sizeof(HeapCTypeObject),
6001 0,
6002 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6003 HeapGcCType_slots
6004};
6005
6006PyDoc_STRVAR(heapctype__doc__,
6007"A heap type without GC, but with overridden dealloc.\n\n"
6008"The 'value' attribute is set to 10 in __init__.");
6009
6010static void
6011heapctype_dealloc(HeapCTypeObject *self)
6012{
6013 PyTypeObject *tp = Py_TYPE(self);
6014 PyObject_Del(self);
6015 Py_DECREF(tp);
6016}
6017
6018static PyType_Slot HeapCType_slots[] = {
6019 {Py_tp_init, heapctype_init},
6020 {Py_tp_members, heapctype_members},
6021 {Py_tp_dealloc, heapctype_dealloc},
6022 {Py_tp_doc, (char*)heapctype__doc__},
6023 {0, 0},
6024};
6025
6026static PyType_Spec HeapCType_spec = {
6027 "_testcapi.HeapCType",
6028 sizeof(HeapCTypeObject),
6029 0,
6030 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6031 HeapCType_slots
6032};
6033
6034PyDoc_STRVAR(heapctypesubclass__doc__,
6035"Subclass of HeapCType, without GC.\n\n"
6036"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6037
6038typedef struct {
6039 HeapCTypeObject base;
6040 int value2;
6041} HeapCTypeSubclassObject;
6042
6043static int
6044heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6045{
6046 /* Call __init__ of the superclass */
6047 if (heapctype_init(self, args, kwargs) < 0) {
6048 return -1;
6049 }
6050 /* Initialize additional element */
6051 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6052 return 0;
6053}
6054
6055static struct PyMemberDef heapctypesubclass_members[] = {
6056 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6057 {NULL} /* Sentinel */
6058};
6059
6060static PyType_Slot HeapCTypeSubclass_slots[] = {
6061 {Py_tp_init, heapctypesubclass_init},
6062 {Py_tp_members, heapctypesubclass_members},
6063 {Py_tp_doc, (char*)heapctypesubclass__doc__},
6064 {0, 0},
6065};
6066
6067static PyType_Spec HeapCTypeSubclass_spec = {
6068 "_testcapi.HeapCTypeSubclass",
6069 sizeof(HeapCTypeSubclassObject),
6070 0,
6071 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6072 HeapCTypeSubclass_slots
6073};
6074
6075PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6076"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6077"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6078"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6079
6080static int
6081heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6082{
6083 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6084 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6085 base_init(self, args, kwargs);
6086 return 0;
6087}
6088
6089static void
6090heapctypesubclasswithfinalizer_finalize(PyObject *self)
6091{
6092 PyObject *error_type, *error_value, *error_traceback, *m;
Stéphane Wirtel53ff2ca2019-09-13 18:10:53 +01006093 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Petr Viktorin3562ae22019-09-12 10:44:46 +01006094
6095 /* Save the current exception, if any. */
6096 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6097
6098 m = PyState_FindModule(&_testcapimodule);
6099 if (m == NULL) {
6100 goto cleanup_finalize;
6101 }
6102 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6103 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6104 if (oldtype == NULL || newtype == NULL) {
6105 goto cleanup_finalize;
6106 }
6107
6108 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6109 goto cleanup_finalize;
6110 }
Stéphane Wirtel53ff2ca2019-09-13 18:10:53 +01006111 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6112 if (refcnt == NULL) {
Petr Viktorin3562ae22019-09-12 10:44:46 +01006113 goto cleanup_finalize;
6114 }
Stéphane Wirtel53ff2ca2019-09-13 18:10:53 +01006115 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6116 goto cleanup_finalize;
6117 }
6118 Py_DECREF(refcnt);
6119 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6120 if (refcnt == NULL) {
6121 goto cleanup_finalize;
6122 }
6123 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Petr Viktorin3562ae22019-09-12 10:44:46 +01006124 goto cleanup_finalize;
6125 }
6126
6127cleanup_finalize:
6128 Py_XDECREF(oldtype);
6129 Py_XDECREF(newtype);
Stéphane Wirtel53ff2ca2019-09-13 18:10:53 +01006130 Py_XDECREF(refcnt);
Petr Viktorin3562ae22019-09-12 10:44:46 +01006131
6132 /* Restore the saved exception. */
6133 PyErr_Restore(error_type, error_value, error_traceback);
6134}
6135
6136static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6137 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6138 {Py_tp_members, heapctypesubclass_members},
6139 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
6140 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
6141 {0, 0},
6142};
6143
6144static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6145 "_testcapi.HeapCTypeSubclassWithFinalizer",
6146 sizeof(HeapCTypeSubclassObject),
6147 0,
6148 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6149 HeapCTypeSubclassWithFinalizer_slots
6150};
6151
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006152
Martin v. Löwis1a214512008-06-11 05:26:20 +00006153static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 PyModuleDef_HEAD_INIT,
6155 "_testcapi",
6156 NULL,
6157 -1,
6158 TestMethods,
6159 NULL,
6160 NULL,
6161 NULL,
6162 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006163};
6164
Nick Coghland5cacbb2015-05-23 22:24:10 +10006165/* Per PEP 489, this module will not be converted to multi-phase initialization
6166 */
6167
Mark Hammond62b1ab12002-07-23 06:31:15 +00006168PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006169PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173 m = PyModule_Create(&_testcapimodule);
6174 if (m == NULL)
6175 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179 Py_TYPE(&test_structmembersType)=&PyType_Type;
6180 Py_INCREF(&test_structmembersType);
6181 /* don't use a name starting with "test", since we don't want
6182 test_capi to automatically call this */
6183 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006184 if (PyType_Ready(&matmulType) < 0)
6185 return NULL;
6186 Py_INCREF(&matmulType);
6187 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006188 if (PyType_Ready(&ipowType) < 0) {
6189 return NULL;
6190 }
6191 Py_INCREF(&ipowType);
6192 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006193
Yury Selivanov75445082015-05-11 22:57:16 -04006194 if (PyType_Ready(&awaitType) < 0)
6195 return NULL;
6196 Py_INCREF(&awaitType);
6197 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6198
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006199 MyList_Type.tp_base = &PyList_Type;
6200 if (PyType_Ready(&MyList_Type) < 0)
6201 return NULL;
6202 Py_INCREF(&MyList_Type);
6203 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6204
Jeroen Demeyerd917cfe2019-06-25 12:58:58 +02006205 /* bpo-37250: old Cython code sets tp_print to 0, we check that
6206 * this doesn't break anything. */
6207 MyList_Type.tp_print = 0;
6208
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006209 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6210 return NULL;
6211 Py_INCREF(&MethodDescriptorBase_Type);
6212 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6213
6214 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6215 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6216 return NULL;
6217 Py_INCREF(&MethodDescriptorDerived_Type);
6218 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6219
6220 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6221 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6222 return NULL;
6223 Py_INCREF(&MethodDescriptorNopGet_Type);
6224 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6225
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006226 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6227 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6228 return NULL;
6229 Py_INCREF(&MethodDescriptor2_Type);
6230 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6231
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006232 if (PyType_Ready(&GenericAlias_Type) < 0)
6233 return NULL;
6234 Py_INCREF(&GenericAlias_Type);
6235 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6236
6237 if (PyType_Ready(&Generic_Type) < 0)
6238 return NULL;
6239 Py_INCREF(&Generic_Type);
6240 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6241
xdegaye56d1f5c2017-10-26 15:09:06 +02006242 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6243 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6244 return NULL;
6245 }
6246 Py_INCREF(&PyRecursingInfinitelyError_Type);
6247 PyModule_AddObject(m, "RecursingInfinitelyError",
6248 (PyObject *)&PyRecursingInfinitelyError_Type);
6249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6251 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6252 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6253 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6254 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6255 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6256 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6257 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6258 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6259 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6260 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6261 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6262 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6263 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6264 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6265 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
6266 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
6267 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
6268 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
6269 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6270 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
6271 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02006272 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 Py_INCREF(&PyInstanceMethod_Type);
6274 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006275
Larry Hastings2a727912014-01-16 11:32:01 -08006276 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01006277#ifdef WITH_PYMALLOC
6278 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
6279#else
6280 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
6281#endif
Larry Hastings2a727912014-01-16 11:32:01 -08006282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6284 Py_INCREF(TestError);
6285 PyModule_AddObject(m, "error", TestError);
Petr Viktorin3562ae22019-09-12 10:44:46 +01006286
6287 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
6288 if (HeapGcCType == NULL) {
6289 return NULL;
6290 }
6291 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
6292
6293 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
6294 if (HeapCType == NULL) {
6295 return NULL;
6296 }
6297 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
6298 if (subclass_bases == NULL) {
6299 return NULL;
6300 }
6301 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
6302 if (HeapCTypeSubclass == NULL) {
6303 return NULL;
6304 }
6305 Py_DECREF(subclass_bases);
6306 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
6307
6308 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
6309 if (subclass_with_finalizer_bases == NULL) {
6310 return NULL;
6311 }
6312 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
6313 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
6314 if (HeapCTypeSubclassWithFinalizer == NULL) {
6315 return NULL;
6316 }
6317 Py_DECREF(subclass_with_finalizer_bases);
6318 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
6319
6320 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006322}