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