blob: 4cca784d0148d306c633b59fda43d86ba2d7e289 [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
Eddie Elizondoff023ed2019-09-11 05:17:13 -040035static 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 Spytzdc247652019-06-06 14:39:23 -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 *
Hai Shi5623ac82019-07-20 02:56:23 -05001927unicode_asutf8(PyObject *self, PyObject *args)
1928{
1929 PyObject *unicode;
1930 const char *buffer;
1931
1932 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1933 return NULL;
1934 }
1935
1936 buffer = PyUnicode_AsUTF8(unicode);
1937 if (buffer == NULL) {
1938 return NULL;
1939 }
1940
1941 return PyBytes_FromString(buffer);
1942}
1943
1944static PyObject *
1945unicode_asutf8andsize(PyObject *self, PyObject *args)
1946{
1947 PyObject *unicode, *result;
1948 const char *buffer;
1949 Py_ssize_t utf8_len;
1950
1951 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1952 return NULL;
1953 }
1954
1955 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
1956 if (buffer == NULL) {
1957 return NULL;
1958 }
1959
1960 result = PyBytes_FromString(buffer);
1961 if (result == NULL) {
1962 return NULL;
1963 }
1964
1965 return Py_BuildValue("(Nn)", result, utf8_len);
1966}
1967
1968static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001969unicode_findchar(PyObject *self, PyObject *args)
1970{
1971 PyObject *str;
1972 int direction;
1973 unsigned int ch;
1974 Py_ssize_t result;
1975 Py_ssize_t start, end;
1976
1977 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1978 &start, &end, &direction)) {
1979 return NULL;
1980 }
1981
1982 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1983 if (result == -2)
1984 return NULL;
1985 else
1986 return PyLong_FromSsize_t(result);
1987}
1988
1989static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001990unicode_copycharacters(PyObject *self, PyObject *args)
1991{
1992 PyObject *from, *to, *to_copy;
1993 Py_ssize_t from_start, to_start, how_many, copied;
1994
1995 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1996 &from, &from_start, &how_many)) {
1997 return NULL;
1998 }
1999
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002000 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2001 PyUnicode_MAX_CHAR_VALUE(to)))) {
2002 return NULL;
2003 }
2004 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2005 Py_DECREF(to_copy);
2006 return NULL;
2007 }
2008
2009 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2010 from_start, how_many)) < 0) {
2011 Py_DECREF(to_copy);
2012 return NULL;
2013 }
2014
2015 return Py_BuildValue("(Nn)", to_copy, copied);
2016}
2017
2018static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002019unicode_encodedecimal(PyObject *self, PyObject *args)
2020{
2021 Py_UNICODE *unicode;
2022 Py_ssize_t length;
2023 char *errors = NULL;
2024 PyObject *decimal;
2025 Py_ssize_t decimal_length, new_length;
2026 int res;
2027
2028 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2029 return NULL;
2030
2031 decimal_length = length * 7; /* len('&#8364;') */
2032 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2033 if (decimal == NULL)
2034 return NULL;
2035
2036 res = PyUnicode_EncodeDecimal(unicode, length,
2037 PyBytes_AS_STRING(decimal),
2038 errors);
2039 if (res < 0) {
2040 Py_DECREF(decimal);
2041 return NULL;
2042 }
2043
2044 new_length = strlen(PyBytes_AS_STRING(decimal));
2045 assert(new_length <= decimal_length);
2046 res = _PyBytes_Resize(&decimal, new_length);
2047 if (res < 0)
2048 return NULL;
2049
2050 return decimal;
2051}
2052
2053static PyObject *
2054unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2055{
2056 Py_UNICODE *unicode;
2057 Py_ssize_t length;
2058 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2059 return NULL;
2060 return PyUnicode_TransformDecimalToASCII(unicode, length);
2061}
2062
2063static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002064unicode_legacy_string(PyObject *self, PyObject *args)
2065{
2066 Py_UNICODE *data;
2067 Py_ssize_t len;
2068 PyObject *u;
2069
2070 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2071 return NULL;
2072
2073 u = PyUnicode_FromUnicode(NULL, len);
2074 if (u == NULL)
2075 return NULL;
2076
2077 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2078
2079 if (len > 0) { /* The empty string is always ready. */
2080 assert(!PyUnicode_IS_READY(u));
2081 }
2082
2083 return u;
2084}
2085
2086static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002087getargs_w_star(PyObject *self, PyObject *args)
2088{
2089 Py_buffer buffer;
2090 PyObject *result;
2091 char *str;
2092
2093 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2094 return NULL;
2095
2096 if (2 <= buffer.len) {
2097 str = buffer.buf;
2098 str[0] = '[';
2099 str[buffer.len-1] = ']';
2100 }
2101
2102 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2103 PyBuffer_Release(&buffer);
2104 return result;
2105}
2106
2107
2108static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302109test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 /* Test that formats can begin with '|'. See issue #4720. */
2112 PyObject *tuple, *dict = NULL;
2113 static char *kwlist[] = {NULL};
2114 int result;
2115 tuple = PyTuple_New(0);
2116 if (!tuple)
2117 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002118 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002120 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 dict = PyDict_New();
2122 if (!dict)
2123 goto done;
2124 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002125 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 Py_DECREF(tuple);
2127 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002128 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002130 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 else {
2132 Py_RETURN_NONE;
2133 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002134}
2135
2136static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002137codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 const char *encoding, *errors = NULL;
2140 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2141 &encoding, &errors))
2142 return NULL;
2143 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002144}
2145
Thomas Wouters477c8d52006-05-27 19:21:47 +00002146static PyObject *
2147codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 const char *encoding, *errors = NULL;
2150 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2151 &encoding, &errors))
2152 return NULL;
2153 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002154}
2155
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002156
Tim Peters5b8132f2003-01-31 15:52:05 +00002157/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002158static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302159test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 struct triple {
2162 long input;
2163 size_t nbits;
2164 int sign;
2165 } testcases[] = {{0, 0, 0},
2166 {1L, 1, 1},
2167 {-1L, 1, -1},
2168 {2L, 2, 1},
2169 {-2L, 2, -1},
2170 {3L, 2, 1},
2171 {-3L, 2, -1},
2172 {4L, 3, 1},
2173 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002174 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 {-0x7fffL, 15, -1},
2176 {0xffffL, 16, 1},
2177 {-0xffffL, 16, -1},
2178 {0xfffffffL, 28, 1},
2179 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002180 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002181
Victor Stinner63941882011-09-29 00:42:28 +02002182 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002183 size_t nbits;
2184 int sign;
2185 PyObject *plong;
2186
2187 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002188 if (plong == NULL)
2189 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002190 nbits = _PyLong_NumBits(plong);
2191 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 Py_DECREF(plong);
2194 if (nbits != testcases[i].nbits)
2195 return raiseTestError("test_long_numbits",
2196 "wrong result for _PyLong_NumBits");
2197 if (sign != testcases[i].sign)
2198 return raiseTestError("test_long_numbits",
2199 "wrong result for _PyLong_Sign");
2200 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002201 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002202}
2203
Thomas Heller519a0422007-11-15 20:48:54 +00002204/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002205
2206static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302207test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2210 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2211 Py_XDECREF(o1);
2212 Py_XDECREF(o2);
2213 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002214}
2215
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002216static PyObject *
2217raise_exception(PyObject *self, PyObject *args)
2218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 PyObject *exc;
2220 PyObject *exc_args, *v;
2221 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2224 &exc, &num_args))
2225 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 exc_args = PyTuple_New(num_args);
2228 if (exc_args == NULL)
2229 return NULL;
2230 for (i = 0; i < num_args; ++i) {
2231 v = PyLong_FromLong(i);
2232 if (v == NULL) {
2233 Py_DECREF(exc_args);
2234 return NULL;
2235 }
2236 PyTuple_SET_ITEM(exc_args, i, v);
2237 }
2238 PyErr_SetObject(exc, exc_args);
2239 Py_DECREF(exc_args);
2240 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002241}
Tim Peters91621db2001-06-12 20:10:01 +00002242
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002243static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002244set_errno(PyObject *self, PyObject *args)
2245{
2246 int new_errno;
2247
2248 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2249 return NULL;
2250
2251 errno = new_errno;
2252 Py_RETURN_NONE;
2253}
2254
2255static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002256test_set_exc_info(PyObject *self, PyObject *args)
2257{
2258 PyObject *orig_exc;
2259 PyObject *new_type, *new_value, *new_tb;
2260 PyObject *type, *value, *tb;
2261 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2262 &new_type, &new_value, &new_tb))
2263 return NULL;
2264
2265 PyErr_GetExcInfo(&type, &value, &tb);
2266
2267 Py_INCREF(new_type);
2268 Py_INCREF(new_value);
2269 Py_INCREF(new_tb);
2270 PyErr_SetExcInfo(new_type, new_value, new_tb);
2271
2272 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2273 Py_XDECREF(type);
2274 Py_XDECREF(value);
2275 Py_XDECREF(tb);
2276 return orig_exc;
2277}
Benjamin Peterson16323982010-02-03 01:13:41 +00002278
2279static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002280
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002281static PyObject *
2282test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 if (PyDateTimeAPI) {
2284 if (test_run_counter) {
2285 /* Probably regrtest.py -R */
2286 Py_RETURN_NONE;
2287 }
2288 else {
2289 PyErr_SetString(PyExc_AssertionError,
2290 "PyDateTime_CAPI somehow initialized");
2291 return NULL;
2292 }
2293 }
2294 test_run_counter++;
2295 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (PyDateTimeAPI)
2298 Py_RETURN_NONE;
2299 else
2300 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002301}
2302
Paul Ganssle04af5b12018-01-24 17:29:30 -05002303/* Functions exposing the C API type checking for testing */
2304#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2305 PyObject *obj; \
2306 int exact = 0; \
2307 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2308 return NULL; \
2309 } \
2310 int rv = exact?exact_method(obj):check_method(obj); \
2311 if (rv) { \
2312 Py_RETURN_TRUE; \
2313 } else { \
2314 Py_RETURN_FALSE; \
2315 }
2316
2317static PyObject *
2318datetime_check_date(PyObject *self, PyObject *args) {
2319 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2320}
2321
2322static PyObject *
2323datetime_check_time(PyObject *self, PyObject *args) {
2324 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2325}
2326
2327static PyObject *
2328datetime_check_datetime(PyObject *self, PyObject *args) {
2329 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2330}
2331
2332static PyObject *
2333datetime_check_delta(PyObject *self, PyObject *args) {
2334 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2335}
2336
2337static PyObject *
2338datetime_check_tzinfo(PyObject *self, PyObject *args) {
2339 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2340}
2341
2342
2343/* Makes three variations on timezone representing UTC-5:
2344 1. timezone with offset and name from PyDateTimeAPI
2345 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2346 3. timezone with offset (no name) from PyTimeZone_FromOffset
2347*/
2348static PyObject *
2349make_timezones_capi(PyObject *self, PyObject *args) {
2350 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2351 PyObject *name = PyUnicode_FromString("EST");
2352
2353 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2354 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2355 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2356
2357 Py_DecRef(offset);
2358 Py_DecRef(name);
2359
2360 PyObject *rv = PyTuple_New(3);
2361
2362 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2363 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2364 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2365
2366 return rv;
2367}
2368
2369static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002370get_timezones_offset_zero(PyObject *self, PyObject *args) {
2371 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2372 PyObject *name = PyUnicode_FromString("");
2373
2374 // These two should return the UTC singleton
2375 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2376 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2377
2378 // This one will return +00:00 zone, but not the UTC singleton
2379 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2380
2381 Py_DecRef(offset);
2382 Py_DecRef(name);
2383
2384 PyObject *rv = PyTuple_New(3);
2385 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2386 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2387 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2388
2389 return rv;
2390}
2391
2392static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002393get_timezone_utc_capi(PyObject* self, PyObject *args) {
2394 int macro = 0;
2395 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2396 return NULL;
2397 }
2398 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002399 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002400 return PyDateTime_TimeZone_UTC;
2401 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002402 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002403 return PyDateTimeAPI->TimeZone_UTC;
2404 }
2405}
2406
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002407static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002408get_date_fromdate(PyObject *self, PyObject *args)
2409{
2410 PyObject *rv = NULL;
2411 int macro;
2412 int year, month, day;
2413
2414 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2415 return NULL;
2416 }
2417
2418 if (macro) {
2419 rv = PyDate_FromDate(year, month, day);
2420 }
2421 else {
2422 rv = PyDateTimeAPI->Date_FromDate(
2423 year, month, day,
2424 PyDateTimeAPI->DateType);
2425 }
2426 return rv;
2427}
2428
2429static PyObject *
2430get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2431{
2432 PyObject *rv = NULL;
2433 int macro;
2434 int year, month, day;
2435 int hour, minute, second, microsecond;
2436
2437 if (!PyArg_ParseTuple(args, "piiiiiii",
2438 &macro,
2439 &year, &month, &day,
2440 &hour, &minute, &second, &microsecond)) {
2441 return NULL;
2442 }
2443
2444 if (macro) {
2445 rv = PyDateTime_FromDateAndTime(
2446 year, month, day,
2447 hour, minute, second, microsecond);
2448 }
2449 else {
2450 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2451 year, month, day,
2452 hour, minute, second, microsecond,
2453 Py_None,
2454 PyDateTimeAPI->DateTimeType);
2455 }
2456 return rv;
2457}
2458
2459static PyObject *
2460get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2461{
2462 PyObject *rv = NULL;
2463 int macro;
2464 int year, month, day;
2465 int hour, minute, second, microsecond, fold;
2466
2467 if (!PyArg_ParseTuple(args, "piiiiiiii",
2468 &macro,
2469 &year, &month, &day,
2470 &hour, &minute, &second, &microsecond,
2471 &fold)) {
2472 return NULL;
2473 }
2474
2475 if (macro) {
2476 rv = PyDateTime_FromDateAndTimeAndFold(
2477 year, month, day,
2478 hour, minute, second, microsecond,
2479 fold);
2480 }
2481 else {
2482 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2483 year, month, day,
2484 hour, minute, second, microsecond,
2485 Py_None,
2486 fold,
2487 PyDateTimeAPI->DateTimeType);
2488 }
2489 return rv;
2490}
2491
2492static PyObject *
2493get_time_fromtime(PyObject *self, PyObject *args)
2494{
2495 PyObject *rv = NULL;
2496 int macro;
2497 int hour, minute, second, microsecond;
2498
2499 if (!PyArg_ParseTuple(args, "piiii",
2500 &macro,
2501 &hour, &minute, &second, &microsecond)) {
2502 return NULL;
2503 }
2504
2505 if (macro) {
2506 rv = PyTime_FromTime(hour, minute, second, microsecond);
2507 }
2508 else {
2509 rv = PyDateTimeAPI->Time_FromTime(
2510 hour, minute, second, microsecond,
2511 Py_None,
2512 PyDateTimeAPI->TimeType);
2513 }
2514 return rv;
2515}
2516
2517static PyObject *
2518get_time_fromtimeandfold(PyObject *self, PyObject *args)
2519{
2520 PyObject *rv = NULL;
2521 int macro;
2522 int hour, minute, second, microsecond, fold;
2523
2524 if (!PyArg_ParseTuple(args, "piiiii",
2525 &macro,
2526 &hour, &minute, &second, &microsecond,
2527 &fold)) {
2528 return NULL;
2529 }
2530
2531 if (macro) {
2532 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2533 }
2534 else {
2535 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2536 hour, minute, second, microsecond,
2537 Py_None,
2538 fold,
2539 PyDateTimeAPI->TimeType);
2540 }
2541 return rv;
2542}
2543
2544static PyObject *
2545get_delta_fromdsu(PyObject *self, PyObject *args)
2546{
2547 PyObject *rv = NULL;
2548 int macro;
2549 int days, seconds, microseconds;
2550
2551 if (!PyArg_ParseTuple(args, "piii",
2552 &macro,
2553 &days, &seconds, &microseconds)) {
2554 return NULL;
2555 }
2556
2557 if (macro) {
2558 rv = PyDelta_FromDSU(days, seconds, microseconds);
2559 }
2560 else {
2561 rv = PyDateTimeAPI->Delta_FromDelta(
2562 days, seconds, microseconds, 1,
2563 PyDateTimeAPI->DeltaType);
2564 }
2565
2566 return rv;
2567}
2568
2569static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002570get_date_fromtimestamp(PyObject* self, PyObject *args)
2571{
2572 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2573 int macro = 0;
2574
2575 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2576 return NULL;
2577 }
2578
2579 // Construct the argument tuple
2580 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2581 return NULL;
2582 }
2583
2584 // Pass along to the API function
2585 if (macro) {
2586 rv = PyDate_FromTimestamp(tsargs);
2587 }
2588 else {
2589 rv = PyDateTimeAPI->Date_FromTimestamp(
2590 (PyObject *)PyDateTimeAPI->DateType, tsargs
2591 );
2592 }
2593
2594 Py_DECREF(tsargs);
2595 return rv;
2596}
2597
2598static PyObject *
2599get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2600{
2601 int macro = 0;
2602 int usetz = 0;
2603 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2604 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2605 return NULL;
2606 }
2607
2608 // Construct the argument tuple
2609 if (usetz) {
2610 tsargs = PyTuple_Pack(2, ts, tzinfo);
2611 }
2612 else {
2613 tsargs = PyTuple_Pack(1, ts);
2614 }
2615
2616 if (tsargs == NULL) {
2617 return NULL;
2618 }
2619
2620 // Pass along to the API function
2621 if (macro) {
2622 rv = PyDateTime_FromTimestamp(tsargs);
2623 }
2624 else {
2625 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2626 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2627 );
2628 }
2629
2630 Py_DECREF(tsargs);
2631 return rv;
2632}
2633
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002634static PyObject *
2635test_PyDateTime_GET(PyObject *self, PyObject *obj)
2636{
2637 int year, month, day;
2638
2639 year = PyDateTime_GET_YEAR(obj);
2640 month = PyDateTime_GET_MONTH(obj);
2641 day = PyDateTime_GET_DAY(obj);
2642
2643 return Py_BuildValue("(lll)", year, month, day);
2644}
2645
2646static PyObject *
2647test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2648{
2649 int hour, minute, second, microsecond;
2650
2651 hour = PyDateTime_DATE_GET_HOUR(obj);
2652 minute = PyDateTime_DATE_GET_MINUTE(obj);
2653 second = PyDateTime_DATE_GET_SECOND(obj);
2654 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2655
2656 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2657}
2658
2659static PyObject *
2660test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2661{
2662 int hour, minute, second, microsecond;
2663
2664 hour = PyDateTime_TIME_GET_HOUR(obj);
2665 minute = PyDateTime_TIME_GET_MINUTE(obj);
2666 second = PyDateTime_TIME_GET_SECOND(obj);
2667 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
2668
2669 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2670}
2671
2672static PyObject *
2673test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2674{
2675 int days, seconds, microseconds;
2676
2677 days = PyDateTime_DELTA_GET_DAYS(obj);
2678 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2679 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2680
2681 return Py_BuildValue("(lll)", days, seconds, microseconds);
2682}
Benjamin Peterson16323982010-02-03 01:13:41 +00002683
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002684/* test_thread_state spawns a thread of its own, and that thread releases
2685 * `thread_done` when it's finished. The driver code has to know when the
2686 * thread finishes, because the thread uses a PyObject (the callable) that
2687 * may go away when the driver finishes. The former lack of this explicit
2688 * synchronization caused rare segfaults, so rare that they were seen only
2689 * on a Mac buildbot (although they were possible on any box).
2690 */
2691static PyThread_type_lock thread_done = NULL;
2692
Benjamin Petersona786b022008-08-25 21:05:21 +00002693static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002694_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 PyObject *rc;
2697 int success;
2698 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002699 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 success = (rc != NULL);
2701 Py_XDECREF(rc);
2702 PyGILState_Release(s);
2703 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002704}
2705
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002706/* Same thing, but releases `thread_done` when it returns. This variant
2707 * should be called only from threads spawned by test_thread_state().
2708 */
2709static void
2710_make_call_from_thread(void *callable)
2711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 _make_call(callable);
2713 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002714}
2715
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002716static PyObject *
2717test_thread_state(PyObject *self, PyObject *args)
2718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 PyObject *fn;
2720 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2723 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 if (!PyCallable_Check(fn)) {
2726 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2727 fn->ob_type->tp_name);
2728 return NULL;
2729 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 /* Ensure Python is set up for threading */
2732 PyEval_InitThreads();
2733 thread_done = PyThread_allocate_lock();
2734 if (thread_done == NULL)
2735 return PyErr_NoMemory();
2736 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 /* Start a new thread with our callback. */
2739 PyThread_start_new_thread(_make_call_from_thread, fn);
2740 /* Make the callback with the thread lock held by this thread */
2741 success &= _make_call(fn);
2742 /* Do it all again, but this time with the thread-lock released */
2743 Py_BEGIN_ALLOW_THREADS
2744 success &= _make_call(fn);
2745 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2746 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 /* And once more with and without a thread
2749 XXX - should use a lock and work out exactly what we are trying
2750 to test <wink>
2751 */
2752 Py_BEGIN_ALLOW_THREADS
2753 PyThread_start_new_thread(_make_call_from_thread, fn);
2754 success &= _make_call(fn);
2755 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2756 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 /* Release lock we acquired above. This is required on HP-UX. */
2759 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 PyThread_free_lock(thread_done);
2762 if (!success)
2763 return NULL;
2764 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002765}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002766
2767/* test Py_AddPendingCalls using threads */
2768static int _pending_callback(void *arg)
2769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 /* we assume the argument is callable object to which we own a reference */
2771 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002772 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 Py_DECREF(callable);
2774 Py_XDECREF(r);
2775 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002776}
2777
2778/* The following requests n callbacks to _pending_callback. It can be
2779 * run from any python thread.
2780 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002781static PyObject *
2782pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 PyObject *callable;
2785 int r;
2786 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2787 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 /* create the reference for the callbackwhile we hold the lock */
2790 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 Py_BEGIN_ALLOW_THREADS
2793 r = Py_AddPendingCall(&_pending_callback, callable);
2794 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 if (r<0) {
2797 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002798 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002800 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002801}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002802
Neal Norwitzb0d26332007-08-25 00:49:05 +00002803/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002804static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002805test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 PyObject *result;
2808 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002809
Alexander Belopolskye239d232010-12-08 23:31:48 +00002810#define CHECK_1_FORMAT(FORMAT, TYPE) \
2811 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2812 if (result == NULL) \
2813 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002814 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002815 msg = FORMAT " failed at 1"; \
2816 goto Fail; \
2817 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 CHECK_1_FORMAT("%d", int);
2821 CHECK_1_FORMAT("%ld", long);
2822 /* The z width modifier was added in Python 2.5. */
2823 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 /* The u type code was added in Python 2.5. */
2826 CHECK_1_FORMAT("%u", unsigned int);
2827 CHECK_1_FORMAT("%lu", unsigned long);
2828 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002831 CHECK_1_FORMAT("%llu", unsigned long long);
2832 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835
2836 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 Py_XDECREF(result);
2838 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002839
2840#undef CHECK_1_FORMAT
2841}
2842
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002843
2844static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302845test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2847 int result;
2848 if (py_s == NULL)
2849 return NULL;
2850 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2851 Py_DECREF(py_s);
2852 if (!result) {
2853 PyErr_SetString(TestError, "Python string ending in NULL "
2854 "should not compare equal to c string.");
2855 return NULL;
2856 }
2857 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002858}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002859
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002860/* This is here to provide a docstring for test_descr. */
2861static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302862test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002865}
2866
Mark Dickinson725bfd82009-05-03 20:33:40 +00002867/* Test PyOS_string_to_double. */
2868static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302869test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002871 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873#define CHECK_STRING(STR, expected) \
2874 result = PyOS_string_to_double(STR, NULL, NULL); \
2875 if (result == -1.0 && PyErr_Occurred()) \
2876 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002877 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 msg = "conversion of " STR " to float failed"; \
2879 goto fail; \
2880 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882#define CHECK_INVALID(STR) \
2883 result = PyOS_string_to_double(STR, NULL, NULL); \
2884 if (result == -1.0 && PyErr_Occurred()) { \
2885 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2886 PyErr_Clear(); \
2887 else \
2888 return NULL; \
2889 } \
2890 else { \
2891 msg = "conversion of " STR " didn't raise ValueError"; \
2892 goto fail; \
2893 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 CHECK_STRING("0.1", 0.1);
2896 CHECK_STRING("1.234", 1.234);
2897 CHECK_STRING("-1.35", -1.35);
2898 CHECK_STRING(".1e01", 1.0);
2899 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 CHECK_INVALID(" 0.1");
2902 CHECK_INVALID("\t\n-3");
2903 CHECK_INVALID(".123 ");
2904 CHECK_INVALID("3\n");
2905 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002908 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002910#undef CHECK_STRING
2911#undef CHECK_INVALID
2912}
2913
2914
Benjamin Petersonb173f782009-05-05 22:31:58 +00002915/* Coverage testing of capsule objects. */
2916
2917static const char *capsule_name = "capsule name";
2918static char *capsule_pointer = "capsule pointer";
2919static char *capsule_context = "capsule context";
2920static const char *capsule_error = NULL;
2921static int
2922capsule_destructor_call_count = 0;
2923
2924static void
2925capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 capsule_destructor_call_count++;
2927 if (PyCapsule_GetContext(o) != capsule_context) {
2928 capsule_error = "context did not match in destructor!";
2929 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2930 capsule_error = "destructor did not match in destructor! (woah!)";
2931 } else if (PyCapsule_GetName(o) != capsule_name) {
2932 capsule_error = "name did not match in destructor!";
2933 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2934 capsule_error = "pointer did not match in destructor!";
2935 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002936}
2937
2938typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 char *name;
2940 char *module;
2941 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002942} known_capsule;
2943
2944static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002945test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 PyObject *object;
2948 const char *error = NULL;
2949 void *pointer;
2950 void *pointer2;
2951 known_capsule known_capsules[] = {
2952 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2953 KNOWN_CAPSULE("_socket", "CAPI"),
2954 KNOWN_CAPSULE("_curses", "_C_API"),
2955 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2956 { NULL, NULL },
2957 };
2958 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002959
2960#define FAIL(x) { error = (x); goto exit; }
2961
2962#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 if (capsule_error) { \
2964 FAIL(capsule_error); \
2965 } \
2966 else if (!capsule_destructor_call_count) { \
2967 FAIL("destructor not called!"); \
2968 } \
2969 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2972 PyCapsule_SetContext(object, capsule_context);
2973 capsule_destructor(object);
2974 CHECK_DESTRUCTOR;
2975 Py_DECREF(object);
2976 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 object = PyCapsule_New(known, "ignored", NULL);
2979 PyCapsule_SetPointer(object, capsule_pointer);
2980 PyCapsule_SetName(object, capsule_name);
2981 PyCapsule_SetDestructor(object, capsule_destructor);
2982 PyCapsule_SetContext(object, capsule_context);
2983 capsule_destructor(object);
2984 CHECK_DESTRUCTOR;
2985 /* intentionally access using the wrong name */
2986 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2987 if (!PyErr_Occurred()) {
2988 FAIL("PyCapsule_GetPointer should have failed but did not!");
2989 }
2990 PyErr_Clear();
2991 if (pointer2) {
2992 if (pointer2 == capsule_pointer) {
2993 FAIL("PyCapsule_GetPointer should not have"
2994 " returned the internal pointer!");
2995 } else {
2996 FAIL("PyCapsule_GetPointer should have "
2997 "returned NULL pointer but did not!");
2998 }
2999 }
3000 PyCapsule_SetDestructor(object, NULL);
3001 Py_DECREF(object);
3002 if (capsule_destructor_call_count) {
3003 FAIL("destructor called when it should not have been!");
3004 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 for (known = &known_capsules[0]; known->module != NULL; known++) {
3007 /* yeah, ordinarily I wouldn't do this either,
3008 but it's fine for this test harness.
3009 */
3010 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003011#undef FAIL
3012#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 { \
3014 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3015 x, known->module, known->attribute); \
3016 error = buffer; \
3017 goto exit; \
3018 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 PyObject *module = PyImport_ImportModule(known->module);
3021 if (module) {
3022 pointer = PyCapsule_Import(known->name, 0);
3023 if (!pointer) {
3024 Py_DECREF(module);
3025 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3026 }
3027 object = PyObject_GetAttrString(module, known->attribute);
3028 if (!object) {
3029 Py_DECREF(module);
3030 return NULL;
3031 }
3032 pointer2 = PyCapsule_GetPointer(object,
3033 "weebles wobble but they don't fall down");
3034 if (!PyErr_Occurred()) {
3035 Py_DECREF(object);
3036 Py_DECREF(module);
3037 FAIL("PyCapsule_GetPointer should have failed but did not!");
3038 }
3039 PyErr_Clear();
3040 if (pointer2) {
3041 Py_DECREF(module);
3042 Py_DECREF(object);
3043 if (pointer2 == pointer) {
3044 FAIL("PyCapsule_GetPointer should not have"
3045 " returned its internal pointer!");
3046 } else {
3047 FAIL("PyCapsule_GetPointer should have"
3048 " returned NULL pointer but did not!");
3049 }
3050 }
3051 Py_DECREF(object);
3052 Py_DECREF(module);
3053 }
3054 else
3055 PyErr_Clear();
3056 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003057
3058 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 if (error) {
3060 return raiseTestError("test_capsule", error);
3061 }
3062 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003063#undef FAIL
3064}
3065
Guido van Rossumddefaf32007-01-14 03:31:43 +00003066#ifdef HAVE_GETTIMEOFDAY
3067/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003068static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 e->tv_sec -= s->tv_sec;
3071 e->tv_usec -= s->tv_usec;
3072 if (e->tv_usec < 0) {
3073 e->tv_sec -=1;
3074 e->tv_usec += 1000000;
3075 }
3076 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003077}
3078
3079static PyObject *
3080profile_int(PyObject *self, PyObject* args)
3081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 int i, k;
3083 struct timeval start, stop;
3084 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 /* Test 1: Allocate and immediately deallocate
3087 many small integers */
3088 gettimeofday(&start, NULL);
3089 for(k=0; k < 20000; k++)
3090 for(i=0; i < 1000; i++) {
3091 single = PyLong_FromLong(i);
3092 Py_DECREF(single);
3093 }
3094 gettimeofday(&stop, NULL);
3095 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 /* Test 2: Allocate and immediately deallocate
3098 many large integers */
3099 gettimeofday(&start, NULL);
3100 for(k=0; k < 20000; k++)
3101 for(i=0; i < 1000; i++) {
3102 single = PyLong_FromLong(i+1000000);
3103 Py_DECREF(single);
3104 }
3105 gettimeofday(&stop, NULL);
3106 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 /* Test 3: Allocate a few integers, then release
3109 them all simultaneously. */
3110 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003111 if (multiple == NULL)
3112 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 gettimeofday(&start, NULL);
3114 for(k=0; k < 20000; k++) {
3115 for(i=0; i < 1000; i++) {
3116 multiple[i] = PyLong_FromLong(i+1000000);
3117 }
3118 for(i=0; i < 1000; i++) {
3119 Py_DECREF(multiple[i]);
3120 }
3121 }
3122 gettimeofday(&stop, NULL);
3123 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003124 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 /* Test 4: Allocate many integers, then release
3127 them all simultaneously. */
3128 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003129 if (multiple == NULL)
3130 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 gettimeofday(&start, NULL);
3132 for(k=0; k < 20; k++) {
3133 for(i=0; i < 1000000; i++) {
3134 multiple[i] = PyLong_FromLong(i+1000000);
3135 }
3136 for(i=0; i < 1000000; i++) {
3137 Py_DECREF(multiple[i]);
3138 }
3139 }
3140 gettimeofday(&stop, NULL);
3141 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003142 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 /* Test 5: Allocate many integers < 32000 */
3145 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003146 if (multiple == NULL)
3147 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 gettimeofday(&start, NULL);
3149 for(k=0; k < 10; k++) {
3150 for(i=0; i < 1000000; i++) {
3151 multiple[i] = PyLong_FromLong(i+1000);
3152 }
3153 for(i=0; i < 1000000; i++) {
3154 Py_DECREF(multiple[i]);
3155 }
3156 }
3157 gettimeofday(&stop, NULL);
3158 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003159 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 /* Test 6: Perform small int addition */
3162 op1 = PyLong_FromLong(1);
3163 gettimeofday(&start, NULL);
3164 for(i=0; i < 10000000; i++) {
3165 result = PyNumber_Add(op1, op1);
3166 Py_DECREF(result);
3167 }
3168 gettimeofday(&stop, NULL);
3169 Py_DECREF(op1);
3170 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 /* Test 7: Perform medium int addition */
3173 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003174 if (op1 == NULL)
3175 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 gettimeofday(&start, NULL);
3177 for(i=0; i < 10000000; i++) {
3178 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003179 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 }
3181 gettimeofday(&stop, NULL);
3182 Py_DECREF(op1);
3183 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003184
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003185 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003186}
3187#endif
3188
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003189/* To test the format of tracebacks as printed out. */
3190static PyObject *
3191traceback_print(PyObject *self, PyObject *args)
3192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 PyObject *file;
3194 PyObject *traceback;
3195 int result;
3196
3197 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3198 &traceback, &file))
3199 return NULL;
3200
3201 result = PyTraceBack_Print(traceback, file);
3202 if (result < 0)
3203 return NULL;
3204 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003205}
3206
Benjamin Petersone6528212008-07-15 15:32:09 +00003207/* To test the format of exceptions as printed out. */
3208static PyObject *
3209exception_print(PyObject *self, PyObject *args)
3210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 PyObject *value;
3212 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 if (!PyArg_ParseTuple(args, "O:exception_print",
3215 &value))
3216 return NULL;
3217 if (!PyExceptionInstance_Check(value)) {
3218 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3219 return NULL;
3220 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 tb = PyException_GetTraceback(value);
3223 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3224 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003227}
3228
3229
3230
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003231
3232/* reliably raise a MemoryError */
3233static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303234raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 PyErr_NoMemory();
3237 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003238}
3239
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003240/* Issue 6012 */
3241static PyObject *str1, *str2;
3242static int
3243failing_converter(PyObject *obj, void *arg)
3244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 /* Clone str1, then let the conversion fail. */
3246 assert(str1);
3247 str2 = str1;
3248 Py_INCREF(str2);
3249 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003250}
3251static PyObject*
3252argparsing(PyObject *o, PyObject *args)
3253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 PyObject *res;
3255 str1 = str2 = NULL;
3256 if (!PyArg_ParseTuple(args, "O&O&",
3257 PyUnicode_FSConverter, &str1,
3258 failing_converter, &str2)) {
3259 if (!str2)
3260 /* argument converter not called? */
3261 return NULL;
3262 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003263 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 Py_DECREF(str2);
3265 PyErr_Clear();
3266 return res;
3267 }
3268 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003269}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003270
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003271/* To test that the result of PyCode_NewEmpty has the right members. */
3272static PyObject *
3273code_newempty(PyObject *self, PyObject *args)
3274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 const char *filename;
3276 const char *funcname;
3277 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3280 &filename, &funcname, &firstlineno))
3281 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003284}
3285
Georg Brandl1e28a272009-12-28 08:41:01 +00003286/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3287 Run via Lib/test/test_exceptions.py */
3288static PyObject *
3289make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 const char *name;
3292 const char *doc = NULL;
3293 PyObject *base = NULL;
3294 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3299 "s|sOO:make_exception_with_doc", kwlist,
3300 &name, &doc, &base, &dict))
3301 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003304}
3305
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003306static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303307make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003308{
3309 Py_buffer info;
3310 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3311 return NULL;
3312 return PyMemoryView_FromBuffer(&info);
3313}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003314
Stefan Krah7213fcc2015-02-01 16:19:23 +01003315static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003316test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003317{
3318 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3319 int init[5] = {0, 1, 2, 3, 4};
3320 Py_ssize_t itemsize = sizeof(int);
3321 Py_ssize_t shape = 5;
3322 Py_ssize_t strides = 2 * itemsize;
3323 Py_buffer view = {
3324 data,
3325 NULL,
3326 5 * itemsize,
3327 itemsize,
3328 1,
3329 1,
3330 NULL,
3331 &shape,
3332 &strides,
3333 NULL,
3334 NULL
3335 };
3336 int *ptr;
3337 int i;
3338
3339 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3340 ptr = view.buf;
3341 for (i = 0; i < 5; i++) {
3342 if (ptr[2*i] != i) {
3343 PyErr_SetString(TestError,
3344 "test_from_contiguous: incorrect result");
3345 return NULL;
3346 }
3347 }
3348
3349 view.buf = &data[8];
3350 view.strides[0] = -2 * itemsize;
3351
3352 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3353 ptr = view.buf;
3354 for (i = 0; i < 5; i++) {
3355 if (*(ptr-2*i) != i) {
3356 PyErr_SetString(TestError,
3357 "test_from_contiguous: incorrect result");
3358 return NULL;
3359 }
3360 }
3361
3362 Py_RETURN_NONE;
3363}
Stefan Krah650c1e82015-02-03 21:43:23 +01003364
Stefan Kraha7559c02015-02-03 22:27:21 +01003365#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003366extern PyTypeObject _PyBytesIOBuffer_Type;
3367
Stefan Krah5178d912015-02-03 16:57:21 +01003368static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003369test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003370{
Stefan Krah650c1e82015-02-03 21:43:23 +01003371 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003372 PyObject *b;
3373 char *dummy[1];
3374 int ret, match;
3375
Stefan Krah650c1e82015-02-03 21:43:23 +01003376 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003377 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3378 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3379 PyErr_Clear();
3380 if (ret != -1 || match == 0)
3381 goto error;
3382
Stefan Krah650c1e82015-02-03 21:43:23 +01003383 /* bytesiobuf_getbuffer() */
3384 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003385 if (b == NULL) {
3386 return NULL;
3387 }
3388
3389 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3390 Py_DECREF(b);
3391 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3392 PyErr_Clear();
3393 if (ret != -1 || match == 0)
3394 goto error;
3395
3396 Py_RETURN_NONE;
3397
3398error:
3399 PyErr_SetString(TestError,
3400 "test_pep3118_obsolete_write_locks: failure");
3401 return NULL;
3402}
Stefan Kraha7559c02015-02-03 22:27:21 +01003403#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003404
Stefan Krah650c1e82015-02-03 21:43:23 +01003405/* This tests functions that historically supported write locks. It is
3406 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3407 is entitled to segfault in that case. */
3408static PyObject *
3409getbuffer_with_null_view(PyObject* self, PyObject *obj)
3410{
3411 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3412 return NULL;
3413
3414 Py_RETURN_NONE;
3415}
3416
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003417/* PyBuffer_SizeFromFormat() */
3418static PyObject *
3419test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3420{
3421 const char *format;
3422 Py_ssize_t result;
3423
3424 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3425 &format)) {
3426 return NULL;
3427 }
3428
3429 result = PyBuffer_SizeFromFormat(format);
3430 if (result == -1) {
3431 return NULL;
3432 }
3433
3434 return PyLong_FromSsize_t(result);
3435}
3436
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003437/* Test that the fatal error from not having a current thread doesn't
3438 cause an infinite loop. Run via Lib/test/test_capi.py */
3439static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303440crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003441{
3442 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003443 /* Using PyThreadState_Get() directly allows the test to pass in
3444 !pydebug mode. However, the test only actually tests anything
3445 in pydebug mode, since that's where the infinite loop was in
3446 the first place. */
3447 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003448 Py_END_ALLOW_THREADS
3449 return NULL;
3450}
3451
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003452/* To run some code in a sub-interpreter. */
3453static PyObject *
3454run_in_subinterp(PyObject *self, PyObject *args)
3455{
3456 const char *code;
3457 int r;
3458 PyThreadState *substate, *mainstate;
3459
3460 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3461 &code))
3462 return NULL;
3463
3464 mainstate = PyThreadState_Get();
3465
3466 PyThreadState_Swap(NULL);
3467
3468 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003469 if (substate == NULL) {
3470 /* Since no new thread state was created, there is no exception to
3471 propagate; raise a fresh one after swapping in the old thread
3472 state. */
3473 PyThreadState_Swap(mainstate);
3474 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3475 return NULL;
3476 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003477 r = PyRun_SimpleString(code);
3478 Py_EndInterpreter(substate);
3479
3480 PyThreadState_Swap(mainstate);
3481
3482 return PyLong_FromLong(r);
3483}
3484
Victor Stinner3c1b3792014-02-17 00:02:43 +01003485static int
3486check_time_rounding(int round)
3487{
Victor Stinner74474232015-09-02 01:43:56 +02003488 if (round != _PyTime_ROUND_FLOOR
3489 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003490 && round != _PyTime_ROUND_HALF_EVEN
3491 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003492 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3493 return -1;
3494 }
3495 return 0;
3496}
3497
Victor Stinner5d272cc2012-03-13 13:35:55 +01003498static PyObject *
3499test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3500{
3501 PyObject *obj;
3502 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003503 int round;
3504 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003505 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003506 if (check_time_rounding(round) < 0)
3507 return NULL;
3508 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003509 return NULL;
3510 return _PyLong_FromTime_t(sec);
3511}
3512
3513static PyObject *
3514test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3515{
3516 PyObject *obj;
3517 time_t sec;
3518 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003519 int round;
3520 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003521 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003522 if (check_time_rounding(round) < 0)
3523 return NULL;
3524 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003525 return NULL;
3526 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3527}
3528
Victor Stinner643cd682012-03-02 22:54:03 +01003529static PyObject *
3530test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3531{
3532 PyObject *obj;
3533 time_t sec;
3534 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003535 int round;
3536 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003537 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003538 if (check_time_rounding(round) < 0)
3539 return NULL;
3540 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003541 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003542 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003543}
3544
Antoine Pitrou796564c2013-07-30 19:59:21 +02003545static void
3546slot_tp_del(PyObject *self)
3547{
3548 _Py_IDENTIFIER(__tp_del__);
3549 PyObject *del, *res;
3550 PyObject *error_type, *error_value, *error_traceback;
3551
3552 /* Temporarily resurrect the object. */
3553 assert(self->ob_refcnt == 0);
3554 self->ob_refcnt = 1;
3555
3556 /* Save the current exception, if any. */
3557 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3558
3559 /* Execute __del__ method, if any. */
3560 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3561 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003562 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003563 if (res == NULL)
3564 PyErr_WriteUnraisable(del);
3565 else
3566 Py_DECREF(res);
3567 Py_DECREF(del);
3568 }
3569
3570 /* Restore the saved exception. */
3571 PyErr_Restore(error_type, error_value, error_traceback);
3572
3573 /* Undo the temporary resurrection; can't use DECREF here, it would
3574 * cause a recursive call.
3575 */
3576 assert(self->ob_refcnt > 0);
3577 if (--self->ob_refcnt == 0)
3578 return; /* this is the normal path out */
3579
3580 /* __del__ resurrected it! Make it look like the original Py_DECREF
3581 * never happened.
3582 */
3583 {
3584 Py_ssize_t refcnt = self->ob_refcnt;
3585 _Py_NewReference(self);
3586 self->ob_refcnt = refcnt;
3587 }
INADA Naokid8521422018-05-17 11:07:21 +09003588 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003589 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3590 * we need to undo that. */
3591 _Py_DEC_REFTOTAL;
3592 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3593 * chain, so no more to do there.
3594 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3595 * _Py_NewReference bumped tp_allocs: both of those need to be
3596 * undone.
3597 */
3598#ifdef COUNT_ALLOCS
3599 --Py_TYPE(self)->tp_frees;
3600 --Py_TYPE(self)->tp_allocs;
3601#endif
3602}
3603
3604static PyObject *
3605with_tp_del(PyObject *self, PyObject *args)
3606{
3607 PyObject *obj;
3608 PyTypeObject *tp;
3609
3610 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3611 return NULL;
3612 tp = (PyTypeObject *) obj;
3613 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3614 PyErr_Format(PyExc_TypeError,
3615 "heap type expected, got %R", obj);
3616 return NULL;
3617 }
3618 tp->tp_del = slot_tp_del;
3619 Py_INCREF(obj);
3620 return obj;
3621}
3622
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003623static PyMethodDef ml;
3624
3625static PyObject *
3626create_cfunction(PyObject *self, PyObject *args)
3627{
3628 return PyCFunction_NewEx(&ml, self, NULL);
3629}
3630
3631static PyMethodDef ml = {
3632 "create_cfunction",
3633 create_cfunction,
3634 METH_NOARGS,
3635 NULL
3636};
3637
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003638static PyObject *
3639_test_incref(PyObject *ob)
3640{
3641 Py_INCREF(ob);
3642 return ob;
3643}
3644
3645static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303646test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003647{
3648 PyObject *obj = PyLong_FromLong(0);
3649 Py_XINCREF(_test_incref(obj));
3650 Py_DECREF(obj);
3651 Py_DECREF(obj);
3652 Py_DECREF(obj);
3653 Py_RETURN_NONE;
3654}
3655
3656static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303657test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003658{
3659 PyObject *obj = PyLong_FromLong(0);
3660 Py_INCREF(_test_incref(obj));
3661 Py_DECREF(obj);
3662 Py_DECREF(obj);
3663 Py_DECREF(obj);
3664 Py_RETURN_NONE;
3665}
3666
3667static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303668test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003669{
3670 Py_XDECREF(PyLong_FromLong(0));
3671 Py_RETURN_NONE;
3672}
3673
3674static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303675test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003676{
3677 Py_DECREF(PyLong_FromLong(0));
3678 Py_RETURN_NONE;
3679}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003680
Victor Stinner0507bf52013-07-07 02:05:46 +02003681static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003682test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3683 PyObject *Py_UNUSED(args))
3684{
3685 PyStructSequence_Desc descr;
3686 PyStructSequence_Field descr_fields[3];
3687
3688 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3689 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3690 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3691
3692 descr.name = "_testcapi.test_descr";
3693 descr.doc = "This is used to test for memory leaks in NewType";
3694 descr.fields = descr_fields;
3695 descr.n_in_sequence = 1;
3696
3697 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3698 assert(structseq_type != NULL);
3699 assert(PyType_Check(structseq_type));
3700 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3701 Py_DECREF(structseq_type);
3702
3703 Py_RETURN_NONE;
3704}
3705
3706static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303707test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003708{
3709 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003710 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003711 Py_DecRef(obj);
3712 Py_DecRef(obj);
3713 Py_RETURN_NONE;
3714}
3715
3716static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303717test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003718{
3719 void *ptr;
3720
Victor Stinnerdb067af2014-05-02 22:31:14 +02003721 ptr = PyMem_RawMalloc(0);
3722 if (ptr == NULL) {
3723 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3724 return NULL;
3725 }
3726 PyMem_RawFree(ptr);
3727
3728 ptr = PyMem_RawCalloc(0, 0);
3729 if (ptr == NULL) {
3730 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3731 return NULL;
3732 }
3733 PyMem_RawFree(ptr);
3734
Victor Stinner0507bf52013-07-07 02:05:46 +02003735 ptr = PyMem_Malloc(0);
3736 if (ptr == NULL) {
3737 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3738 return NULL;
3739 }
3740 PyMem_Free(ptr);
3741
Victor Stinnerdb067af2014-05-02 22:31:14 +02003742 ptr = PyMem_Calloc(0, 0);
3743 if (ptr == NULL) {
3744 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3745 return NULL;
3746 }
3747 PyMem_Free(ptr);
3748
Victor Stinner0507bf52013-07-07 02:05:46 +02003749 ptr = PyObject_Malloc(0);
3750 if (ptr == NULL) {
3751 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3752 return NULL;
3753 }
3754 PyObject_Free(ptr);
3755
Victor Stinnerdb067af2014-05-02 22:31:14 +02003756 ptr = PyObject_Calloc(0, 0);
3757 if (ptr == NULL) {
3758 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3759 return NULL;
3760 }
3761 PyObject_Free(ptr);
3762
Victor Stinner0507bf52013-07-07 02:05:46 +02003763 Py_RETURN_NONE;
3764}
3765
3766typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003767 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003768
3769 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003770 size_t calloc_nelem;
3771 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003772 void *realloc_ptr;
3773 size_t realloc_new_size;
3774 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003775 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003776} alloc_hook_t;
3777
Victor Stinner9ed83c42017-10-31 12:18:10 -07003778static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003779{
3780 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003781 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003782 hook->malloc_size = size;
3783 return hook->alloc.malloc(hook->alloc.ctx, size);
3784}
3785
Victor Stinner9ed83c42017-10-31 12:18:10 -07003786static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003787{
3788 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003789 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003790 hook->calloc_nelem = nelem;
3791 hook->calloc_elsize = elsize;
3792 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3793}
3794
Victor Stinner9ed83c42017-10-31 12:18:10 -07003795static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003796{
3797 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003798 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003799 hook->realloc_ptr = ptr;
3800 hook->realloc_new_size = new_size;
3801 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3802}
3803
Victor Stinner9ed83c42017-10-31 12:18:10 -07003804static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003805{
3806 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003807 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003808 hook->free_ptr = ptr;
3809 hook->alloc.free(hook->alloc.ctx, ptr);
3810}
3811
3812static PyObject *
3813test_setallocators(PyMemAllocatorDomain domain)
3814{
3815 PyObject *res = NULL;
3816 const char *error_msg;
3817 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003818 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003819 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003820 void *ptr, *ptr2;
3821
Victor Stinnerdb067af2014-05-02 22:31:14 +02003822 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003823
3824 alloc.ctx = &hook;
3825 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003826 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003827 alloc.realloc = &hook_realloc;
3828 alloc.free = &hook_free;
3829 PyMem_GetAllocator(domain, &hook.alloc);
3830 PyMem_SetAllocator(domain, &alloc);
3831
Victor Stinner9ed83c42017-10-31 12:18:10 -07003832 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003833 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003834 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003835 switch(domain)
3836 {
3837 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3838 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3839 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3840 default: ptr = NULL; break;
3841 }
3842
Victor Stinner9ed83c42017-10-31 12:18:10 -07003843#define CHECK_CTX(FUNC) \
3844 if (hook.ctx != &hook) { \
3845 error_msg = FUNC " wrong context"; \
3846 goto fail; \
3847 } \
3848 hook.ctx = NULL; /* reset for next check */
3849
Victor Stinner0507bf52013-07-07 02:05:46 +02003850 if (ptr == NULL) {
3851 error_msg = "malloc failed";
3852 goto fail;
3853 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003854 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003855 if (hook.malloc_size != size) {
3856 error_msg = "malloc invalid size";
3857 goto fail;
3858 }
3859
3860 size2 = 200;
3861 switch(domain)
3862 {
3863 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3864 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3865 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003866 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003867 }
3868
3869 if (ptr2 == NULL) {
3870 error_msg = "realloc failed";
3871 goto fail;
3872 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003873 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003874 if (hook.realloc_ptr != ptr
3875 || hook.realloc_new_size != size2) {
3876 error_msg = "realloc invalid parameters";
3877 goto fail;
3878 }
3879
3880 switch(domain)
3881 {
3882 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3883 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3884 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3885 }
3886
Victor Stinner9ed83c42017-10-31 12:18:10 -07003887 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003888 if (hook.free_ptr != ptr2) {
3889 error_msg = "free invalid pointer";
3890 goto fail;
3891 }
3892
Victor Stinner9ed83c42017-10-31 12:18:10 -07003893 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003894 nelem = 2;
3895 elsize = 5;
3896 switch(domain)
3897 {
3898 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3899 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3900 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3901 default: ptr = NULL; break;
3902 }
3903
3904 if (ptr == NULL) {
3905 error_msg = "calloc failed";
3906 goto fail;
3907 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003908 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003909 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3910 error_msg = "calloc invalid nelem or elsize";
3911 goto fail;
3912 }
3913
Victor Stinner9ed83c42017-10-31 12:18:10 -07003914 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003915 switch(domain)
3916 {
3917 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3918 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3919 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3920 }
3921
Victor Stinner9ed83c42017-10-31 12:18:10 -07003922 CHECK_CTX("calloc free");
3923 if (hook.free_ptr != ptr) {
3924 error_msg = "calloc free invalid pointer";
3925 goto fail;
3926 }
3927
Victor Stinner0507bf52013-07-07 02:05:46 +02003928 Py_INCREF(Py_None);
3929 res = Py_None;
3930 goto finally;
3931
3932fail:
3933 PyErr_SetString(PyExc_RuntimeError, error_msg);
3934
3935finally:
3936 PyMem_SetAllocator(domain, &hook.alloc);
3937 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003938
3939#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003940}
3941
3942static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303943test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003944{
3945 return test_setallocators(PYMEM_DOMAIN_RAW);
3946}
3947
3948static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303949test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003950{
3951 return test_setallocators(PYMEM_DOMAIN_MEM);
3952}
3953
3954static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303955test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003956{
3957 return test_setallocators(PYMEM_DOMAIN_OBJ);
3958}
3959
xdegaye85f64302017-07-01 14:14:45 +02003960/* Most part of the following code is inherited from the pyfailmalloc project
3961 * written by Victor Stinner. */
3962static struct {
3963 int installed;
3964 PyMemAllocatorEx raw;
3965 PyMemAllocatorEx mem;
3966 PyMemAllocatorEx obj;
3967} FmHook;
3968
3969static struct {
3970 int start;
3971 int stop;
3972 Py_ssize_t count;
3973} FmData;
3974
3975static int
3976fm_nomemory(void)
3977{
3978 FmData.count++;
3979 if (FmData.count > FmData.start &&
3980 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3981 return 1;
3982 }
3983 return 0;
3984}
3985
3986static void *
3987hook_fmalloc(void *ctx, size_t size)
3988{
3989 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3990 if (fm_nomemory()) {
3991 return NULL;
3992 }
3993 return alloc->malloc(alloc->ctx, size);
3994}
3995
3996static void *
3997hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3998{
3999 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4000 if (fm_nomemory()) {
4001 return NULL;
4002 }
4003 return alloc->calloc(alloc->ctx, nelem, elsize);
4004}
4005
4006static void *
4007hook_frealloc(void *ctx, void *ptr, size_t new_size)
4008{
4009 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4010 if (fm_nomemory()) {
4011 return NULL;
4012 }
4013 return alloc->realloc(alloc->ctx, ptr, new_size);
4014}
4015
4016static void
4017hook_ffree(void *ctx, void *ptr)
4018{
4019 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4020 alloc->free(alloc->ctx, ptr);
4021}
4022
4023static void
4024fm_setup_hooks(void)
4025{
4026 PyMemAllocatorEx alloc;
4027
4028 if (FmHook.installed) {
4029 return;
4030 }
4031 FmHook.installed = 1;
4032
4033 alloc.malloc = hook_fmalloc;
4034 alloc.calloc = hook_fcalloc;
4035 alloc.realloc = hook_frealloc;
4036 alloc.free = hook_ffree;
4037 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4038 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4039 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4040
4041 alloc.ctx = &FmHook.raw;
4042 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4043
4044 alloc.ctx = &FmHook.mem;
4045 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4046
4047 alloc.ctx = &FmHook.obj;
4048 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4049}
4050
4051static void
4052fm_remove_hooks(void)
4053{
4054 if (FmHook.installed) {
4055 FmHook.installed = 0;
4056 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4057 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4058 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4059 }
4060}
4061
4062static PyObject*
4063set_nomemory(PyObject *self, PyObject *args)
4064{
4065 /* Memory allocation fails after 'start' allocation requests, and until
4066 * 'stop' allocation requests except when 'stop' is negative or equal
4067 * to 0 (default) in which case allocation failures never stop. */
4068 FmData.count = 0;
4069 FmData.stop = 0;
4070 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4071 return NULL;
4072 }
4073 fm_setup_hooks();
4074 Py_RETURN_NONE;
4075}
4076
4077static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304078remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004079{
4080 fm_remove_hooks();
4081 Py_RETURN_NONE;
4082}
4083
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004084PyDoc_STRVAR(docstring_empty,
4085""
4086);
4087
4088PyDoc_STRVAR(docstring_no_signature,
4089"This docstring has no signature."
4090);
4091
4092PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004093"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004094"\n"
4095"This docstring has an invalid signature."
4096);
4097
Larry Hastings2623c8c2014-02-08 22:15:29 -08004098PyDoc_STRVAR(docstring_with_invalid_signature2,
4099"docstring_with_invalid_signature2($module, /, boo)\n"
4100"\n"
4101"--\n"
4102"\n"
4103"This docstring also has an invalid signature."
4104);
4105
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004106PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004107"docstring_with_signature($module, /, sig)\n"
4108"--\n"
4109"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004110"This docstring has a valid signature."
4111);
4112
Zachary Ware8ef887c2015-04-13 18:22:35 -05004113PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4114"docstring_with_signature_but_no_doc($module, /, sig)\n"
4115"--\n"
4116"\n"
4117);
4118
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004119PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004120"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4121"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004122"\n"
4123"\n"
4124"This docstring has a valid signature and some extra newlines."
4125);
4126
Larry Hastings16c51912014-01-07 11:53:01 -08004127PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004128"docstring_with_signature_with_defaults(module, s='avocado',\n"
4129" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4130" local=the_number_three, sys=sys.maxsize,\n"
4131" exp=sys.maxsize - 1)\n"
4132"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004133"\n"
4134"\n"
4135"\n"
4136"This docstring has a valid signature with parameters,\n"
4137"and the parameters take defaults of varying types."
4138);
4139
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004140typedef struct {
4141 PyThread_type_lock start_event;
4142 PyThread_type_lock exit_event;
4143 PyObject *callback;
4144} test_c_thread_t;
4145
4146static void
4147temporary_c_thread(void *data)
4148{
4149 test_c_thread_t *test_c_thread = data;
4150 PyGILState_STATE state;
4151 PyObject *res;
4152
4153 PyThread_release_lock(test_c_thread->start_event);
4154
4155 /* Allocate a Python thread state for this thread */
4156 state = PyGILState_Ensure();
4157
Victor Stinner3466bde2016-09-05 18:16:01 -07004158 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004159 Py_CLEAR(test_c_thread->callback);
4160
4161 if (res == NULL) {
4162 PyErr_Print();
4163 }
4164 else {
4165 Py_DECREF(res);
4166 }
4167
4168 /* Destroy the Python thread state for this thread */
4169 PyGILState_Release(state);
4170
4171 PyThread_release_lock(test_c_thread->exit_event);
4172
4173 PyThread_exit_thread();
4174}
4175
4176static PyObject *
4177call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4178{
4179 PyObject *res = NULL;
4180 test_c_thread_t test_c_thread;
4181 long thread;
4182
4183 PyEval_InitThreads();
4184
4185 test_c_thread.start_event = PyThread_allocate_lock();
4186 test_c_thread.exit_event = PyThread_allocate_lock();
4187 test_c_thread.callback = NULL;
4188 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4189 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4190 goto exit;
4191 }
4192
4193 Py_INCREF(callback);
4194 test_c_thread.callback = callback;
4195
4196 PyThread_acquire_lock(test_c_thread.start_event, 1);
4197 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4198
4199 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4200 if (thread == -1) {
4201 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4202 PyThread_release_lock(test_c_thread.start_event);
4203 PyThread_release_lock(test_c_thread.exit_event);
4204 goto exit;
4205 }
4206
4207 PyThread_acquire_lock(test_c_thread.start_event, 1);
4208 PyThread_release_lock(test_c_thread.start_event);
4209
4210 Py_BEGIN_ALLOW_THREADS
4211 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4212 PyThread_release_lock(test_c_thread.exit_event);
4213 Py_END_ALLOW_THREADS
4214
4215 Py_INCREF(Py_None);
4216 res = Py_None;
4217
4218exit:
4219 Py_CLEAR(test_c_thread.callback);
4220 if (test_c_thread.start_event)
4221 PyThread_free_lock(test_c_thread.start_event);
4222 if (test_c_thread.exit_event)
4223 PyThread_free_lock(test_c_thread.exit_event);
4224 return res;
4225}
Victor Stinner13105102013-12-13 02:17:29 +01004226
Serhiy Storchakab5181342015-02-06 08:58:56 +02004227/* marshal */
4228
4229static PyObject*
4230pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4231{
4232 long value;
4233 char *filename;
4234 int version;
4235 FILE *fp;
4236
4237 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4238 &value, &filename, &version))
4239 return NULL;
4240
4241 fp = fopen(filename, "wb");
4242 if (fp == NULL) {
4243 PyErr_SetFromErrno(PyExc_OSError);
4244 return NULL;
4245 }
4246
4247 PyMarshal_WriteLongToFile(value, fp, version);
4248
4249 fclose(fp);
4250 if (PyErr_Occurred())
4251 return NULL;
4252 Py_RETURN_NONE;
4253}
4254
4255static PyObject*
4256pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4257{
4258 PyObject *obj;
4259 char *filename;
4260 int version;
4261 FILE *fp;
4262
4263 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4264 &obj, &filename, &version))
4265 return NULL;
4266
4267 fp = fopen(filename, "wb");
4268 if (fp == NULL) {
4269 PyErr_SetFromErrno(PyExc_OSError);
4270 return NULL;
4271 }
4272
4273 PyMarshal_WriteObjectToFile(obj, fp, version);
4274
4275 fclose(fp);
4276 if (PyErr_Occurred())
4277 return NULL;
4278 Py_RETURN_NONE;
4279}
4280
4281static PyObject*
4282pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4283{
4284 int value;
4285 long pos;
4286 char *filename;
4287 FILE *fp;
4288
4289 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4290 return NULL;
4291
4292 fp = fopen(filename, "rb");
4293 if (fp == NULL) {
4294 PyErr_SetFromErrno(PyExc_OSError);
4295 return NULL;
4296 }
4297
4298 value = PyMarshal_ReadShortFromFile(fp);
4299 pos = ftell(fp);
4300
4301 fclose(fp);
4302 if (PyErr_Occurred())
4303 return NULL;
4304 return Py_BuildValue("il", value, pos);
4305}
4306
4307static PyObject*
4308pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4309{
4310 long value, pos;
4311 char *filename;
4312 FILE *fp;
4313
4314 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4315 return NULL;
4316
4317 fp = fopen(filename, "rb");
4318 if (fp == NULL) {
4319 PyErr_SetFromErrno(PyExc_OSError);
4320 return NULL;
4321 }
4322
4323 value = PyMarshal_ReadLongFromFile(fp);
4324 pos = ftell(fp);
4325
4326 fclose(fp);
4327 if (PyErr_Occurred())
4328 return NULL;
4329 return Py_BuildValue("ll", value, pos);
4330}
4331
4332static PyObject*
4333pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4334{
4335 PyObject *obj;
4336 long pos;
4337 char *filename;
4338 FILE *fp;
4339
4340 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4341 return NULL;
4342
4343 fp = fopen(filename, "rb");
4344 if (fp == NULL) {
4345 PyErr_SetFromErrno(PyExc_OSError);
4346 return NULL;
4347 }
4348
4349 obj = PyMarshal_ReadLastObjectFromFile(fp);
4350 pos = ftell(fp);
4351
4352 fclose(fp);
4353 return Py_BuildValue("Nl", obj, pos);
4354}
4355
4356static PyObject*
4357pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4358{
4359 PyObject *obj;
4360 long pos;
4361 char *filename;
4362 FILE *fp;
4363
4364 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4365 return NULL;
4366
4367 fp = fopen(filename, "rb");
4368 if (fp == NULL) {
4369 PyErr_SetFromErrno(PyExc_OSError);
4370 return NULL;
4371 }
4372
4373 obj = PyMarshal_ReadObjectFromFile(fp);
4374 pos = ftell(fp);
4375
4376 fclose(fp);
4377 return Py_BuildValue("Nl", obj, pos);
4378}
4379
Victor Stinnerefde1462015-03-21 15:04:43 +01004380static PyObject*
4381return_null_without_error(PyObject *self, PyObject *args)
4382{
4383 /* invalid call: return NULL without setting an error,
4384 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4385 PyErr_Clear();
4386 return NULL;
4387}
4388
4389static PyObject*
4390return_result_with_error(PyObject *self, PyObject *args)
4391{
4392 /* invalid call: return a result with an error set,
4393 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4394 PyErr_SetNone(PyExc_ValueError);
4395 Py_RETURN_NONE;
4396}
4397
Victor Stinner992c43f2015-03-27 17:12:45 +01004398static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004399test_pytime_fromseconds(PyObject *self, PyObject *args)
4400{
4401 int seconds;
4402 _PyTime_t ts;
4403
4404 if (!PyArg_ParseTuple(args, "i", &seconds))
4405 return NULL;
4406 ts = _PyTime_FromSeconds(seconds);
4407 return _PyTime_AsNanosecondsObject(ts);
4408}
4409
4410static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004411test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4412{
4413 PyObject *obj;
4414 int round;
4415 _PyTime_t ts;
4416
4417 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4418 return NULL;
4419 if (check_time_rounding(round) < 0)
4420 return NULL;
4421 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4422 return NULL;
4423 return _PyTime_AsNanosecondsObject(ts);
4424}
4425
Victor Stinner4bfb4602015-03-27 22:27:24 +01004426static PyObject *
4427test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4428{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004429 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004430 _PyTime_t ts;
4431 double d;
4432
Victor Stinnerc29b5852017-11-02 07:28:27 -07004433 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004434 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004435 }
4436 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4437 return NULL;
4438 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004439 d = _PyTime_AsSecondsDouble(ts);
4440 return PyFloat_FromDouble(d);
4441}
4442
Victor Stinner95e9cef2015-03-28 01:26:47 +01004443static PyObject *
4444test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4445{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004446 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004447 int round;
4448 _PyTime_t t;
4449 struct timeval tv;
4450 PyObject *seconds;
4451
Victor Stinnerc29b5852017-11-02 07:28:27 -07004452 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004453 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004454 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004455 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004456 }
4457 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004458 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004459 }
4460 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4461 return NULL;
4462 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004463
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004464 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004465 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004466 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004467 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004468 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4469}
4470
Victor Stinner34dc0f42015-03-27 18:19:03 +01004471#ifdef HAVE_CLOCK_GETTIME
4472static PyObject *
4473test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4474{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004475 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004476 _PyTime_t t;
4477 struct timespec ts;
4478
Victor Stinnerc29b5852017-11-02 07:28:27 -07004479 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004480 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004481 }
4482 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004483 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004484 }
4485 if (_PyTime_AsTimespec(t, &ts) == -1) {
4486 return NULL;
4487 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004488 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4489}
4490#endif
4491
Victor Stinner62d1c702015-04-01 17:47:07 +02004492static PyObject *
4493test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4494{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004495 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004496 int round;
4497 _PyTime_t t, ms;
4498
Victor Stinnerc29b5852017-11-02 07:28:27 -07004499 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004500 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004501 }
4502 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004503 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004504 }
4505 if (check_time_rounding(round) < 0) {
4506 return NULL;
4507 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004508 ms = _PyTime_AsMilliseconds(t, round);
4509 /* This conversion rely on the fact that _PyTime_t is a number of
4510 nanoseconds */
4511 return _PyTime_AsNanosecondsObject(ms);
4512}
4513
4514static PyObject *
4515test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4516{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004517 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004518 int round;
4519 _PyTime_t t, ms;
4520
Victor Stinnerc29b5852017-11-02 07:28:27 -07004521 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004522 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004523 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004524 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004525 }
4526 if (check_time_rounding(round) < 0) {
4527 return NULL;
4528 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004529 ms = _PyTime_AsMicroseconds(t, round);
4530 /* This conversion rely on the fact that _PyTime_t is a number of
4531 nanoseconds */
4532 return _PyTime_AsNanosecondsObject(ms);
4533}
4534
Victor Stinner50856d52015-10-13 00:11:21 +02004535static PyObject*
4536get_recursion_depth(PyObject *self, PyObject *args)
4537{
Victor Stinner50b48572018-11-01 01:51:40 +01004538 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004539
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004540 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004541 return PyLong_FromLong(tstate->recursion_depth - 1);
4542}
4543
Victor Stinner34be8072016-03-14 12:04:26 +01004544static PyObject*
4545pymem_buffer_overflow(PyObject *self, PyObject *args)
4546{
4547 char *buffer;
4548
4549 /* Deliberate buffer overflow to check that PyMem_Free() detects
4550 the overflow when debug hooks are installed. */
4551 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004552 if (buffer == NULL) {
4553 PyErr_NoMemory();
4554 return NULL;
4555 }
Victor Stinner34be8072016-03-14 12:04:26 +01004556 buffer[16] = 'x';
4557 PyMem_Free(buffer);
4558
4559 Py_RETURN_NONE;
4560}
4561
4562static PyObject*
4563pymem_api_misuse(PyObject *self, PyObject *args)
4564{
4565 char *buffer;
4566
4567 /* Deliberate misusage of Python allocators:
4568 allococate with PyMem but release with PyMem_Raw. */
4569 buffer = PyMem_Malloc(16);
4570 PyMem_RawFree(buffer);
4571
4572 Py_RETURN_NONE;
4573}
4574
Victor Stinnerc4aec362016-03-14 22:26:53 +01004575static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004576pymem_malloc_without_gil(PyObject *self, PyObject *args)
4577{
4578 char *buffer;
4579
4580 /* Deliberate bug to test debug hooks on Python memory allocators:
4581 call PyMem_Malloc() without holding the GIL */
4582 Py_BEGIN_ALLOW_THREADS
4583 buffer = PyMem_Malloc(10);
4584 Py_END_ALLOW_THREADS
4585
4586 PyMem_Free(buffer);
4587
4588 Py_RETURN_NONE;
4589}
4590
Victor Stinner5d39e042017-11-29 17:20:38 +01004591
4592static PyObject*
4593test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4594{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004595 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004596 if (name == NULL) {
4597 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4598 return NULL;
4599 }
4600 return PyUnicode_FromString(name);
4601}
4602
4603
Victor Stinnerad524372016-03-16 12:12:53 +01004604static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004605test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004606{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004607 if (!_PyObject_IsFreed(op)) {
4608 return raiseTestError(test_name, "object is not seen as freed");
4609 }
4610 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004611}
4612
4613
4614static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004615check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004616{
4617 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4618 if (op == NULL) {
4619 return NULL;
4620 }
4621 /* Initialize reference count to avoid early crash in ceval or GC */
4622 Py_REFCNT(op) = 1;
4623 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004624 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004625}
4626
4627
4628static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004629check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004630{
4631 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4632 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4633 if (op == NULL) {
4634 return NULL;
4635 }
4636 /* Initialize reference count to avoid early crash in ceval or GC */
4637 Py_REFCNT(op) = 1;
4638 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004639 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004640 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004641}
4642
4643
4644static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004645check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004646{
4647 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4648 if (op == NULL) {
4649 return NULL;
4650 }
4651 Py_TYPE(op)->tp_dealloc(op);
4652 /* Reset reference count to avoid early crash in ceval or GC */
4653 Py_REFCNT(op) = 1;
4654 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004655 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004656}
4657
4658
4659static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004660pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4661{
4662 char *buffer;
4663
Victor Stinnerad524372016-03-16 12:12:53 +01004664 /* Deliberate bug to test debug hooks on Python memory allocators:
4665 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004666 Py_BEGIN_ALLOW_THREADS
4667 buffer = PyObject_Malloc(10);
4668 Py_END_ALLOW_THREADS
4669
4670 PyObject_Free(buffer);
4671
4672 Py_RETURN_NONE;
4673}
4674
Victor Stinner10b73e12016-03-22 13:39:05 +01004675static PyObject *
4676tracemalloc_track(PyObject *self, PyObject *args)
4677{
4678 unsigned int domain;
4679 PyObject *ptr_obj;
4680 void *ptr;
4681 Py_ssize_t size;
4682 int release_gil = 0;
4683 int res;
4684
4685 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4686 return NULL;
4687 ptr = PyLong_AsVoidPtr(ptr_obj);
4688 if (PyErr_Occurred())
4689 return NULL;
4690
4691 if (release_gil) {
4692 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004693 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004694 Py_END_ALLOW_THREADS
4695 }
4696 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004697 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004698 }
4699
4700 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004701 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004702 return NULL;
4703 }
4704
4705 Py_RETURN_NONE;
4706}
4707
4708static PyObject *
4709tracemalloc_untrack(PyObject *self, PyObject *args)
4710{
4711 unsigned int domain;
4712 PyObject *ptr_obj;
4713 void *ptr;
4714 int res;
4715
4716 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4717 return NULL;
4718 ptr = PyLong_AsVoidPtr(ptr_obj);
4719 if (PyErr_Occurred())
4720 return NULL;
4721
Victor Stinner5ea4c062017-06-20 17:46:36 +02004722 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004723 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004724 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004725 return NULL;
4726 }
4727
4728 Py_RETURN_NONE;
4729}
4730
4731static PyObject *
4732tracemalloc_get_traceback(PyObject *self, PyObject *args)
4733{
4734 unsigned int domain;
4735 PyObject *ptr_obj;
4736 void *ptr;
4737
4738 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4739 return NULL;
4740 ptr = PyLong_AsVoidPtr(ptr_obj);
4741 if (PyErr_Occurred())
4742 return NULL;
4743
Benjamin Petersonca470632016-09-06 13:47:26 -07004744 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004745}
4746
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004747static PyObject *
4748dict_get_version(PyObject *self, PyObject *args)
4749{
4750 PyDictObject *dict;
4751 uint64_t version;
4752
4753 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4754 return NULL;
4755
4756 version = dict->ma_version_tag;
4757
4758 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4759 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4760}
4761
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004762
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004763static PyObject *
4764raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4765{
4766 PyGenObject *gen;
4767
4768 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4769 return NULL;
4770
4771 /* This is used in a test to check what happens if a signal arrives just
4772 as we're in the process of entering a yield from chain (see
4773 bpo-30039).
4774
4775 Needs to be done in C, because:
4776 - we don't have a Python wrapper for raise()
4777 - we need to make sure that the Python-level signal handler doesn't run
4778 *before* we enter the generator frame, which is impossible in Python
4779 because we check for signals before every bytecode operation.
4780 */
4781 raise(SIGINT);
4782 return _PyGen_Send(gen, Py_None);
4783}
4784
4785
Victor Stinner3b5cf852017-06-09 16:48:45 +02004786static int
4787fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4788{
4789 if (args == Py_None) {
4790 *stack = NULL;
4791 *nargs = 0;
4792 }
4793 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004794 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004795 *nargs = PyTuple_GET_SIZE(args);
4796 }
4797 else {
4798 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4799 return -1;
4800 }
4801 return 0;
4802}
4803
4804
4805static PyObject *
4806test_pyobject_fastcall(PyObject *self, PyObject *args)
4807{
4808 PyObject *func, *func_args;
4809 PyObject **stack;
4810 Py_ssize_t nargs;
4811
4812 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4813 return NULL;
4814 }
4815
4816 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4817 return NULL;
4818 }
4819 return _PyObject_FastCall(func, stack, nargs);
4820}
4821
4822
4823static PyObject *
4824test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4825{
4826 PyObject *func, *func_args, *kwargs;
4827 PyObject **stack;
4828 Py_ssize_t nargs;
4829
4830 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4831 return NULL;
4832 }
4833
4834 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4835 return NULL;
4836 }
4837
4838 if (kwargs == Py_None) {
4839 kwargs = NULL;
4840 }
4841 else if (!PyDict_Check(kwargs)) {
4842 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4843 return NULL;
4844 }
4845
4846 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4847}
4848
4849
4850static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004851test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004852{
4853 PyObject *func, *func_args, *kwnames = NULL;
4854 PyObject **stack;
4855 Py_ssize_t nargs, nkw;
4856
4857 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4858 return NULL;
4859 }
4860
4861 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4862 return NULL;
4863 }
4864
4865 if (kwnames == Py_None) {
4866 kwnames = NULL;
4867 }
4868 else if (PyTuple_Check(kwnames)) {
4869 nkw = PyTuple_GET_SIZE(kwnames);
4870 if (nargs < nkw) {
4871 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4872 return NULL;
4873 }
4874 nargs -= nkw;
4875 }
4876 else {
4877 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4878 return NULL;
4879 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004880 return _PyObject_Vectorcall(func, stack, nargs, kwnames);
4881}
4882
4883
4884static PyObject *
4885test_pyvectorcall_call(PyObject *self, PyObject *args)
4886{
4887 PyObject *func;
4888 PyObject *argstuple;
4889 PyObject *kwargs = NULL;
4890
4891 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4892 return NULL;
4893 }
4894
4895 if (!PyTuple_Check(argstuple)) {
4896 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4897 return NULL;
4898 }
4899 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4900 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4901 return NULL;
4902 }
4903
4904 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004905}
4906
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004907
Victor Stinner64fa4492017-07-10 14:37:49 +02004908static PyObject*
4909stack_pointer(PyObject *self, PyObject *args)
4910{
4911 int v = 5;
4912 return PyLong_FromVoidPtr(&v);
4913}
4914
Victor Stinner3b5cf852017-06-09 16:48:45 +02004915
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004916#ifdef W_STOPCODE
4917static PyObject*
4918py_w_stopcode(PyObject *self, PyObject *args)
4919{
4920 int sig, status;
4921 if (!PyArg_ParseTuple(args, "i", &sig)) {
4922 return NULL;
4923 }
4924 status = W_STOPCODE(sig);
4925 return PyLong_FromLong(status);
4926}
4927#endif
4928
4929
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004930static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004931get_mapping_keys(PyObject* self, PyObject *obj)
4932{
4933 return PyMapping_Keys(obj);
4934}
4935
4936static PyObject *
4937get_mapping_values(PyObject* self, PyObject *obj)
4938{
4939 return PyMapping_Values(obj);
4940}
4941
4942static PyObject *
4943get_mapping_items(PyObject* self, PyObject *obj)
4944{
4945 return PyMapping_Items(obj);
4946}
4947
4948
4949static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004950test_pythread_tss_key_state(PyObject *self, PyObject *args)
4951{
4952 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4953 if (PyThread_tss_is_created(&tss_key)) {
4954 return raiseTestError("test_pythread_tss_key_state",
4955 "TSS key not in an uninitialized state at "
4956 "creation time");
4957 }
4958 if (PyThread_tss_create(&tss_key) != 0) {
4959 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4960 return NULL;
4961 }
4962 if (!PyThread_tss_is_created(&tss_key)) {
4963 return raiseTestError("test_pythread_tss_key_state",
4964 "PyThread_tss_create succeeded, "
4965 "but with TSS key in an uninitialized state");
4966 }
4967 if (PyThread_tss_create(&tss_key) != 0) {
4968 return raiseTestError("test_pythread_tss_key_state",
4969 "PyThread_tss_create unsuccessful with "
4970 "an already initialized key");
4971 }
4972#define CHECK_TSS_API(expr) \
4973 (void)(expr); \
4974 if (!PyThread_tss_is_created(&tss_key)) { \
4975 return raiseTestError("test_pythread_tss_key_state", \
4976 "TSS key initialization state was not " \
4977 "preserved after calling " #expr); }
4978 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4979 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4980#undef CHECK_TSS_API
4981 PyThread_tss_delete(&tss_key);
4982 if (PyThread_tss_is_created(&tss_key)) {
4983 return raiseTestError("test_pythread_tss_key_state",
4984 "PyThread_tss_delete called, but did not "
4985 "set the key state to uninitialized");
4986 }
4987
4988 Py_tss_t *ptr_key = PyThread_tss_alloc();
4989 if (ptr_key == NULL) {
4990 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4991 return NULL;
4992 }
4993 if (PyThread_tss_is_created(ptr_key)) {
4994 return raiseTestError("test_pythread_tss_key_state",
4995 "TSS key not in an uninitialized state at "
4996 "allocation time");
4997 }
4998 PyThread_tss_free(ptr_key);
4999 ptr_key = NULL;
5000 Py_RETURN_NONE;
5001}
5002
5003
Yury Selivanovf23746a2018-01-22 19:11:18 -05005004static PyObject*
5005new_hamt(PyObject *self, PyObject *args)
5006{
5007 return _PyContext_NewHamtForTests();
5008}
5009
5010
jdemeyer5a306202018-10-19 23:50:06 +02005011/* def bad_get(self, obj, cls):
5012 cls()
5013 return repr(self)
5014*/
5015static PyObject*
5016bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5017{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005018 PyObject *self, *obj, *cls;
5019 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005020 return NULL;
5021 }
5022
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005023 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005024 if (res == NULL) {
5025 return NULL;
5026 }
5027 Py_DECREF(res);
5028
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005029 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005030}
5031
5032
Victor Stinner3d4226a2018-08-29 22:21:32 +02005033static PyObject *
5034encode_locale_ex(PyObject *self, PyObject *args)
5035{
5036 PyObject *unicode;
5037 int current_locale = 0;
5038 wchar_t *wstr;
5039 PyObject *res = NULL;
5040 const char *errors = NULL;
5041
5042 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5043 return NULL;
5044 }
5045 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5046 if (wstr == NULL) {
5047 return NULL;
5048 }
5049 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5050
5051 char *str = NULL;
5052 size_t error_pos;
5053 const char *reason = NULL;
5054 int ret = _Py_EncodeLocaleEx(wstr,
5055 &str, &error_pos, &reason,
5056 current_locale, error_handler);
5057 PyMem_Free(wstr);
5058
5059 switch(ret) {
5060 case 0:
5061 res = PyBytes_FromString(str);
5062 PyMem_RawFree(str);
5063 break;
5064 case -1:
5065 PyErr_NoMemory();
5066 break;
5067 case -2:
5068 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5069 error_pos, reason);
5070 break;
5071 case -3:
5072 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5073 break;
5074 default:
5075 PyErr_SetString(PyExc_ValueError, "unknow error code");
5076 break;
5077 }
5078 return res;
5079}
5080
5081
5082static PyObject *
5083decode_locale_ex(PyObject *self, PyObject *args)
5084{
5085 char *str;
5086 int current_locale = 0;
5087 PyObject *res = NULL;
5088 const char *errors = NULL;
5089
5090 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5091 return NULL;
5092 }
5093 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5094
5095 wchar_t *wstr = NULL;
5096 size_t wlen = 0;
5097 const char *reason = NULL;
5098 int ret = _Py_DecodeLocaleEx(str,
5099 &wstr, &wlen, &reason,
5100 current_locale, error_handler);
5101
5102 switch(ret) {
5103 case 0:
5104 res = PyUnicode_FromWideChar(wstr, wlen);
5105 PyMem_RawFree(wstr);
5106 break;
5107 case -1:
5108 PyErr_NoMemory();
5109 break;
5110 case -2:
5111 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5112 wlen, reason);
5113 break;
5114 case -3:
5115 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5116 break;
5117 default:
5118 PyErr_SetString(PyExc_ValueError, "unknow error code");
5119 break;
5120 }
5121 return res;
5122}
5123
5124
Victor Stinner18618e652018-10-25 17:28:11 +02005125#ifdef Py_REF_DEBUG
5126static PyObject *
5127negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5128{
5129 PyObject *obj = PyUnicode_FromString("negative_refcount");
5130 if (obj == NULL) {
5131 return NULL;
5132 }
5133 assert(Py_REFCNT(obj) == 1);
5134
5135 Py_REFCNT(obj) = 0;
5136 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5137 Py_DECREF(obj);
5138
5139 Py_RETURN_NONE;
5140}
5141#endif
5142
5143
Victor Stinneref9d9b62019-05-22 11:28:22 +02005144static PyObject*
5145test_write_unraisable_exc(PyObject *self, PyObject *args)
5146{
Victor Stinner71c52e32019-05-27 08:57:14 +02005147 PyObject *exc, *err_msg, *obj;
5148 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005149 return NULL;
5150 }
5151
Victor Stinner71c52e32019-05-27 08:57:14 +02005152 const char *err_msg_utf8;
5153 if (err_msg != Py_None) {
5154 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5155 if (err_msg_utf8 == NULL) {
5156 return NULL;
5157 }
5158 }
5159 else {
5160 err_msg_utf8 = NULL;
5161 }
5162
Victor Stinneref9d9b62019-05-22 11:28:22 +02005163 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005164 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005165 Py_RETURN_NONE;
5166}
5167
5168
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005169static PyObject *
5170sequence_getitem(PyObject *self, PyObject *args)
5171{
5172 PyObject *seq;
5173 Py_ssize_t i;
5174 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5175 return NULL;
5176 }
5177 return PySequence_GetItem(seq, i);
5178}
5179
5180
Petr Viktorinf9583772019-09-10 12:21:09 +01005181/* Functions for testing C calling conventions (METH_*) are named meth_*,
5182 * e.g. "meth_varargs" for METH_VARARGS.
5183 *
5184 * They all return a tuple of their C-level arguments, with None instead
5185 * of NULL and Python tuples instead of C arrays.
5186 */
5187
5188
5189static PyObject*
5190_null_to_none(PyObject* obj)
5191{
5192 if (obj == NULL) {
5193 Py_RETURN_NONE;
5194 }
5195 Py_INCREF(obj);
5196 return obj;
5197}
5198
5199static PyObject*
5200meth_varargs(PyObject* self, PyObject* args)
5201{
5202 return Py_BuildValue("NO", _null_to_none(self), args);
5203}
5204
5205static PyObject*
5206meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5207{
5208 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5209}
5210
5211static PyObject*
5212meth_o(PyObject* self, PyObject* obj)
5213{
5214 return Py_BuildValue("NO", _null_to_none(self), obj);
5215}
5216
5217static PyObject*
5218meth_noargs(PyObject* self, PyObject* ignored)
5219{
5220 return _null_to_none(self);
5221}
5222
5223static PyObject*
5224_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5225{
5226 PyObject *tuple = PyTuple_New(nargs);
5227 if (tuple == NULL) {
5228 return NULL;
5229 }
5230 for (Py_ssize_t i=0; i < nargs; i++) {
5231 Py_INCREF(args[i]);
5232 PyTuple_SET_ITEM(tuple, i, args[i]);
5233 }
5234 return tuple;
5235}
5236
5237static PyObject*
5238meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5239{
5240 return Py_BuildValue(
5241 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5242 );
5243}
5244
5245static PyObject*
5246meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5247 Py_ssize_t nargs, PyObject* kwargs)
5248{
5249 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5250 if (pyargs == NULL) {
5251 return NULL;
5252 }
5253 PyObject *pykwargs = _PyObject_Vectorcall((PyObject*)&PyDict_Type,
5254 args + nargs, 0, kwargs);
5255 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5256}
5257
Tim Peters9ea17ac2001-02-02 05:57:15 +00005258static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305260 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005261 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305262 {"test_config", test_config, METH_NOARGS},
5263 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005264 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005265 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5266 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5267 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5268 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5269 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5270 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005271 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005272 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005273 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5274 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5275 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5276 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5277 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5278 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005279 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5280 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005281 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5282 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5283 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5284 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305285 {"test_list_api", test_list_api, METH_NOARGS},
5286 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005287 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005288 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305289 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5290 {"test_long_api", test_long_api, METH_NOARGS},
5291 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5292 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5293 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5294 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005295 {"test_structseq_newtype_doesnt_leak",
5296 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305297 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5298 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5299 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5300 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005301 {"test_long_as_unsigned_long_long_mask",
5302 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305303 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5304 {"test_k_code", test_k_code, METH_NOARGS},
5305 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005306 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305307 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305309 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305311 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5312 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5313 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005315 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005316#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005317 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005318#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005319 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005320 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005321 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005322 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005323 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005325 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005327 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005328 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005329 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005330 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005331 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 {"getargs_b", getargs_b, METH_VARARGS},
5333 {"getargs_B", getargs_B, METH_VARARGS},
5334 {"getargs_h", getargs_h, METH_VARARGS},
5335 {"getargs_H", getargs_H, METH_VARARGS},
5336 {"getargs_I", getargs_I, METH_VARARGS},
5337 {"getargs_k", getargs_k, METH_VARARGS},
5338 {"getargs_i", getargs_i, METH_VARARGS},
5339 {"getargs_l", getargs_l, METH_VARARGS},
5340 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005341 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 {"getargs_L", getargs_L, METH_VARARGS},
5343 {"getargs_K", getargs_K, METH_VARARGS},
5344 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305345 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5346 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005347 {"getargs_f", getargs_f, METH_VARARGS},
5348 {"getargs_d", getargs_d, METH_VARARGS},
5349 {"getargs_D", getargs_D, METH_VARARGS},
5350 {"getargs_S", getargs_S, METH_VARARGS},
5351 {"getargs_Y", getargs_Y, METH_VARARGS},
5352 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005353 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005354 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005355 {"getargs_s", getargs_s, METH_VARARGS},
5356 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5357 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5358 {"getargs_z", getargs_z, METH_VARARGS},
5359 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5360 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5361 {"getargs_y", getargs_y, METH_VARARGS},
5362 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5363 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5364 {"getargs_u", getargs_u, METH_VARARGS},
5365 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5366 {"getargs_Z", getargs_Z, METH_VARARGS},
5367 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005368 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005369 {"getargs_es", getargs_es, METH_VARARGS},
5370 {"getargs_et", getargs_et, METH_VARARGS},
5371 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5372 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005374 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005376 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305377 {"test_s_code", test_s_code, METH_NOARGS},
5378 {"test_u_code", test_u_code, METH_NOARGS},
5379 {"test_Z_code", test_Z_code, METH_NOARGS},
5380 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005381 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5382 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005383 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005384 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5385 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005386 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005387 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005388 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5389 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005390 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005391 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005393#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005394 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005395#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005396 {"traceback_print", traceback_print, METH_VARARGS},
5397 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005398 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005399 {"argparsing", argparsing, METH_VARARGS},
5400 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005401 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305403 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005404 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305405 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005406 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005407 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5408 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005409 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005410 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005411 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305412 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5413 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5414 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5415 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005416 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5417 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305418 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005419 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005420 {"no_docstring",
5421 (PyCFunction)test_with_docstring, METH_NOARGS},
5422 {"docstring_empty",
5423 (PyCFunction)test_with_docstring, METH_NOARGS,
5424 docstring_empty},
5425 {"docstring_no_signature",
5426 (PyCFunction)test_with_docstring, METH_NOARGS,
5427 docstring_no_signature},
5428 {"docstring_with_invalid_signature",
5429 (PyCFunction)test_with_docstring, METH_NOARGS,
5430 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005431 {"docstring_with_invalid_signature2",
5432 (PyCFunction)test_with_docstring, METH_NOARGS,
5433 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005434 {"docstring_with_signature",
5435 (PyCFunction)test_with_docstring, METH_NOARGS,
5436 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005437 {"docstring_with_signature_but_no_doc",
5438 (PyCFunction)test_with_docstring, METH_NOARGS,
5439 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005440 {"docstring_with_signature_and_extra_newlines",
5441 (PyCFunction)test_with_docstring, METH_NOARGS,
5442 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005443 {"docstring_with_signature_with_defaults",
5444 (PyCFunction)test_with_docstring, METH_NOARGS,
5445 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005446 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5447 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005448 {"pymarshal_write_long_to_file",
5449 pymarshal_write_long_to_file, METH_VARARGS},
5450 {"pymarshal_write_object_to_file",
5451 pymarshal_write_object_to_file, METH_VARARGS},
5452 {"pymarshal_read_short_from_file",
5453 pymarshal_read_short_from_file, METH_VARARGS},
5454 {"pymarshal_read_long_from_file",
5455 pymarshal_read_long_from_file, METH_VARARGS},
5456 {"pymarshal_read_last_object_from_file",
5457 pymarshal_read_last_object_from_file, METH_VARARGS},
5458 {"pymarshal_read_object_from_file",
5459 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005460 {"return_null_without_error",
5461 return_null_without_error, METH_NOARGS},
5462 {"return_result_with_error",
5463 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005464 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005465 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5466 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005467 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005468#ifdef HAVE_CLOCK_GETTIME
5469 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5470#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005471 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5472 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02005473 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01005474 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5475 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005476 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005477 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005478 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5479 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5480 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005481 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005482 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5483 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5484 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005485 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005486 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005487 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5488 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005489 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5490 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005491 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005492#ifdef W_STOPCODE
5493 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5494#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005495 {"get_mapping_keys", get_mapping_keys, METH_O},
5496 {"get_mapping_values", get_mapping_values, METH_O},
5497 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005498 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005499 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005500 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005501 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5502 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005503#ifdef Py_REF_DEBUG
5504 {"negative_refcount", negative_refcount, METH_NOARGS},
5505#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005506 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005507 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005508 {"meth_varargs", meth_varargs, METH_VARARGS},
5509 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5510 {"meth_o", meth_o, METH_O},
5511 {"meth_noargs", meth_noargs, METH_NOARGS},
5512 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5513 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005515};
5516
Thomas Hellera4ea6032003-04-17 18:55:45 +00005517#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5518
Thomas Wouters89f507f2006-12-13 04:49:30 +00005519typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 char bool_member;
5521 char byte_member;
5522 unsigned char ubyte_member;
5523 short short_member;
5524 unsigned short ushort_member;
5525 int int_member;
5526 unsigned int uint_member;
5527 long long_member;
5528 unsigned long ulong_member;
5529 Py_ssize_t pyssizet_member;
5530 float float_member;
5531 double double_member;
5532 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005533 long long longlong_member;
5534 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005535} all_structmembers;
5536
5537typedef struct {
5538 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005540} test_structmembers;
5541
5542static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5544 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5545 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5546 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5547 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5548 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5549 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5550 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5551 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5552 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5553 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5554 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5555 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5557 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005559};
5560
5561
Christian Heimes1af737c2008-01-23 08:24:23 +00005562static PyObject *
5563test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005565 static char *keywords[] = {
5566 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5567 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5568 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005571 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 test_structmembers *ob;
5573 const char *s = NULL;
5574 Py_ssize_t string_len = 0;
5575 ob = PyObject_New(test_structmembers, type);
5576 if (ob == NULL)
5577 return NULL;
5578 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5579 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5580 &ob->structmembers.bool_member,
5581 &ob->structmembers.byte_member,
5582 &ob->structmembers.ubyte_member,
5583 &ob->structmembers.short_member,
5584 &ob->structmembers.ushort_member,
5585 &ob->structmembers.int_member,
5586 &ob->structmembers.uint_member,
5587 &ob->structmembers.long_member,
5588 &ob->structmembers.ulong_member,
5589 &ob->structmembers.pyssizet_member,
5590 &ob->structmembers.float_member,
5591 &ob->structmembers.double_member,
5592 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 , &ob->structmembers.longlong_member,
5594 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 )) {
5596 Py_DECREF(ob);
5597 return NULL;
5598 }
5599 if (s != NULL) {
5600 if (string_len > 5) {
5601 Py_DECREF(ob);
5602 PyErr_SetString(PyExc_ValueError, "string too long");
5603 return NULL;
5604 }
5605 strcpy(ob->structmembers.inplace_member, s);
5606 }
5607 else {
5608 strcpy(ob->structmembers.inplace_member, "");
5609 }
5610 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005611}
5612
Christian Heimes1af737c2008-01-23 08:24:23 +00005613static void
5614test_structmembers_free(PyObject *ob)
5615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005617}
5618
5619static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005620 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 "test_structmembersType",
5622 sizeof(test_structmembers), /* tp_basicsize */
5623 0, /* tp_itemsize */
5624 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005625 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 0, /* tp_getattr */
5627 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005628 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 0, /* tp_repr */
5630 0, /* tp_as_number */
5631 0, /* tp_as_sequence */
5632 0, /* tp_as_mapping */
5633 0, /* tp_hash */
5634 0, /* tp_call */
5635 0, /* tp_str */
5636 PyObject_GenericGetAttr, /* tp_getattro */
5637 PyObject_GenericSetAttr, /* tp_setattro */
5638 0, /* tp_as_buffer */
5639 0, /* tp_flags */
5640 "Type containing all structmember types",
5641 0, /* traverseproc tp_traverse */
5642 0, /* tp_clear */
5643 0, /* tp_richcompare */
5644 0, /* tp_weaklistoffset */
5645 0, /* tp_iter */
5646 0, /* tp_iternext */
5647 0, /* tp_methods */
5648 test_members, /* tp_members */
5649 0,
5650 0,
5651 0,
5652 0,
5653 0,
5654 0,
5655 0,
5656 0,
5657 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005658};
5659
5660
Benjamin Petersond51374e2014-04-09 23:55:56 -04005661typedef struct {
5662 PyObject_HEAD
5663} matmulObject;
5664
5665static PyObject *
5666matmulType_matmul(PyObject *self, PyObject *other)
5667{
5668 return Py_BuildValue("(sOO)", "matmul", self, other);
5669}
5670
5671static PyObject *
5672matmulType_imatmul(PyObject *self, PyObject *other)
5673{
5674 return Py_BuildValue("(sOO)", "imatmul", self, other);
5675}
5676
5677static void
5678matmulType_dealloc(PyObject *self)
5679{
Zachary Ware420dc562014-04-23 13:51:27 -05005680 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005681}
5682
5683static PyNumberMethods matmulType_as_number = {
5684 0, /* nb_add */
5685 0, /* nb_subtract */
5686 0, /* nb_multiply */
5687 0, /* nb_remainde r*/
5688 0, /* nb_divmod */
5689 0, /* nb_power */
5690 0, /* nb_negative */
5691 0, /* tp_positive */
5692 0, /* tp_absolute */
5693 0, /* tp_bool */
5694 0, /* nb_invert */
5695 0, /* nb_lshift */
5696 0, /* nb_rshift */
5697 0, /* nb_and */
5698 0, /* nb_xor */
5699 0, /* nb_or */
5700 0, /* nb_int */
5701 0, /* nb_reserved */
5702 0, /* nb_float */
5703 0, /* nb_inplace_add */
5704 0, /* nb_inplace_subtract */
5705 0, /* nb_inplace_multiply */
5706 0, /* nb_inplace_remainder */
5707 0, /* nb_inplace_power */
5708 0, /* nb_inplace_lshift */
5709 0, /* nb_inplace_rshift */
5710 0, /* nb_inplace_and */
5711 0, /* nb_inplace_xor */
5712 0, /* nb_inplace_or */
5713 0, /* nb_floor_divide */
5714 0, /* nb_true_divide */
5715 0, /* nb_inplace_floor_divide */
5716 0, /* nb_inplace_true_divide */
5717 0, /* nb_index */
5718 matmulType_matmul, /* nb_matrix_multiply */
5719 matmulType_imatmul /* nb_matrix_inplace_multiply */
5720};
5721
5722static PyTypeObject matmulType = {
5723 PyVarObject_HEAD_INIT(NULL, 0)
5724 "matmulType",
5725 sizeof(matmulObject), /* tp_basicsize */
5726 0, /* tp_itemsize */
5727 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005728 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005729 0, /* tp_getattr */
5730 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005731 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005732 0, /* tp_repr */
5733 &matmulType_as_number, /* tp_as_number */
5734 0, /* tp_as_sequence */
5735 0, /* tp_as_mapping */
5736 0, /* tp_hash */
5737 0, /* tp_call */
5738 0, /* tp_str */
5739 PyObject_GenericGetAttr, /* tp_getattro */
5740 PyObject_GenericSetAttr, /* tp_setattro */
5741 0, /* tp_as_buffer */
5742 0, /* tp_flags */
5743 "C level type with matrix operations defined",
5744 0, /* traverseproc tp_traverse */
5745 0, /* tp_clear */
5746 0, /* tp_richcompare */
5747 0, /* tp_weaklistoffset */
5748 0, /* tp_iter */
5749 0, /* tp_iternext */
5750 0, /* tp_methods */
5751 0, /* tp_members */
5752 0,
5753 0,
5754 0,
5755 0,
5756 0,
5757 0,
5758 0,
5759 0,
5760 PyType_GenericNew, /* tp_new */
5761 PyObject_Del, /* tp_free */
5762};
5763
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005764typedef struct {
5765 PyObject_HEAD
5766} ipowObject;
5767
5768static PyObject *
5769ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5770{
5771 return Py_BuildValue("OO", other, mod);
5772}
5773
5774static PyNumberMethods ipowType_as_number = {
5775 .nb_inplace_power = ipowType_ipow
5776};
5777
5778static PyTypeObject ipowType = {
5779 PyVarObject_HEAD_INIT(NULL, 0)
5780 .tp_name = "ipowType",
5781 .tp_basicsize = sizeof(ipowObject),
5782 .tp_as_number = &ipowType_as_number,
5783 .tp_new = PyType_GenericNew
5784};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005785
Yury Selivanov75445082015-05-11 22:57:16 -04005786typedef struct {
5787 PyObject_HEAD
5788 PyObject *ao_iterator;
5789} awaitObject;
5790
5791
5792static PyObject *
5793awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5794{
5795 PyObject *v;
5796 awaitObject *ao;
5797
5798 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5799 return NULL;
5800
5801 ao = (awaitObject *)type->tp_alloc(type, 0);
5802 if (ao == NULL) {
5803 return NULL;
5804 }
5805
5806 Py_INCREF(v);
5807 ao->ao_iterator = v;
5808
5809 return (PyObject *)ao;
5810}
5811
5812
5813static void
5814awaitObject_dealloc(awaitObject *ao)
5815{
5816 Py_CLEAR(ao->ao_iterator);
5817 Py_TYPE(ao)->tp_free(ao);
5818}
5819
5820
5821static PyObject *
5822awaitObject_await(awaitObject *ao)
5823{
5824 Py_INCREF(ao->ao_iterator);
5825 return ao->ao_iterator;
5826}
5827
5828static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005829 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005830 0, /* am_aiter */
5831 0 /* am_anext */
5832};
5833
5834
5835static PyTypeObject awaitType = {
5836 PyVarObject_HEAD_INIT(NULL, 0)
5837 "awaitType",
5838 sizeof(awaitObject), /* tp_basicsize */
5839 0, /* tp_itemsize */
5840 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005841 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005842 0, /* tp_getattr */
5843 0, /* tp_setattr */
5844 &awaitType_as_async, /* tp_as_async */
5845 0, /* tp_repr */
5846 0, /* tp_as_number */
5847 0, /* tp_as_sequence */
5848 0, /* tp_as_mapping */
5849 0, /* tp_hash */
5850 0, /* tp_call */
5851 0, /* tp_str */
5852 PyObject_GenericGetAttr, /* tp_getattro */
5853 PyObject_GenericSetAttr, /* tp_setattro */
5854 0, /* tp_as_buffer */
5855 0, /* tp_flags */
5856 "C level type with tp_as_async",
5857 0, /* traverseproc tp_traverse */
5858 0, /* tp_clear */
5859 0, /* tp_richcompare */
5860 0, /* tp_weaklistoffset */
5861 0, /* tp_iter */
5862 0, /* tp_iternext */
5863 0, /* tp_methods */
5864 0, /* tp_members */
5865 0,
5866 0,
5867 0,
5868 0,
5869 0,
5870 0,
5871 0,
5872 0,
5873 awaitObject_new, /* tp_new */
5874 PyObject_Del, /* tp_free */
5875};
5876
5877
xdegaye56d1f5c2017-10-26 15:09:06 +02005878static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5879
5880static PyTypeObject PyRecursingInfinitelyError_Type = {
5881 PyVarObject_HEAD_INIT(NULL, 0)
5882 "RecursingInfinitelyError", /* tp_name */
5883 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5884 0, /* tp_itemsize */
5885 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005886 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005887 0, /* tp_getattr */
5888 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005889 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005890 0, /* tp_repr */
5891 0, /* tp_as_number */
5892 0, /* tp_as_sequence */
5893 0, /* tp_as_mapping */
5894 0, /* tp_hash */
5895 0, /* tp_call */
5896 0, /* tp_str */
5897 0, /* tp_getattro */
5898 0, /* tp_setattro */
5899 0, /* tp_as_buffer */
5900 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5901 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5902 0, /* tp_traverse */
5903 0, /* tp_clear */
5904 0, /* tp_richcompare */
5905 0, /* tp_weaklistoffset */
5906 0, /* tp_iter */
5907 0, /* tp_iternext */
5908 0, /* tp_methods */
5909 0, /* tp_members */
5910 0, /* tp_getset */
5911 0, /* tp_base */
5912 0, /* tp_dict */
5913 0, /* tp_descr_get */
5914 0, /* tp_descr_set */
5915 0, /* tp_dictoffset */
5916 (initproc)recurse_infinitely_error_init, /* tp_init */
5917 0, /* tp_alloc */
5918 0, /* tp_new */
5919};
5920
5921static int
5922recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5923{
5924 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5925
5926 /* Instantiating this exception starts infinite recursion. */
5927 Py_INCREF(type);
5928 PyErr_SetObject(type, NULL);
5929 return -1;
5930}
5931
5932
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005933/* Test bpo-35983: create a subclass of "list" which checks that instances
5934 * are not deallocated twice */
5935
5936typedef struct {
5937 PyListObject list;
5938 int deallocated;
5939} MyListObject;
5940
5941static PyObject *
5942MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5943{
5944 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5945 ((MyListObject*)op)->deallocated = 0;
5946 return op;
5947}
5948
5949void
5950MyList_dealloc(MyListObject* op)
5951{
5952 if (op->deallocated) {
5953 /* We cannot raise exceptions here but we still want the testsuite
5954 * to fail when we hit this */
5955 Py_FatalError("MyList instance deallocated twice");
5956 }
5957 op->deallocated = 1;
5958 PyList_Type.tp_dealloc((PyObject *)op);
5959}
5960
5961static PyTypeObject MyList_Type = {
5962 PyVarObject_HEAD_INIT(NULL, 0)
5963 "MyList",
5964 sizeof(MyListObject),
5965 0,
5966 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005967 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005968 0, /* tp_getattr */
5969 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005970 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005971 0, /* tp_repr */
5972 0, /* tp_as_number */
5973 0, /* tp_as_sequence */
5974 0, /* tp_as_mapping */
5975 0, /* tp_hash */
5976 0, /* tp_call */
5977 0, /* tp_str */
5978 0, /* tp_getattro */
5979 0, /* tp_setattro */
5980 0, /* tp_as_buffer */
5981 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5982 0, /* tp_doc */
5983 0, /* tp_traverse */
5984 0, /* tp_clear */
5985 0, /* tp_richcompare */
5986 0, /* tp_weaklistoffset */
5987 0, /* tp_iter */
5988 0, /* tp_iternext */
5989 0, /* tp_methods */
5990 0, /* tp_members */
5991 0, /* tp_getset */
5992 0, /* &PyList_Type */ /* tp_base */
5993 0, /* tp_dict */
5994 0, /* tp_descr_get */
5995 0, /* tp_descr_set */
5996 0, /* tp_dictoffset */
5997 0, /* tp_init */
5998 0, /* tp_alloc */
5999 MyList_new, /* tp_new */
6000};
6001
6002
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006003/* Test PEP 560 */
6004
6005typedef struct {
6006 PyObject_HEAD
6007 PyObject *item;
6008} PyGenericAliasObject;
6009
6010static void
6011generic_alias_dealloc(PyGenericAliasObject *self)
6012{
6013 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006014 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006015}
6016
6017static PyObject *
6018generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6019{
6020 return PyTuple_Pack(1, self->item);
6021}
6022
6023static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006024 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006025 {NULL} /* sentinel */
6026};
6027
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006028static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006029 PyVarObject_HEAD_INIT(NULL, 0)
6030 "GenericAlias",
6031 sizeof(PyGenericAliasObject),
6032 0,
6033 .tp_dealloc = (destructor)generic_alias_dealloc,
6034 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6035 .tp_methods = generic_alias_methods,
6036};
6037
6038static PyObject *
6039generic_alias_new(PyObject *item)
6040{
6041 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6042 if (o == NULL) {
6043 return NULL;
6044 }
6045 Py_INCREF(item);
6046 o->item = item;
6047 return (PyObject*) o;
6048}
6049
6050typedef struct {
6051 PyObject_HEAD
6052} PyGenericObject;
6053
6054static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006055generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006056{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006057 return generic_alias_new(item);
6058}
6059
6060static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006061 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006062 {NULL} /* sentinel */
6063};
6064
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006065static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006066 PyVarObject_HEAD_INIT(NULL, 0)
6067 "Generic",
6068 sizeof(PyGenericObject),
6069 0,
6070 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6071 .tp_methods = generic_methods,
6072};
6073
6074
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006075/* Test PEP 590 */
6076
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006077typedef struct {
6078 PyObject_HEAD
6079 vectorcallfunc vectorcall;
6080} MethodDescriptorObject;
6081
6082static PyObject *
6083MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6084 size_t nargsf, PyObject *kwnames)
6085{
6086 /* True if using the vectorcall function in MethodDescriptorObject
6087 * but False for MethodDescriptor2Object */
6088 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6089 return PyBool_FromLong(md->vectorcall != NULL);
6090}
6091
6092static PyObject *
6093MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6094{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006095 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006096 op->vectorcall = MethodDescriptor_vectorcall;
6097 return (PyObject *)op;
6098}
6099
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006100static PyObject *
6101func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6102{
6103 if (obj == Py_None || obj == NULL) {
6104 Py_INCREF(func);
6105 return func;
6106 }
6107 return PyMethod_New(func, obj);
6108}
6109
6110static PyObject *
6111nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6112{
6113 Py_INCREF(func);
6114 return func;
6115}
6116
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006117static PyObject *
6118call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6119{
6120 Py_INCREF(args);
6121 return args;
6122}
6123
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006124static PyTypeObject MethodDescriptorBase_Type = {
6125 PyVarObject_HEAD_INIT(NULL, 0)
6126 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006127 sizeof(MethodDescriptorObject),
6128 .tp_new = MethodDescriptor_new,
6129 .tp_call = PyVectorcall_Call,
6130 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6131 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
6132 Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006133 .tp_descr_get = func_descr_get,
6134};
6135
6136static PyTypeObject MethodDescriptorDerived_Type = {
6137 PyVarObject_HEAD_INIT(NULL, 0)
6138 "MethodDescriptorDerived",
6139 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6140};
6141
6142static PyTypeObject MethodDescriptorNopGet_Type = {
6143 PyVarObject_HEAD_INIT(NULL, 0)
6144 "MethodDescriptorNopGet",
6145 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006146 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006147 .tp_descr_get = nop_descr_get,
6148};
6149
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006150typedef struct {
6151 MethodDescriptorObject base;
6152 vectorcallfunc vectorcall;
6153} MethodDescriptor2Object;
6154
6155static PyObject *
6156MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6157{
6158 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6159 op->base.vectorcall = NULL;
6160 op->vectorcall = MethodDescriptor_vectorcall;
6161 return (PyObject *)op;
6162}
6163
6164static PyTypeObject MethodDescriptor2_Type = {
6165 PyVarObject_HEAD_INIT(NULL, 0)
6166 "MethodDescriptor2",
6167 sizeof(MethodDescriptor2Object),
6168 .tp_new = MethodDescriptor2_new,
6169 .tp_call = PyVectorcall_Call,
6170 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
6171 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL,
6172};
6173
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006174PyDoc_STRVAR(heapgctype__doc__,
6175"A heap type with GC, and with overridden dealloc.\n\n"
6176"The 'value' attribute is set to 10 in __init__.");
6177
6178typedef struct {
6179 PyObject_HEAD
6180 int value;
6181} HeapCTypeObject;
6182
6183static struct PyMemberDef heapctype_members[] = {
6184 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6185 {NULL} /* Sentinel */
6186};
6187
6188static int
6189heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6190{
6191 ((HeapCTypeObject *)self)->value = 10;
6192 return 0;
6193}
6194
6195static void
6196heapgcctype_dealloc(HeapCTypeObject *self)
6197{
6198 PyTypeObject *tp = Py_TYPE(self);
6199 PyObject_GC_UnTrack(self);
6200 PyObject_GC_Del(self);
6201 Py_DECREF(tp);
6202}
6203
6204static PyType_Slot HeapGcCType_slots[] = {
6205 {Py_tp_init, heapctype_init},
6206 {Py_tp_members, heapctype_members},
6207 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006208 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006209 {0, 0},
6210};
6211
6212static PyType_Spec HeapGcCType_spec = {
6213 "_testcapi.HeapGcCType",
6214 sizeof(HeapCTypeObject),
6215 0,
6216 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6217 HeapGcCType_slots
6218};
6219
6220PyDoc_STRVAR(heapctype__doc__,
6221"A heap type without GC, but with overridden dealloc.\n\n"
6222"The 'value' attribute is set to 10 in __init__.");
6223
6224static void
6225heapctype_dealloc(HeapCTypeObject *self)
6226{
6227 PyTypeObject *tp = Py_TYPE(self);
6228 PyObject_Del(self);
6229 Py_DECREF(tp);
6230}
6231
6232static PyType_Slot HeapCType_slots[] = {
6233 {Py_tp_init, heapctype_init},
6234 {Py_tp_members, heapctype_members},
6235 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006236 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006237 {0, 0},
6238};
6239
6240static PyType_Spec HeapCType_spec = {
6241 "_testcapi.HeapCType",
6242 sizeof(HeapCTypeObject),
6243 0,
6244 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6245 HeapCType_slots
6246};
6247
6248PyDoc_STRVAR(heapctypesubclass__doc__,
6249"Subclass of HeapCType, without GC.\n\n"
6250"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6251
6252typedef struct {
6253 HeapCTypeObject base;
6254 int value2;
6255} HeapCTypeSubclassObject;
6256
6257static int
6258heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6259{
6260 /* Call __init__ of the superclass */
6261 if (heapctype_init(self, args, kwargs) < 0) {
6262 return -1;
6263 }
6264 /* Initialize additional element */
6265 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6266 return 0;
6267}
6268
6269static struct PyMemberDef heapctypesubclass_members[] = {
6270 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6271 {NULL} /* Sentinel */
6272};
6273
6274static PyType_Slot HeapCTypeSubclass_slots[] = {
6275 {Py_tp_init, heapctypesubclass_init},
6276 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006277 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006278 {0, 0},
6279};
6280
6281static PyType_Spec HeapCTypeSubclass_spec = {
6282 "_testcapi.HeapCTypeSubclass",
6283 sizeof(HeapCTypeSubclassObject),
6284 0,
6285 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6286 HeapCTypeSubclass_slots
6287};
6288
6289PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6290"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6291"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6292"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6293
6294static int
6295heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6296{
6297 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6298 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6299 base_init(self, args, kwargs);
6300 return 0;
6301}
6302
6303static void
6304heapctypesubclasswithfinalizer_finalize(PyObject *self)
6305{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006306 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006307 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006308
6309 /* Save the current exception, if any. */
6310 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6311
6312 m = PyState_FindModule(&_testcapimodule);
6313 if (m == NULL) {
6314 goto cleanup_finalize;
6315 }
6316 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6317 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6318 if (oldtype == NULL || newtype == NULL) {
6319 goto cleanup_finalize;
6320 }
6321
6322 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6323 goto cleanup_finalize;
6324 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006325 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6326 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006327 goto cleanup_finalize;
6328 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006329 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6330 goto cleanup_finalize;
6331 }
6332 Py_DECREF(refcnt);
6333 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6334 if (refcnt == NULL) {
6335 goto cleanup_finalize;
6336 }
6337 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006338 goto cleanup_finalize;
6339 }
6340
6341cleanup_finalize:
6342 Py_XDECREF(oldtype);
6343 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006344 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006345
6346 /* Restore the saved exception. */
6347 PyErr_Restore(error_type, error_value, error_traceback);
6348}
6349
6350static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6351 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6352 {Py_tp_members, heapctypesubclass_members},
6353 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006354 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006355 {0, 0},
6356};
6357
6358static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6359 "_testcapi.HeapCTypeSubclassWithFinalizer",
6360 sizeof(HeapCTypeSubclassObject),
6361 0,
6362 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6363 HeapCTypeSubclassWithFinalizer_slots
6364};
6365
Petr Viktorinf9583772019-09-10 12:21:09 +01006366static PyMethodDef meth_instance_methods[] = {
6367 {"meth_varargs", meth_varargs, METH_VARARGS},
6368 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6369 {"meth_o", meth_o, METH_O},
6370 {"meth_noargs", meth_noargs, METH_NOARGS},
6371 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6372 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6373 {NULL, NULL} /* sentinel */
6374};
6375
6376
6377static PyTypeObject MethInstance_Type = {
6378 PyVarObject_HEAD_INIT(NULL, 0)
6379 "MethInstance",
6380 sizeof(PyObject),
6381 .tp_new = PyType_GenericNew,
6382 .tp_flags = Py_TPFLAGS_DEFAULT,
6383 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006384 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006385 "Class with normal (instance) methods to test calling conventions"),
6386};
6387
6388static PyMethodDef meth_class_methods[] = {
6389 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6390 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6391 {"meth_o", meth_o, METH_O|METH_CLASS},
6392 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6393 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6394 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6395 {NULL, NULL} /* sentinel */
6396};
6397
6398
6399static PyTypeObject MethClass_Type = {
6400 PyVarObject_HEAD_INIT(NULL, 0)
6401 "MethClass",
6402 sizeof(PyObject),
6403 .tp_new = PyType_GenericNew,
6404 .tp_flags = Py_TPFLAGS_DEFAULT,
6405 .tp_methods = meth_class_methods,
6406 .tp_doc = PyDoc_STR(
6407 "Class with class methods to test calling conventions"),
6408};
6409
6410static PyMethodDef meth_static_methods[] = {
6411 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6412 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6413 {"meth_o", meth_o, METH_O|METH_STATIC},
6414 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6415 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6416 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6417 {NULL, NULL} /* sentinel */
6418};
6419
6420
6421static PyTypeObject MethStatic_Type = {
6422 PyVarObject_HEAD_INIT(NULL, 0)
6423 "MethStatic",
6424 sizeof(PyObject),
6425 .tp_new = PyType_GenericNew,
6426 .tp_flags = Py_TPFLAGS_DEFAULT,
6427 .tp_methods = meth_static_methods,
6428 .tp_doc = PyDoc_STR(
6429 "Class with static methods to test calling conventions"),
6430};
6431
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006432
Martin v. Löwis1a214512008-06-11 05:26:20 +00006433static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 PyModuleDef_HEAD_INIT,
6435 "_testcapi",
6436 NULL,
6437 -1,
6438 TestMethods,
6439 NULL,
6440 NULL,
6441 NULL,
6442 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006443};
6444
Nick Coghland5cacbb2015-05-23 22:24:10 +10006445/* Per PEP 489, this module will not be converted to multi-phase initialization
6446 */
6447
Mark Hammond62b1ab12002-07-23 06:31:15 +00006448PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006449PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 m = PyModule_Create(&_testcapimodule);
6454 if (m == NULL)
6455 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 Py_TYPE(&test_structmembersType)=&PyType_Type;
6460 Py_INCREF(&test_structmembersType);
6461 /* don't use a name starting with "test", since we don't want
6462 test_capi to automatically call this */
6463 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006464 if (PyType_Ready(&matmulType) < 0)
6465 return NULL;
6466 Py_INCREF(&matmulType);
6467 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006468 if (PyType_Ready(&ipowType) < 0) {
6469 return NULL;
6470 }
6471 Py_INCREF(&ipowType);
6472 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006473
Yury Selivanov75445082015-05-11 22:57:16 -04006474 if (PyType_Ready(&awaitType) < 0)
6475 return NULL;
6476 Py_INCREF(&awaitType);
6477 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6478
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006479 MyList_Type.tp_base = &PyList_Type;
6480 if (PyType_Ready(&MyList_Type) < 0)
6481 return NULL;
6482 Py_INCREF(&MyList_Type);
6483 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6484
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006485 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6486 return NULL;
6487 Py_INCREF(&MethodDescriptorBase_Type);
6488 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6489
6490 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6491 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6492 return NULL;
6493 Py_INCREF(&MethodDescriptorDerived_Type);
6494 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6495
6496 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6497 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6498 return NULL;
6499 Py_INCREF(&MethodDescriptorNopGet_Type);
6500 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6501
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006502 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6503 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6504 return NULL;
6505 Py_INCREF(&MethodDescriptor2_Type);
6506 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6507
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006508 if (PyType_Ready(&GenericAlias_Type) < 0)
6509 return NULL;
6510 Py_INCREF(&GenericAlias_Type);
6511 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6512
6513 if (PyType_Ready(&Generic_Type) < 0)
6514 return NULL;
6515 Py_INCREF(&Generic_Type);
6516 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6517
Petr Viktorinf9583772019-09-10 12:21:09 +01006518 if (PyType_Ready(&MethInstance_Type) < 0)
6519 return NULL;
6520 Py_INCREF(&MethInstance_Type);
6521 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
6522
6523 if (PyType_Ready(&MethClass_Type) < 0)
6524 return NULL;
6525 Py_INCREF(&MethClass_Type);
6526 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
6527
6528 if (PyType_Ready(&MethStatic_Type) < 0)
6529 return NULL;
6530 Py_INCREF(&MethStatic_Type);
6531 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
6532
xdegaye56d1f5c2017-10-26 15:09:06 +02006533 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6534 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6535 return NULL;
6536 }
6537 Py_INCREF(&PyRecursingInfinitelyError_Type);
6538 PyModule_AddObject(m, "RecursingInfinitelyError",
6539 (PyObject *)&PyRecursingInfinitelyError_Type);
6540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6542 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6543 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6544 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6545 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6546 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6547 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6548 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6549 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6550 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6551 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6552 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6553 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6554 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6555 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6556 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
6557 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
6558 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
6559 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
6560 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6561 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
6562 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02006563 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564 Py_INCREF(&PyInstanceMethod_Type);
6565 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006566
Larry Hastings2a727912014-01-16 11:32:01 -08006567 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01006568#ifdef WITH_PYMALLOC
6569 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
6570#else
6571 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
6572#endif
Larry Hastings2a727912014-01-16 11:32:01 -08006573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6575 Py_INCREF(TestError);
6576 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006577
6578 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
6579 if (HeapGcCType == NULL) {
6580 return NULL;
6581 }
6582 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
6583
6584 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
6585 if (HeapCType == NULL) {
6586 return NULL;
6587 }
6588 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
6589 if (subclass_bases == NULL) {
6590 return NULL;
6591 }
6592 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
6593 if (HeapCTypeSubclass == NULL) {
6594 return NULL;
6595 }
6596 Py_DECREF(subclass_bases);
6597 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
6598
6599 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
6600 if (subclass_with_finalizer_bases == NULL) {
6601 return NULL;
6602 }
6603 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
6604 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
6605 if (HeapCTypeSubclassWithFinalizer == NULL) {
6606 return NULL;
6607 }
6608 Py_DECREF(subclass_with_finalizer_bases);
6609 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
6610
6611 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006613}