blob: 3cc558689b6c18926988610da7cf8d087e5e380f [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Victor Stinner5c75f372019-04-17 23:02:26 +020013#undef Py_BUILD_CORE_MODULE
14
Neal Norwitz8866e0a2007-10-27 04:01:17 +000015#define PY_SSIZE_T_CLEAN
16
Tim Peters9ea17ac2001-02-02 05:57:15 +000017#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000018#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020019#include "marshal.h"
Victor Stinnera1c249c2018-11-01 03:15:58 +010020#include "pythread.h"
21#include "structmember.h"
22#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020023#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000024
Victor Stinner95e9cef2015-03-28 01:26:47 +010025#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020026# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010027#endif
28
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020029#ifdef HAVE_SYS_WAIT_H
30#include <sys/wait.h> /* For W_STOPCODE */
31#endif
32
Victor Stinner5ed69952018-11-06 15:59:52 +010033#ifdef Py_BUILD_CORE
34# error "_testcapi must test the public Python C API, not CPython internal C API"
35#endif
36
Eddie Elizondoff023ed2019-09-11 05:17:13 -040037static struct PyModuleDef _testcapimodule;
38
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000040
Tim Peters91621db2001-06-12 20:10:01 +000041/* Raise TestError with test_name + ": " + msg, and return NULL. */
42
43static PyObject *
44raiseTestError(const char* test_name, const char* msg)
45{
Victor Stinner6ced7c42011-03-21 18:15:42 +010046 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000048}
49
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000050/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000051
52 The ones derived from autoconf on the UNIX-like OSes can be relied
53 upon (in the absence of sloppy cross-compiling), but the Windows
54 platforms have these hardcoded. Better safe than sorry.
55*/
56static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000057sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000059{
Victor Stinner499dfcf2011-03-21 13:26:24 +010060 PyErr_Format(TestError,
61 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000064}
65
66static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053067test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000068{
Tim Peters9ea17ac2001-02-02 05:57:15 +000069#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 if (FATNAME != sizeof(TYPE)) \
71 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 CHECK_SIZEOF(SIZEOF_SHORT, short);
74 CHECK_SIZEOF(SIZEOF_INT, int);
75 CHECK_SIZEOF(SIZEOF_LONG, long);
76 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
77 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070078 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000079
80#undef CHECK_SIZEOF
81
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020082 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000083}
84
Tim Peters5c4d5bf2001-02-12 22:13:26 +000085static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053086test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010087{
Ned Deilye37a1942015-03-05 15:47:10 -080088#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020089#pragma GCC diagnostic push
90#pragma GCC diagnostic ignored "-Wtype-limits"
91#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010092#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010093 if (EXPECTED != sizeof(TYPE)) { \
94 PyErr_Format(TestError, \
95 "sizeof(%s) = %u instead of %u", \
96 #TYPE, sizeof(TYPE), EXPECTED); \
97 return (PyObject*)NULL; \
98 }
Victor Stinnerf866f972013-10-29 19:59:31 +010099#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
100#define CHECK_SIGNNESS(TYPE, SIGNED) \
101 if (IS_SIGNED(TYPE) != SIGNED) { \
102 PyErr_Format(TestError, \
103 "%s signness is, instead of %i", \
104 #TYPE, IS_SIGNED(TYPE), SIGNED); \
105 return (PyObject*)NULL; \
106 }
Victor Stinner01076552013-10-29 19:39:52 +0100107
108 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100109 CHECK_SIZEOF(Py_UCS1, 1);
110 CHECK_SIZEOF(Py_UCS2, 2);
111 CHECK_SIZEOF(Py_UCS4, 4);
112 CHECK_SIGNNESS(Py_UCS1, 0);
113 CHECK_SIGNNESS(Py_UCS2, 0);
114 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700115 CHECK_SIZEOF(int32_t, 4);
116 CHECK_SIGNNESS(int32_t, 1);
117 CHECK_SIZEOF(uint32_t, 4);
118 CHECK_SIGNNESS(uint32_t, 0);
119 CHECK_SIZEOF(int64_t, 8);
120 CHECK_SIGNNESS(int64_t, 1);
121 CHECK_SIZEOF(uint64_t, 8);
122 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100123
124 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100125 CHECK_SIZEOF(size_t, sizeof(void *));
126 CHECK_SIGNNESS(size_t, 0);
127 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
128 CHECK_SIGNNESS(Py_ssize_t, 1);
129
Benjamin Petersonca470632016-09-06 13:47:26 -0700130 CHECK_SIZEOF(uintptr_t, sizeof(void *));
131 CHECK_SIGNNESS(uintptr_t, 0);
132 CHECK_SIZEOF(intptr_t, sizeof(void *));
133 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100134
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200135 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100136
Victor Stinnerf866f972013-10-29 19:59:31 +0100137#undef IS_SIGNED
138#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100139#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800140#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200141#pragma GCC diagnostic pop
142#endif
Victor Stinner01076552013-10-29 19:39:52 +0100143}
144
145
146static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530147test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 PyObject* list;
150 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000153#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 list = PyList_New(NLIST);
155 if (list == (PyObject*)NULL)
156 return (PyObject*)NULL;
157 /* list = range(NLIST) */
158 for (i = 0; i < NLIST; ++i) {
159 PyObject* anint = PyLong_FromLong(i);
160 if (anint == (PyObject*)NULL) {
161 Py_DECREF(list);
162 return (PyObject*)NULL;
163 }
164 PyList_SET_ITEM(list, i, anint);
165 }
166 /* list.reverse(), via PyList_Reverse() */
167 i = PyList_Reverse(list); /* should not blow up! */
168 if (i != 0) {
169 Py_DECREF(list);
170 return (PyObject*)NULL;
171 }
172 /* Check that list == range(29, -1, -1) now */
173 for (i = 0; i < NLIST; ++i) {
174 PyObject* anint = PyList_GET_ITEM(list, i);
175 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
176 PyErr_SetString(TestError,
177 "test_list_api: reverse screwed up");
178 Py_DECREF(list);
179 return (PyObject*)NULL;
180 }
181 }
182 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000183#undef NLIST
184
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200185 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000186}
187
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000188static int
189test_dict_inner(int count)
190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 Py_ssize_t pos = 0, iterations = 0;
192 int i;
193 PyObject *dict = PyDict_New();
194 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 if (dict == NULL)
197 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 for (i = 0; i < count; i++) {
200 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200201 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200202 return -1;
203 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200204 if (PyDict_SetItem(dict, v, v) < 0) {
205 Py_DECREF(v);
206 return -1;
207 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 Py_DECREF(v);
209 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 while (PyDict_Next(dict, &pos, &k, &v)) {
212 PyObject *o;
213 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 i = PyLong_AS_LONG(v) + 1;
216 o = PyLong_FromLong(i);
217 if (o == NULL)
218 return -1;
219 if (PyDict_SetItem(dict, k, o) < 0) {
220 Py_DECREF(o);
221 return -1;
222 }
223 Py_DECREF(o);
224 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 if (iterations != count) {
229 PyErr_SetString(
230 TestError,
231 "test_dict_iteration: dict iteration went wrong ");
232 return -1;
233 } else {
234 return 0;
235 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236}
237
238static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530239test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 for (i = 0; i < 200; i++) {
244 if (test_dict_inner(i) < 0) {
245 return NULL;
246 }
247 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000248
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200249 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000250}
251
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200252static PyObject*
253dict_getitem_knownhash(PyObject *self, PyObject *args)
254{
255 PyObject *mp, *key, *result;
256 Py_ssize_t hash;
257
258 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
259 &mp, &key, &hash)) {
260 return NULL;
261 }
262
263 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
264 if (result == NULL && !PyErr_Occurred()) {
265 _PyErr_SetKeyError(key);
266 return NULL;
267 }
268
269 Py_XINCREF(result);
270 return result;
271}
Tim Peters91621db2001-06-12 20:10:01 +0000272
Victor Stinner3d3f2642016-12-15 17:21:23 +0100273static PyObject*
274dict_hassplittable(PyObject *self, PyObject *arg)
275{
276 if (!PyDict_Check(arg)) {
277 PyErr_Format(PyExc_TypeError,
278 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100279 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100280 return NULL;
281 }
282
283 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
284}
285
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000286/* Issue #4701: Check that PyObject_Hash implicitly calls
287 * PyType_Ready if it hasn't already been called
288 */
289static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 PyVarObject_HEAD_INIT(NULL, 0)
291 "hashinheritancetester", /* Name of this type */
292 sizeof(PyObject), /* Basic object size */
293 0, /* Item size for varobject */
294 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200295 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 0, /* tp_getattr */
297 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200298 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 0, /* tp_repr */
300 0, /* tp_as_number */
301 0, /* tp_as_sequence */
302 0, /* tp_as_mapping */
303 0, /* tp_hash */
304 0, /* tp_call */
305 0, /* tp_str */
306 PyObject_GenericGetAttr, /* tp_getattro */
307 0, /* tp_setattro */
308 0, /* tp_as_buffer */
309 Py_TPFLAGS_DEFAULT, /* tp_flags */
310 0, /* tp_doc */
311 0, /* tp_traverse */
312 0, /* tp_clear */
313 0, /* tp_richcompare */
314 0, /* tp_weaklistoffset */
315 0, /* tp_iter */
316 0, /* tp_iternext */
317 0, /* tp_methods */
318 0, /* tp_members */
319 0, /* tp_getset */
320 0, /* tp_base */
321 0, /* tp_dict */
322 0, /* tp_descr_get */
323 0, /* tp_descr_set */
324 0, /* tp_dictoffset */
325 0, /* tp_init */
326 0, /* tp_alloc */
327 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000328};
329
330static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530331test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 PyTypeObject *type;
334 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000335 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 if (type->tp_dict != NULL)
340 /* The type has already been initialized. This probably means
341 -R is being used. */
342 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000343
344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 obj = PyObject_New(PyObject, type);
346 if (obj == NULL) {
347 PyErr_Clear();
348 PyErr_SetString(
349 TestError,
350 "test_lazy_hash_inheritance: failed to create object");
351 return NULL;
352 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (type->tp_dict != NULL) {
355 PyErr_SetString(
356 TestError,
357 "test_lazy_hash_inheritance: type initialised too soon");
358 Py_DECREF(obj);
359 return NULL;
360 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 hash = PyObject_Hash(obj);
363 if ((hash == -1) && PyErr_Occurred()) {
364 PyErr_Clear();
365 PyErr_SetString(
366 TestError,
367 "test_lazy_hash_inheritance: could not hash object");
368 Py_DECREF(obj);
369 return NULL;
370 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 if (type->tp_dict == NULL) {
373 PyErr_SetString(
374 TestError,
375 "test_lazy_hash_inheritance: type not initialised by hash()");
376 Py_DECREF(obj);
377 return NULL;
378 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 if (type->tp_hash != PyType_Type.tp_hash) {
381 PyErr_SetString(
382 TestError,
383 "test_lazy_hash_inheritance: unexpected hash function");
384 Py_DECREF(obj);
385 return NULL;
386 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000391}
392
393
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700394/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000395 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000396
397 Note that the meat of the test is contained in testcapi_long.h.
398 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700399 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000400 dependence on type names makes it impossible to use a parameterized
401 function. A giant macro would be even worse than this. A C++ template
402 would be perfect.
403
404 The "report an error" functions are deliberately not part of the #include
405 file: if the test fails, you can set a breakpoint in the appropriate
406 error function directly, and crawl back from there in the debugger.
407*/
408
409#define UNBIND(X) Py_DECREF(X); (X) = NULL
410
411static PyObject *
412raise_test_long_error(const char* msg)
413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415}
416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417#define TESTNAME test_long_api_inner
418#define TYPENAME long
419#define F_S_TO_PY PyLong_FromLong
420#define F_PY_TO_S PyLong_AsLong
421#define F_U_TO_PY PyLong_FromUnsignedLong
422#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000423
424#include "testcapi_long.h"
425
426static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530427test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000430}
431
432#undef TESTNAME
433#undef TYPENAME
434#undef F_S_TO_PY
435#undef F_PY_TO_S
436#undef F_U_TO_PY
437#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000438
Tim Peters91621db2001-06-12 20:10:01 +0000439static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000440raise_test_longlong_error(const char* msg)
441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000443}
444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700446#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447#define F_S_TO_PY PyLong_FromLongLong
448#define F_PY_TO_S PyLong_AsLongLong
449#define F_U_TO_PY PyLong_FromUnsignedLongLong
450#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000451
452#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000453
454static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000455test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000458}
459
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000460#undef TESTNAME
461#undef TYPENAME
462#undef F_S_TO_PY
463#undef F_PY_TO_S
464#undef F_U_TO_PY
465#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000466
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000467/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
468 is tested by test_long_api_inner. This test will concentrate on proper
469 handling of overflow.
470*/
471
472static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530473test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 PyObject *num, *one, *temp;
476 long value;
477 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 /* Test that overflow is set properly for a large value. */
480 /* num is a number larger than LONG_MAX even on 64-bit platforms */
481 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
482 if (num == NULL)
483 return NULL;
484 overflow = 1234;
485 value = PyLong_AsLongAndOverflow(num, &overflow);
486 Py_DECREF(num);
487 if (value == -1 && PyErr_Occurred())
488 return NULL;
489 if (value != -1)
490 return raiseTestError("test_long_and_overflow",
491 "return value was not set to -1");
492 if (overflow != 1)
493 return raiseTestError("test_long_and_overflow",
494 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 /* Same again, with num = LONG_MAX + 1 */
497 num = PyLong_FromLong(LONG_MAX);
498 if (num == NULL)
499 return NULL;
500 one = PyLong_FromLong(1L);
501 if (one == NULL) {
502 Py_DECREF(num);
503 return NULL;
504 }
505 temp = PyNumber_Add(num, one);
506 Py_DECREF(one);
507 Py_DECREF(num);
508 num = temp;
509 if (num == NULL)
510 return NULL;
511 overflow = 0;
512 value = PyLong_AsLongAndOverflow(num, &overflow);
513 Py_DECREF(num);
514 if (value == -1 && PyErr_Occurred())
515 return NULL;
516 if (value != -1)
517 return raiseTestError("test_long_and_overflow",
518 "return value was not set to -1");
519 if (overflow != 1)
520 return raiseTestError("test_long_and_overflow",
521 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 /* Test that overflow is set properly for a large negative value. */
524 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
525 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
526 if (num == NULL)
527 return NULL;
528 overflow = 1234;
529 value = PyLong_AsLongAndOverflow(num, &overflow);
530 Py_DECREF(num);
531 if (value == -1 && PyErr_Occurred())
532 return NULL;
533 if (value != -1)
534 return raiseTestError("test_long_and_overflow",
535 "return value was not set to -1");
536 if (overflow != -1)
537 return raiseTestError("test_long_and_overflow",
538 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 /* Same again, with num = LONG_MIN - 1 */
541 num = PyLong_FromLong(LONG_MIN);
542 if (num == NULL)
543 return NULL;
544 one = PyLong_FromLong(1L);
545 if (one == NULL) {
546 Py_DECREF(num);
547 return NULL;
548 }
549 temp = PyNumber_Subtract(num, one);
550 Py_DECREF(one);
551 Py_DECREF(num);
552 num = temp;
553 if (num == NULL)
554 return NULL;
555 overflow = 0;
556 value = PyLong_AsLongAndOverflow(num, &overflow);
557 Py_DECREF(num);
558 if (value == -1 && PyErr_Occurred())
559 return NULL;
560 if (value != -1)
561 return raiseTestError("test_long_and_overflow",
562 "return value was not set to -1");
563 if (overflow != -1)
564 return raiseTestError("test_long_and_overflow",
565 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 /* Test that overflow is cleared properly for small values. */
568 num = PyLong_FromString("FF", NULL, 16);
569 if (num == NULL)
570 return NULL;
571 overflow = 1234;
572 value = PyLong_AsLongAndOverflow(num, &overflow);
573 Py_DECREF(num);
574 if (value == -1 && PyErr_Occurred())
575 return NULL;
576 if (value != 0xFF)
577 return raiseTestError("test_long_and_overflow",
578 "expected return value 0xFF");
579 if (overflow != 0)
580 return raiseTestError("test_long_and_overflow",
581 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 num = PyLong_FromString("-FF", NULL, 16);
584 if (num == NULL)
585 return NULL;
586 overflow = 0;
587 value = PyLong_AsLongAndOverflow(num, &overflow);
588 Py_DECREF(num);
589 if (value == -1 && PyErr_Occurred())
590 return NULL;
591 if (value != -0xFF)
592 return raiseTestError("test_long_and_overflow",
593 "expected return value 0xFF");
594 if (overflow != 0)
595 return raiseTestError("test_long_and_overflow",
596 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 num = PyLong_FromLong(LONG_MAX);
599 if (num == NULL)
600 return NULL;
601 overflow = 1234;
602 value = PyLong_AsLongAndOverflow(num, &overflow);
603 Py_DECREF(num);
604 if (value == -1 && PyErr_Occurred())
605 return NULL;
606 if (value != LONG_MAX)
607 return raiseTestError("test_long_and_overflow",
608 "expected return value LONG_MAX");
609 if (overflow != 0)
610 return raiseTestError("test_long_and_overflow",
611 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 num = PyLong_FromLong(LONG_MIN);
614 if (num == NULL)
615 return NULL;
616 overflow = 0;
617 value = PyLong_AsLongAndOverflow(num, &overflow);
618 Py_DECREF(num);
619 if (value == -1 && PyErr_Occurred())
620 return NULL;
621 if (value != LONG_MIN)
622 return raiseTestError("test_long_and_overflow",
623 "expected return value LONG_MIN");
624 if (overflow != 0)
625 return raiseTestError("test_long_and_overflow",
626 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000627
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200628 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000629}
630
Mark Dickinson93f562c2010-01-30 10:30:15 +0000631/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700632 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000633 concentrate on proper handling of overflow.
634*/
635
636static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530637test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700640 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500644 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
646 if (num == NULL)
647 return NULL;
648 overflow = 1234;
649 value = PyLong_AsLongLongAndOverflow(num, &overflow);
650 Py_DECREF(num);
651 if (value == -1 && PyErr_Occurred())
652 return NULL;
653 if (value != -1)
654 return raiseTestError("test_long_long_and_overflow",
655 "return value was not set to -1");
656 if (overflow != 1)
657 return raiseTestError("test_long_long_and_overflow",
658 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000659
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500660 /* Same again, with num = LLONG_MAX + 1 */
661 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 if (num == NULL)
663 return NULL;
664 one = PyLong_FromLong(1L);
665 if (one == NULL) {
666 Py_DECREF(num);
667 return NULL;
668 }
669 temp = PyNumber_Add(num, one);
670 Py_DECREF(one);
671 Py_DECREF(num);
672 num = temp;
673 if (num == NULL)
674 return NULL;
675 overflow = 0;
676 value = PyLong_AsLongLongAndOverflow(num, &overflow);
677 Py_DECREF(num);
678 if (value == -1 && PyErr_Occurred())
679 return NULL;
680 if (value != -1)
681 return raiseTestError("test_long_long_and_overflow",
682 "return value was not set to -1");
683 if (overflow != 1)
684 return raiseTestError("test_long_long_and_overflow",
685 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500688 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
690 if (num == NULL)
691 return NULL;
692 overflow = 1234;
693 value = PyLong_AsLongLongAndOverflow(num, &overflow);
694 Py_DECREF(num);
695 if (value == -1 && PyErr_Occurred())
696 return NULL;
697 if (value != -1)
698 return raiseTestError("test_long_long_and_overflow",
699 "return value was not set to -1");
700 if (overflow != -1)
701 return raiseTestError("test_long_long_and_overflow",
702 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000703
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500704 /* Same again, with num = LLONG_MIN - 1 */
705 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 if (num == NULL)
707 return NULL;
708 one = PyLong_FromLong(1L);
709 if (one == NULL) {
710 Py_DECREF(num);
711 return NULL;
712 }
713 temp = PyNumber_Subtract(num, one);
714 Py_DECREF(one);
715 Py_DECREF(num);
716 num = temp;
717 if (num == NULL)
718 return NULL;
719 overflow = 0;
720 value = PyLong_AsLongLongAndOverflow(num, &overflow);
721 Py_DECREF(num);
722 if (value == -1 && PyErr_Occurred())
723 return NULL;
724 if (value != -1)
725 return raiseTestError("test_long_long_and_overflow",
726 "return value was not set to -1");
727 if (overflow != -1)
728 return raiseTestError("test_long_long_and_overflow",
729 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 /* Test that overflow is cleared properly for small values. */
732 num = PyLong_FromString("FF", NULL, 16);
733 if (num == NULL)
734 return NULL;
735 overflow = 1234;
736 value = PyLong_AsLongLongAndOverflow(num, &overflow);
737 Py_DECREF(num);
738 if (value == -1 && PyErr_Occurred())
739 return NULL;
740 if (value != 0xFF)
741 return raiseTestError("test_long_long_and_overflow",
742 "expected return value 0xFF");
743 if (overflow != 0)
744 return raiseTestError("test_long_long_and_overflow",
745 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 num = PyLong_FromString("-FF", NULL, 16);
748 if (num == NULL)
749 return NULL;
750 overflow = 0;
751 value = PyLong_AsLongLongAndOverflow(num, &overflow);
752 Py_DECREF(num);
753 if (value == -1 && PyErr_Occurred())
754 return NULL;
755 if (value != -0xFF)
756 return raiseTestError("test_long_long_and_overflow",
757 "expected return value 0xFF");
758 if (overflow != 0)
759 return raiseTestError("test_long_long_and_overflow",
760 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000761
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500762 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 if (num == NULL)
764 return NULL;
765 overflow = 1234;
766 value = PyLong_AsLongLongAndOverflow(num, &overflow);
767 Py_DECREF(num);
768 if (value == -1 && PyErr_Occurred())
769 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500770 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500772 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (overflow != 0)
774 return raiseTestError("test_long_long_and_overflow",
775 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000776
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500777 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 if (num == NULL)
779 return NULL;
780 overflow = 0;
781 value = PyLong_AsLongLongAndOverflow(num, &overflow);
782 Py_DECREF(num);
783 if (value == -1 && PyErr_Occurred())
784 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500785 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500787 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 if (overflow != 0)
789 return raiseTestError("test_long_long_and_overflow",
790 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000791
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200792 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000793}
794
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200795/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
796 non-integer arguments are handled correctly. It should be extended to
797 test overflow handling.
798 */
799
800static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530801test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200802{
803 size_t out_u;
804 Py_ssize_t out_s;
805
806 Py_INCREF(Py_None);
807
808 out_u = PyLong_AsSize_t(Py_None);
809 if (out_u != (size_t)-1 || !PyErr_Occurred())
810 return raiseTestError("test_long_as_size_t",
811 "PyLong_AsSize_t(None) didn't complain");
812 if (!PyErr_ExceptionMatches(PyExc_TypeError))
813 return raiseTestError("test_long_as_size_t",
814 "PyLong_AsSize_t(None) raised "
815 "something other than TypeError");
816 PyErr_Clear();
817
818 out_s = PyLong_AsSsize_t(Py_None);
819 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
820 return raiseTestError("test_long_as_size_t",
821 "PyLong_AsSsize_t(None) didn't complain");
822 if (!PyErr_ExceptionMatches(PyExc_TypeError))
823 return raiseTestError("test_long_as_size_t",
824 "PyLong_AsSsize_t(None) raised "
825 "something other than TypeError");
826 PyErr_Clear();
827
828 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
829 return Py_None;
830}
831
Zackery Spytzdc247652019-06-06 14:39:23 -0600832static PyObject *
833test_long_as_unsigned_long_long_mask(PyObject *self,
834 PyObject *Py_UNUSED(ignored))
835{
836 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
837
838 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
839 return raiseTestError("test_long_as_unsigned_long_long_mask",
840 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
841 "complain");
842 }
843 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
844 return raiseTestError("test_long_as_unsigned_long_long_mask",
845 "PyLong_AsUnsignedLongLongMask(NULL) raised "
846 "something other than SystemError");
847 }
848 PyErr_Clear();
849 Py_RETURN_NONE;
850}
851
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200852/* Test the PyLong_AsDouble API. At present this just tests that
853 non-integer arguments are handled correctly.
854 */
855
856static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530857test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200858{
859 double out;
860
861 Py_INCREF(Py_None);
862
863 out = PyLong_AsDouble(Py_None);
864 if (out != -1.0 || !PyErr_Occurred())
865 return raiseTestError("test_long_as_double",
866 "PyLong_AsDouble(None) didn't complain");
867 if (!PyErr_ExceptionMatches(PyExc_TypeError))
868 return raiseTestError("test_long_as_double",
869 "PyLong_AsDouble(None) raised "
870 "something other than TypeError");
871 PyErr_Clear();
872
873 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
874 return Py_None;
875}
876
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700877/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000878 for both long and int arguments. The test may leak a little memory if
879 it fails.
880*/
881static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530882test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700885 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 tuple = PyTuple_New(1);
888 if (tuple == NULL)
889 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 num = PyLong_FromLong(42);
892 if (num == NULL)
893 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300898 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300900 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 if (value != 42)
902 return raiseTestError("test_L_code",
903 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 Py_DECREF(num);
906 num = PyLong_FromLong(42);
907 if (num == NULL)
908 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300913 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300915 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 if (value != 42)
917 return raiseTestError("test_L_code",
918 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200921 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000922}
923
Serhiy Storchakace412872016-05-08 23:36:44 +0300924static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300925return_none(void *unused)
926{
927 Py_RETURN_NONE;
928}
929
930static PyObject *
931raise_error(void *unused)
932{
933 PyErr_SetNone(PyExc_ValueError);
934 return NULL;
935}
936
937static int
938test_buildvalue_N_error(const char *fmt)
939{
940 PyObject *arg, *res;
941
942 arg = PyList_New(0);
943 if (arg == NULL) {
944 return -1;
945 }
946
947 Py_INCREF(arg);
948 res = Py_BuildValue(fmt, return_none, NULL, arg);
949 if (res == NULL) {
950 return -1;
951 }
952 Py_DECREF(res);
953 if (Py_REFCNT(arg) != 1) {
954 PyErr_Format(TestError, "test_buildvalue_N: "
955 "arg was not decrefed in successful "
956 "Py_BuildValue(\"%s\")", fmt);
957 return -1;
958 }
959
960 Py_INCREF(arg);
961 res = Py_BuildValue(fmt, raise_error, NULL, arg);
962 if (res != NULL || !PyErr_Occurred()) {
963 PyErr_Format(TestError, "test_buildvalue_N: "
964 "Py_BuildValue(\"%s\") didn't complain", fmt);
965 return -1;
966 }
967 PyErr_Clear();
968 if (Py_REFCNT(arg) != 1) {
969 PyErr_Format(TestError, "test_buildvalue_N: "
970 "arg was not decrefed in failed "
971 "Py_BuildValue(\"%s\")", fmt);
972 return -1;
973 }
974 Py_DECREF(arg);
975 return 0;
976}
977
978static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200979test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300980{
981 PyObject *arg, *res;
982
983 arg = PyList_New(0);
984 if (arg == NULL) {
985 return NULL;
986 }
987 Py_INCREF(arg);
988 res = Py_BuildValue("N", arg);
989 if (res == NULL) {
990 return NULL;
991 }
992 if (res != arg) {
993 return raiseTestError("test_buildvalue_N",
994 "Py_BuildValue(\"N\") returned wrong result");
995 }
996 if (Py_REFCNT(arg) != 2) {
997 return raiseTestError("test_buildvalue_N",
998 "arg was not decrefed in Py_BuildValue(\"N\")");
999 }
1000 Py_DECREF(res);
1001 Py_DECREF(arg);
1002
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 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1012 return NULL;
1013
1014 Py_RETURN_NONE;
1015}
1016
1017
1018static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001019get_args(PyObject *self, PyObject *args)
1020{
1021 if (args == NULL) {
1022 args = Py_None;
1023 }
1024 Py_INCREF(args);
1025 return args;
1026}
1027
1028static PyObject *
1029get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1030{
1031 if (kwargs == NULL) {
1032 kwargs = Py_None;
1033 }
1034 Py_INCREF(kwargs);
1035 return kwargs;
1036}
1037
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001038/* Test tuple argument processing */
1039static PyObject *
1040getargs_tuple(PyObject *self, PyObject *args)
1041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 int a, b, c;
1043 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1044 return NULL;
1045 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001046}
1047
Christian Heimes380f7f22008-02-28 11:19:05 +00001048/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001049static PyObject *
1050getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001053 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1057 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1058 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1059 return NULL;
1060 return Py_BuildValue("iiiiiiiiii",
1061 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1062 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001063}
1064
Larry Hastings83a9f482012-03-20 20:06:16 +00001065/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1066static PyObject *
1067getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1068{
1069 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1070 int required = -1;
1071 int optional = -1;
1072 int keyword_only = -1;
1073
1074 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1075 &required, &optional, &keyword_only))
1076 return NULL;
1077 return Py_BuildValue("iii", required, optional, keyword_only);
1078}
1079
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001080/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1081static PyObject *
1082getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1083{
1084 static char *keywords[] = {"", "", "keyword", NULL};
1085 int required = -1;
1086 int optional = -1;
1087 int keyword = -1;
1088
1089 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1090 &required, &optional, &keyword))
1091 return NULL;
1092 return Py_BuildValue("iii", required, optional, keyword);
1093}
1094
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095/* Functions to call PyArg_ParseTuple with integer format codes,
1096 and return the result.
1097*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001098static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001099getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 unsigned char value;
1102 if (!PyArg_ParseTuple(args, "b", &value))
1103 return NULL;
1104 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001105}
1106
Thomas Heller3457e4b2003-04-24 16:14:27 +00001107static PyObject *
1108getargs_B(PyObject *self, PyObject *args)
1109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 unsigned char value;
1111 if (!PyArg_ParseTuple(args, "B", &value))
1112 return NULL;
1113 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001114}
1115
1116static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001117getargs_h(PyObject *self, PyObject *args)
1118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 short value;
1120 if (!PyArg_ParseTuple(args, "h", &value))
1121 return NULL;
1122 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001123}
1124
1125static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001126getargs_H(PyObject *self, PyObject *args)
1127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 unsigned short value;
1129 if (!PyArg_ParseTuple(args, "H", &value))
1130 return NULL;
1131 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001132}
1133
1134static PyObject *
1135getargs_I(PyObject *self, PyObject *args)
1136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 unsigned int value;
1138 if (!PyArg_ParseTuple(args, "I", &value))
1139 return NULL;
1140 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001141}
1142
1143static PyObject *
1144getargs_k(PyObject *self, PyObject *args)
1145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 unsigned long value;
1147 if (!PyArg_ParseTuple(args, "k", &value))
1148 return NULL;
1149 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001150}
1151
1152static PyObject *
1153getargs_i(PyObject *self, PyObject *args)
1154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 int value;
1156 if (!PyArg_ParseTuple(args, "i", &value))
1157 return NULL;
1158 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001159}
1160
Thomas Hellera4ea6032003-04-17 18:55:45 +00001161static PyObject *
1162getargs_l(PyObject *self, PyObject *args)
1163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 long value;
1165 if (!PyArg_ParseTuple(args, "l", &value))
1166 return NULL;
1167 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001168}
1169
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001170static PyObject *
1171getargs_n(PyObject *self, PyObject *args)
1172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 Py_ssize_t value;
1174 if (!PyArg_ParseTuple(args, "n", &value))
1175 return NULL;
1176 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001177}
1178
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001179static PyObject *
1180getargs_p(PyObject *self, PyObject *args)
1181{
1182 int value;
1183 if (!PyArg_ParseTuple(args, "p", &value))
1184 return NULL;
1185 return PyLong_FromLong(value);
1186}
1187
Thomas Hellera4ea6032003-04-17 18:55:45 +00001188static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001189getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001190{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001191 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 if (!PyArg_ParseTuple(args, "L", &value))
1193 return NULL;
1194 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001195}
1196
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001198getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001200 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 if (!PyArg_ParseTuple(args, "K", &value))
1202 return NULL;
1203 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001205
1206/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001207 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301209test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 PyObject *tuple, *num;
1212 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 tuple = PyTuple_New(1);
1215 if (tuple == NULL)
1216 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 /* a number larger than ULONG_MAX even on 64-bit platforms */
1219 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1220 if (num == NULL)
1221 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 value = PyLong_AsUnsignedLongMask(num);
1224 if (value != ULONG_MAX)
1225 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001226 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001231 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001233 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 if (value != ULONG_MAX)
1235 return raiseTestError("test_k_code",
1236 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 Py_DECREF(num);
1239 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1240 if (num == NULL)
1241 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 value = PyLong_AsUnsignedLongMask(num);
1244 if (value != (unsigned long)-0x42)
1245 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001246 "PyLong_AsUnsignedLongMask() returned wrong "
1247 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001252 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 if (value != (unsigned long)-0x42)
1256 return raiseTestError("test_k_code",
1257 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001260 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001261}
1262
Victor Stinner06e49dd2010-06-13 18:21:50 +00001263static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001264getargs_f(PyObject *self, PyObject *args)
1265{
1266 float f;
1267 if (!PyArg_ParseTuple(args, "f", &f))
1268 return NULL;
1269 return PyFloat_FromDouble(f);
1270}
1271
1272static PyObject *
1273getargs_d(PyObject *self, PyObject *args)
1274{
1275 double d;
1276 if (!PyArg_ParseTuple(args, "d", &d))
1277 return NULL;
1278 return PyFloat_FromDouble(d);
1279}
1280
1281static PyObject *
1282getargs_D(PyObject *self, PyObject *args)
1283{
1284 Py_complex cval;
1285 if (!PyArg_ParseTuple(args, "D", &cval))
1286 return NULL;
1287 return PyComplex_FromCComplex(cval);
1288}
1289
1290static PyObject *
1291getargs_S(PyObject *self, PyObject *args)
1292{
1293 PyObject *obj;
1294 if (!PyArg_ParseTuple(args, "S", &obj))
1295 return NULL;
1296 Py_INCREF(obj);
1297 return obj;
1298}
1299
1300static PyObject *
1301getargs_Y(PyObject *self, PyObject *args)
1302{
1303 PyObject *obj;
1304 if (!PyArg_ParseTuple(args, "Y", &obj))
1305 return NULL;
1306 Py_INCREF(obj);
1307 return obj;
1308}
1309
1310static PyObject *
1311getargs_U(PyObject *self, PyObject *args)
1312{
1313 PyObject *obj;
1314 if (!PyArg_ParseTuple(args, "U", &obj))
1315 return NULL;
1316 Py_INCREF(obj);
1317 return obj;
1318}
1319
1320static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001321getargs_c(PyObject *self, PyObject *args)
1322{
1323 char c;
1324 if (!PyArg_ParseTuple(args, "c", &c))
1325 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001326 return PyLong_FromLong((unsigned char)c);
1327}
1328
1329static PyObject *
1330getargs_C(PyObject *self, PyObject *args)
1331{
1332 int c;
1333 if (!PyArg_ParseTuple(args, "C", &c))
1334 return NULL;
1335 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001336}
1337
1338static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001339getargs_s(PyObject *self, PyObject *args)
1340{
1341 char *str;
1342 if (!PyArg_ParseTuple(args, "s", &str))
1343 return NULL;
1344 return PyBytes_FromString(str);
1345}
1346
1347static PyObject *
1348getargs_s_star(PyObject *self, PyObject *args)
1349{
1350 Py_buffer buffer;
1351 PyObject *bytes;
1352 if (!PyArg_ParseTuple(args, "s*", &buffer))
1353 return NULL;
1354 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1355 PyBuffer_Release(&buffer);
1356 return bytes;
1357}
1358
1359static PyObject *
1360getargs_s_hash(PyObject *self, PyObject *args)
1361{
1362 char *str;
1363 Py_ssize_t size;
1364 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1365 return NULL;
1366 return PyBytes_FromStringAndSize(str, size);
1367}
1368
1369static PyObject *
1370getargs_z(PyObject *self, PyObject *args)
1371{
1372 char *str;
1373 if (!PyArg_ParseTuple(args, "z", &str))
1374 return NULL;
1375 if (str != NULL)
1376 return PyBytes_FromString(str);
1377 else
1378 Py_RETURN_NONE;
1379}
1380
1381static PyObject *
1382getargs_z_star(PyObject *self, PyObject *args)
1383{
1384 Py_buffer buffer;
1385 PyObject *bytes;
1386 if (!PyArg_ParseTuple(args, "z*", &buffer))
1387 return NULL;
1388 if (buffer.buf != NULL)
1389 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1390 else {
1391 Py_INCREF(Py_None);
1392 bytes = Py_None;
1393 }
1394 PyBuffer_Release(&buffer);
1395 return bytes;
1396}
1397
1398static PyObject *
1399getargs_z_hash(PyObject *self, PyObject *args)
1400{
1401 char *str;
1402 Py_ssize_t size;
1403 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1404 return NULL;
1405 if (str != NULL)
1406 return PyBytes_FromStringAndSize(str, size);
1407 else
1408 Py_RETURN_NONE;
1409}
1410
1411static PyObject *
1412getargs_y(PyObject *self, PyObject *args)
1413{
1414 char *str;
1415 if (!PyArg_ParseTuple(args, "y", &str))
1416 return NULL;
1417 return PyBytes_FromString(str);
1418}
1419
1420static PyObject *
1421getargs_y_star(PyObject *self, PyObject *args)
1422{
1423 Py_buffer buffer;
1424 PyObject *bytes;
1425 if (!PyArg_ParseTuple(args, "y*", &buffer))
1426 return NULL;
1427 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1428 PyBuffer_Release(&buffer);
1429 return bytes;
1430}
1431
1432static PyObject *
1433getargs_y_hash(PyObject *self, PyObject *args)
1434{
1435 char *str;
1436 Py_ssize_t size;
1437 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1438 return NULL;
1439 return PyBytes_FromStringAndSize(str, size);
1440}
1441
1442static PyObject *
1443getargs_u(PyObject *self, PyObject *args)
1444{
1445 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001446 if (!PyArg_ParseTuple(args, "u", &str))
1447 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001448 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001449}
1450
1451static PyObject *
1452getargs_u_hash(PyObject *self, PyObject *args)
1453{
1454 Py_UNICODE *str;
1455 Py_ssize_t size;
1456 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1457 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001458 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001459}
1460
1461static PyObject *
1462getargs_Z(PyObject *self, PyObject *args)
1463{
1464 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001465 if (!PyArg_ParseTuple(args, "Z", &str))
1466 return NULL;
1467 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001468 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001469 } else
1470 Py_RETURN_NONE;
1471}
1472
1473static PyObject *
1474getargs_Z_hash(PyObject *self, PyObject *args)
1475{
1476 Py_UNICODE *str;
1477 Py_ssize_t size;
1478 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1479 return NULL;
1480 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001481 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001482 else
1483 Py_RETURN_NONE;
1484}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001485
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001486static PyObject *
1487getargs_es(PyObject *self, PyObject *args)
1488{
1489 PyObject *arg, *result;
1490 const char *encoding = NULL;
1491 char *str;
1492
1493 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1494 return NULL;
1495 if (!PyArg_Parse(arg, "es", encoding, &str))
1496 return NULL;
1497 result = PyBytes_FromString(str);
1498 PyMem_Free(str);
1499 return result;
1500}
1501
1502static PyObject *
1503getargs_et(PyObject *self, PyObject *args)
1504{
1505 PyObject *arg, *result;
1506 const char *encoding = NULL;
1507 char *str;
1508
1509 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1510 return NULL;
1511 if (!PyArg_Parse(arg, "et", encoding, &str))
1512 return NULL;
1513 result = PyBytes_FromString(str);
1514 PyMem_Free(str);
1515 return result;
1516}
1517
1518static PyObject *
1519getargs_es_hash(PyObject *self, PyObject *args)
1520{
1521 PyObject *arg, *result;
1522 const char *encoding = NULL;
1523 PyByteArrayObject *buffer = NULL;
1524 char *str = NULL;
1525 Py_ssize_t size;
1526
1527 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1528 return NULL;
1529 if (buffer != NULL) {
1530 str = PyByteArray_AS_STRING(buffer);
1531 size = PyByteArray_GET_SIZE(buffer);
1532 }
1533 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1534 return NULL;
1535 result = PyBytes_FromStringAndSize(str, size);
1536 if (buffer == NULL)
1537 PyMem_Free(str);
1538 return result;
1539}
1540
1541static PyObject *
1542getargs_et_hash(PyObject *self, PyObject *args)
1543{
1544 PyObject *arg, *result;
1545 const char *encoding = NULL;
1546 PyByteArrayObject *buffer = NULL;
1547 char *str = NULL;
1548 Py_ssize_t size;
1549
1550 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1551 return NULL;
1552 if (buffer != NULL) {
1553 str = PyByteArray_AS_STRING(buffer);
1554 size = PyByteArray_GET_SIZE(buffer);
1555 }
1556 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1557 return NULL;
1558 result = PyBytes_FromStringAndSize(str, size);
1559 if (buffer == NULL)
1560 PyMem_Free(str);
1561 return result;
1562}
1563
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001564/* Test the s and z codes for PyArg_ParseTuple.
1565*/
1566static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301567test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001568{
1569 /* Unicode strings should be accepted */
1570 PyObject *tuple, *obj;
1571 char *value;
1572
1573 tuple = PyTuple_New(1);
1574 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001576
1577 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001579 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001581
1582 PyTuple_SET_ITEM(tuple, 0, obj);
1583
1584 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001586 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001587 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1588 return NULL;
1589 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001590
Oren Milmanba7d7362017-08-29 11:58:27 +03001591 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1592 return NULL;
1593 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001594
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001595 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001596 Py_RETURN_NONE;
1597}
1598
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001599static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001600parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001601{
Larry Hastings8f904da2012-06-22 03:56:29 -07001602 PyObject *sub_args;
1603 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001604 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001605 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001606
Larry Hastings8f904da2012-06-22 03:56:29 -07001607 Py_ssize_t i, size;
1608 char *keywords[8 + 1]; /* space for NULL at end */
1609 PyObject *o;
1610 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001611
Larry Hastings8f904da2012-06-22 03:56:29 -07001612 int result;
1613 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001614
Larry Hastings22701e82012-08-08 14:52:22 -07001615 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001616
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001617 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001618 &sub_args, &sub_kwargs,
1619 &sub_format, &sub_keywords))
1620 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001621
Larry Hastings8f904da2012-06-22 03:56:29 -07001622 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1623 PyErr_SetString(PyExc_ValueError,
1624 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1625 return NULL;
1626 }
1627
1628 memset(buffers, 0, sizeof(buffers));
1629 memset(converted, 0, sizeof(converted));
1630 memset(keywords, 0, sizeof(keywords));
1631
1632 size = PySequence_Fast_GET_SIZE(sub_keywords);
1633 if (size > 8) {
1634 PyErr_SetString(PyExc_ValueError,
1635 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1636 goto exit;
1637 }
1638
1639 for (i = 0; i < size; i++) {
1640 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1641 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1642 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001643 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001644 goto exit;
1645 }
1646 keywords[i] = PyBytes_AS_STRING(converted[i]);
1647 }
1648
1649 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1650 sub_format, keywords,
1651 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1652 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1653
1654 if (result) {
1655 return_value = Py_None;
1656 Py_INCREF(Py_None);
1657 }
1658
1659exit:
1660 size = sizeof(converted) / sizeof(converted[0]);
1661 for (i = 0; i < size; i++) {
1662 Py_XDECREF(converted[i]);
1663 }
1664 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001665}
1666
Benjamin Peterson92035012008-12-27 16:00:54 +00001667static volatile int x;
1668
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001669/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1670 of an error.
1671*/
1672static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301673test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyObject *tuple, *obj;
1676 Py_UNICODE *value;
1677 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1680 /* Just use the macro and check that it compiles */
1681 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 tuple = PyTuple_New(1);
1684 if (tuple == NULL)
1685 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 obj = PyUnicode_Decode("test", strlen("test"),
1688 "ascii", NULL);
1689 if (obj == NULL)
1690 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001695 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001697 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 if (value != PyUnicode_AS_UNICODE(obj))
1699 return raiseTestError("test_u_code",
1700 "u code returned wrong value for u'test'");
1701 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001702 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001704 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 if (value != PyUnicode_AS_UNICODE(obj) ||
1706 len != PyUnicode_GET_SIZE(obj))
1707 return raiseTestError("test_u_code",
1708 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001711 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001712}
1713
Guido van Rossumfb67be22007-08-29 18:38:11 +00001714/* Test Z and Z# codes for PyArg_ParseTuple */
1715static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301716test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001719 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 tuple = PyTuple_New(2);
1723 if (tuple == NULL)
1724 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 obj = PyUnicode_FromString("test");
1727 PyTuple_SET_ITEM(tuple, 0, obj);
1728 Py_INCREF(Py_None);
1729 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 /* swap values on purpose */
1732 value1 = NULL;
1733 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001736 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001738 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 if (value1 != PyUnicode_AS_UNICODE(obj))
1740 return raiseTestError("test_Z_code",
1741 "Z code returned wrong value for 'test'");
1742 if (value2 != NULL)
1743 return raiseTestError("test_Z_code",
1744 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 value1 = NULL;
1747 value2 = PyUnicode_AS_UNICODE(obj);
1748 len1 = -1;
1749 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001752 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1753 &value2, &len2))
1754 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001756 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1758 len1 != PyUnicode_GET_SIZE(obj))
1759 return raiseTestError("test_Z_code",
1760 "Z# code returned wrong values for 'test'");
1761 if (value2 != NULL ||
1762 len2 != 0)
1763 return raiseTestError("test_Z_code",
1764 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 Py_DECREF(tuple);
1767 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001768}
1769
Thomas Wouters477c8d52006-05-27 19:21:47 +00001770static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301771test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001772{
1773#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1775 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001776 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001777#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1779 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1784 if (wide == NULL)
1785 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1788 if (utf8 == NULL) {
1789 Py_DECREF(wide);
1790 return NULL;
1791 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001792
Victor Stinner8ef18872011-11-21 02:06:57 +01001793 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 Py_DECREF(wide);
1795 Py_DECREF(utf8);
1796 return raiseTestError("test_widechar",
1797 "wide string and utf8 string "
1798 "have different length");
1799 }
1800 if (PyUnicode_Compare(wide, utf8)) {
1801 Py_DECREF(wide);
1802 Py_DECREF(utf8);
1803 if (PyErr_Occurred())
1804 return NULL;
1805 return raiseTestError("test_widechar",
1806 "wide string and utf8 string "
1807 "are different");
1808 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 Py_DECREF(wide);
1811 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001812
1813#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1814 wide = PyUnicode_FromWideChar(invalid, 1);
1815 if (wide == NULL)
1816 PyErr_Clear();
1817 else
1818 return raiseTestError("test_widechar",
1819 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1820
1821 wide = PyUnicode_FromUnicode(invalid, 1);
1822 if (wide == NULL)
1823 PyErr_Clear();
1824 else
1825 return raiseTestError("test_widechar",
1826 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001827
1828 wide = PyUnicode_FromUnicode(NULL, 1);
1829 if (wide == NULL)
1830 return NULL;
1831 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001832 if (_PyUnicode_Ready(wide) < 0) {
1833 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001834 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001835 }
1836 else {
1837 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001838 return raiseTestError("test_widechar",
1839 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001840 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001841#endif
1842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001844}
1845
1846static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001847unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001848{
1849 PyObject *unicode, *result;
1850 Py_ssize_t buflen, size;
1851 wchar_t *buffer;
1852
1853 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1854 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001855 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001856 if (buffer == NULL)
1857 return PyErr_NoMemory();
1858
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001859 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001860 if (size == -1) {
1861 PyMem_Free(buffer);
1862 return NULL;
1863 }
1864
1865 if (size < buflen)
1866 buflen = size + 1;
1867 else
1868 buflen = size;
1869 result = PyUnicode_FromWideChar(buffer, buflen);
1870 PyMem_Free(buffer);
1871 if (result == NULL)
1872 return NULL;
1873
1874 return Py_BuildValue("(Nn)", result, size);
1875}
1876
1877static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001878unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001879{
1880 PyObject *unicode, *result;
1881 Py_ssize_t size;
1882 wchar_t *buffer;
1883
1884 if (!PyArg_ParseTuple(args, "U", &unicode))
1885 return NULL;
1886
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001887 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001888 if (buffer == NULL)
1889 return NULL;
1890
1891 result = PyUnicode_FromWideChar(buffer, size + 1);
1892 PyMem_Free(buffer);
1893 if (result == NULL)
1894 return NULL;
1895 return Py_BuildValue("(Nn)", result, size);
1896}
1897
1898static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001899unicode_asucs4(PyObject *self, PyObject *args)
1900{
1901 PyObject *unicode, *result;
1902 Py_UCS4 *buffer;
1903 int copy_null;
1904 Py_ssize_t str_len, buf_len;
1905
1906 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1907 return NULL;
1908 }
1909
1910 buf_len = str_len + 1;
1911 buffer = PyMem_NEW(Py_UCS4, buf_len);
1912 if (buffer == NULL) {
1913 return PyErr_NoMemory();
1914 }
1915 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1916 buffer[str_len] = 0xffffU;
1917
1918 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1919 PyMem_FREE(buffer);
1920 return NULL;
1921 }
1922
1923 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1924 PyMem_FREE(buffer);
1925 return result;
1926}
1927
1928static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001929unicode_asutf8(PyObject *self, PyObject *args)
1930{
1931 PyObject *unicode;
1932 const char *buffer;
1933
1934 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1935 return NULL;
1936 }
1937
1938 buffer = PyUnicode_AsUTF8(unicode);
1939 if (buffer == NULL) {
1940 return NULL;
1941 }
1942
1943 return PyBytes_FromString(buffer);
1944}
1945
1946static PyObject *
1947unicode_asutf8andsize(PyObject *self, PyObject *args)
1948{
1949 PyObject *unicode, *result;
1950 const char *buffer;
1951 Py_ssize_t utf8_len;
1952
1953 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1954 return NULL;
1955 }
1956
Victor Stinneraca8c402019-09-30 21:14:26 +02001957 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05001958 if (buffer == NULL) {
1959 return NULL;
1960 }
1961
1962 result = PyBytes_FromString(buffer);
1963 if (result == NULL) {
1964 return NULL;
1965 }
1966
1967 return Py_BuildValue("(Nn)", result, utf8_len);
1968}
1969
1970static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001971unicode_findchar(PyObject *self, PyObject *args)
1972{
1973 PyObject *str;
1974 int direction;
1975 unsigned int ch;
1976 Py_ssize_t result;
1977 Py_ssize_t start, end;
1978
1979 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1980 &start, &end, &direction)) {
1981 return NULL;
1982 }
1983
1984 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1985 if (result == -2)
1986 return NULL;
1987 else
1988 return PyLong_FromSsize_t(result);
1989}
1990
1991static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001992unicode_copycharacters(PyObject *self, PyObject *args)
1993{
1994 PyObject *from, *to, *to_copy;
1995 Py_ssize_t from_start, to_start, how_many, copied;
1996
1997 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1998 &from, &from_start, &how_many)) {
1999 return NULL;
2000 }
2001
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002002 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2003 PyUnicode_MAX_CHAR_VALUE(to)))) {
2004 return NULL;
2005 }
2006 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2007 Py_DECREF(to_copy);
2008 return NULL;
2009 }
2010
2011 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2012 from_start, how_many)) < 0) {
2013 Py_DECREF(to_copy);
2014 return NULL;
2015 }
2016
2017 return Py_BuildValue("(Nn)", to_copy, copied);
2018}
2019
2020static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002021unicode_encodedecimal(PyObject *self, PyObject *args)
2022{
2023 Py_UNICODE *unicode;
2024 Py_ssize_t length;
2025 char *errors = NULL;
2026 PyObject *decimal;
2027 Py_ssize_t decimal_length, new_length;
2028 int res;
2029
2030 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2031 return NULL;
2032
2033 decimal_length = length * 7; /* len('&#8364;') */
2034 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2035 if (decimal == NULL)
2036 return NULL;
2037
2038 res = PyUnicode_EncodeDecimal(unicode, length,
2039 PyBytes_AS_STRING(decimal),
2040 errors);
2041 if (res < 0) {
2042 Py_DECREF(decimal);
2043 return NULL;
2044 }
2045
2046 new_length = strlen(PyBytes_AS_STRING(decimal));
2047 assert(new_length <= decimal_length);
2048 res = _PyBytes_Resize(&decimal, new_length);
2049 if (res < 0)
2050 return NULL;
2051
2052 return decimal;
2053}
2054
2055static PyObject *
2056unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2057{
2058 Py_UNICODE *unicode;
2059 Py_ssize_t length;
2060 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2061 return NULL;
2062 return PyUnicode_TransformDecimalToASCII(unicode, length);
2063}
2064
2065static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002066unicode_legacy_string(PyObject *self, PyObject *args)
2067{
2068 Py_UNICODE *data;
2069 Py_ssize_t len;
2070 PyObject *u;
2071
2072 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2073 return NULL;
2074
2075 u = PyUnicode_FromUnicode(NULL, len);
2076 if (u == NULL)
2077 return NULL;
2078
2079 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2080
2081 if (len > 0) { /* The empty string is always ready. */
2082 assert(!PyUnicode_IS_READY(u));
2083 }
2084
2085 return u;
2086}
2087
2088static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002089getargs_w_star(PyObject *self, PyObject *args)
2090{
2091 Py_buffer buffer;
2092 PyObject *result;
2093 char *str;
2094
2095 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2096 return NULL;
2097
2098 if (2 <= buffer.len) {
2099 str = buffer.buf;
2100 str[0] = '[';
2101 str[buffer.len-1] = ']';
2102 }
2103
2104 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2105 PyBuffer_Release(&buffer);
2106 return result;
2107}
2108
2109
2110static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302111test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 /* Test that formats can begin with '|'. See issue #4720. */
2114 PyObject *tuple, *dict = NULL;
2115 static char *kwlist[] = {NULL};
2116 int result;
2117 tuple = PyTuple_New(0);
2118 if (!tuple)
2119 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002120 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002122 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 dict = PyDict_New();
2124 if (!dict)
2125 goto done;
2126 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002127 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 Py_DECREF(tuple);
2129 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002130 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002132 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 else {
2134 Py_RETURN_NONE;
2135 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002136}
2137
2138static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002139codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 const char *encoding, *errors = NULL;
2142 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2143 &encoding, &errors))
2144 return NULL;
2145 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002146}
2147
Thomas Wouters477c8d52006-05-27 19:21:47 +00002148static PyObject *
2149codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 const char *encoding, *errors = NULL;
2152 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2153 &encoding, &errors))
2154 return NULL;
2155 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002156}
2157
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002158
Tim Peters5b8132f2003-01-31 15:52:05 +00002159/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002160static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302161test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 struct triple {
2164 long input;
2165 size_t nbits;
2166 int sign;
2167 } testcases[] = {{0, 0, 0},
2168 {1L, 1, 1},
2169 {-1L, 1, -1},
2170 {2L, 2, 1},
2171 {-2L, 2, -1},
2172 {3L, 2, 1},
2173 {-3L, 2, -1},
2174 {4L, 3, 1},
2175 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002176 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 {-0x7fffL, 15, -1},
2178 {0xffffL, 16, 1},
2179 {-0xffffL, 16, -1},
2180 {0xfffffffL, 28, 1},
2181 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002182 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002183
Victor Stinner63941882011-09-29 00:42:28 +02002184 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002185 size_t nbits;
2186 int sign;
2187 PyObject *plong;
2188
2189 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002190 if (plong == NULL)
2191 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002192 nbits = _PyLong_NumBits(plong);
2193 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 Py_DECREF(plong);
2196 if (nbits != testcases[i].nbits)
2197 return raiseTestError("test_long_numbits",
2198 "wrong result for _PyLong_NumBits");
2199 if (sign != testcases[i].sign)
2200 return raiseTestError("test_long_numbits",
2201 "wrong result for _PyLong_Sign");
2202 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002203 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002204}
2205
Thomas Heller519a0422007-11-15 20:48:54 +00002206/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002207
2208static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302209test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2212 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2213 Py_XDECREF(o1);
2214 Py_XDECREF(o2);
2215 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002216}
2217
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002218static PyObject *
2219raise_exception(PyObject *self, PyObject *args)
2220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 PyObject *exc;
2222 PyObject *exc_args, *v;
2223 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2226 &exc, &num_args))
2227 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 exc_args = PyTuple_New(num_args);
2230 if (exc_args == NULL)
2231 return NULL;
2232 for (i = 0; i < num_args; ++i) {
2233 v = PyLong_FromLong(i);
2234 if (v == NULL) {
2235 Py_DECREF(exc_args);
2236 return NULL;
2237 }
2238 PyTuple_SET_ITEM(exc_args, i, v);
2239 }
2240 PyErr_SetObject(exc, exc_args);
2241 Py_DECREF(exc_args);
2242 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002243}
Tim Peters91621db2001-06-12 20:10:01 +00002244
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002245static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002246set_errno(PyObject *self, PyObject *args)
2247{
2248 int new_errno;
2249
2250 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2251 return NULL;
2252
2253 errno = new_errno;
2254 Py_RETURN_NONE;
2255}
2256
2257static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002258test_set_exc_info(PyObject *self, PyObject *args)
2259{
2260 PyObject *orig_exc;
2261 PyObject *new_type, *new_value, *new_tb;
2262 PyObject *type, *value, *tb;
2263 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2264 &new_type, &new_value, &new_tb))
2265 return NULL;
2266
2267 PyErr_GetExcInfo(&type, &value, &tb);
2268
2269 Py_INCREF(new_type);
2270 Py_INCREF(new_value);
2271 Py_INCREF(new_tb);
2272 PyErr_SetExcInfo(new_type, new_value, new_tb);
2273
2274 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2275 Py_XDECREF(type);
2276 Py_XDECREF(value);
2277 Py_XDECREF(tb);
2278 return orig_exc;
2279}
Benjamin Peterson16323982010-02-03 01:13:41 +00002280
2281static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002282
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002283static PyObject *
2284test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 if (PyDateTimeAPI) {
2286 if (test_run_counter) {
2287 /* Probably regrtest.py -R */
2288 Py_RETURN_NONE;
2289 }
2290 else {
2291 PyErr_SetString(PyExc_AssertionError,
2292 "PyDateTime_CAPI somehow initialized");
2293 return NULL;
2294 }
2295 }
2296 test_run_counter++;
2297 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if (PyDateTimeAPI)
2300 Py_RETURN_NONE;
2301 else
2302 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002303}
2304
Paul Ganssle04af5b12018-01-24 17:29:30 -05002305/* Functions exposing the C API type checking for testing */
2306#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2307 PyObject *obj; \
2308 int exact = 0; \
2309 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2310 return NULL; \
2311 } \
2312 int rv = exact?exact_method(obj):check_method(obj); \
2313 if (rv) { \
2314 Py_RETURN_TRUE; \
2315 } else { \
2316 Py_RETURN_FALSE; \
2317 }
2318
2319static PyObject *
2320datetime_check_date(PyObject *self, PyObject *args) {
2321 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2322}
2323
2324static PyObject *
2325datetime_check_time(PyObject *self, PyObject *args) {
2326 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2327}
2328
2329static PyObject *
2330datetime_check_datetime(PyObject *self, PyObject *args) {
2331 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2332}
2333
2334static PyObject *
2335datetime_check_delta(PyObject *self, PyObject *args) {
2336 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2337}
2338
2339static PyObject *
2340datetime_check_tzinfo(PyObject *self, PyObject *args) {
2341 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2342}
2343
2344
2345/* Makes three variations on timezone representing UTC-5:
2346 1. timezone with offset and name from PyDateTimeAPI
2347 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2348 3. timezone with offset (no name) from PyTimeZone_FromOffset
2349*/
2350static PyObject *
2351make_timezones_capi(PyObject *self, PyObject *args) {
2352 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2353 PyObject *name = PyUnicode_FromString("EST");
2354
2355 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2356 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2357 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2358
2359 Py_DecRef(offset);
2360 Py_DecRef(name);
2361
2362 PyObject *rv = PyTuple_New(3);
2363
2364 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2365 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2366 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2367
2368 return rv;
2369}
2370
2371static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002372get_timezones_offset_zero(PyObject *self, PyObject *args) {
2373 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2374 PyObject *name = PyUnicode_FromString("");
2375
2376 // These two should return the UTC singleton
2377 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2378 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2379
2380 // This one will return +00:00 zone, but not the UTC singleton
2381 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2382
2383 Py_DecRef(offset);
2384 Py_DecRef(name);
2385
2386 PyObject *rv = PyTuple_New(3);
2387 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2388 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2389 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2390
2391 return rv;
2392}
2393
2394static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002395get_timezone_utc_capi(PyObject* self, PyObject *args) {
2396 int macro = 0;
2397 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2398 return NULL;
2399 }
2400 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002401 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002402 return PyDateTime_TimeZone_UTC;
2403 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002404 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002405 return PyDateTimeAPI->TimeZone_UTC;
2406 }
2407}
2408
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002409static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002410get_date_fromdate(PyObject *self, PyObject *args)
2411{
2412 PyObject *rv = NULL;
2413 int macro;
2414 int year, month, day;
2415
2416 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2417 return NULL;
2418 }
2419
2420 if (macro) {
2421 rv = PyDate_FromDate(year, month, day);
2422 }
2423 else {
2424 rv = PyDateTimeAPI->Date_FromDate(
2425 year, month, day,
2426 PyDateTimeAPI->DateType);
2427 }
2428 return rv;
2429}
2430
2431static PyObject *
2432get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2433{
2434 PyObject *rv = NULL;
2435 int macro;
2436 int year, month, day;
2437 int hour, minute, second, microsecond;
2438
2439 if (!PyArg_ParseTuple(args, "piiiiiii",
2440 &macro,
2441 &year, &month, &day,
2442 &hour, &minute, &second, &microsecond)) {
2443 return NULL;
2444 }
2445
2446 if (macro) {
2447 rv = PyDateTime_FromDateAndTime(
2448 year, month, day,
2449 hour, minute, second, microsecond);
2450 }
2451 else {
2452 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2453 year, month, day,
2454 hour, minute, second, microsecond,
2455 Py_None,
2456 PyDateTimeAPI->DateTimeType);
2457 }
2458 return rv;
2459}
2460
2461static PyObject *
2462get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2463{
2464 PyObject *rv = NULL;
2465 int macro;
2466 int year, month, day;
2467 int hour, minute, second, microsecond, fold;
2468
2469 if (!PyArg_ParseTuple(args, "piiiiiiii",
2470 &macro,
2471 &year, &month, &day,
2472 &hour, &minute, &second, &microsecond,
2473 &fold)) {
2474 return NULL;
2475 }
2476
2477 if (macro) {
2478 rv = PyDateTime_FromDateAndTimeAndFold(
2479 year, month, day,
2480 hour, minute, second, microsecond,
2481 fold);
2482 }
2483 else {
2484 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2485 year, month, day,
2486 hour, minute, second, microsecond,
2487 Py_None,
2488 fold,
2489 PyDateTimeAPI->DateTimeType);
2490 }
2491 return rv;
2492}
2493
2494static PyObject *
2495get_time_fromtime(PyObject *self, PyObject *args)
2496{
2497 PyObject *rv = NULL;
2498 int macro;
2499 int hour, minute, second, microsecond;
2500
2501 if (!PyArg_ParseTuple(args, "piiii",
2502 &macro,
2503 &hour, &minute, &second, &microsecond)) {
2504 return NULL;
2505 }
2506
2507 if (macro) {
2508 rv = PyTime_FromTime(hour, minute, second, microsecond);
2509 }
2510 else {
2511 rv = PyDateTimeAPI->Time_FromTime(
2512 hour, minute, second, microsecond,
2513 Py_None,
2514 PyDateTimeAPI->TimeType);
2515 }
2516 return rv;
2517}
2518
2519static PyObject *
2520get_time_fromtimeandfold(PyObject *self, PyObject *args)
2521{
2522 PyObject *rv = NULL;
2523 int macro;
2524 int hour, minute, second, microsecond, fold;
2525
2526 if (!PyArg_ParseTuple(args, "piiiii",
2527 &macro,
2528 &hour, &minute, &second, &microsecond,
2529 &fold)) {
2530 return NULL;
2531 }
2532
2533 if (macro) {
2534 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2535 }
2536 else {
2537 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2538 hour, minute, second, microsecond,
2539 Py_None,
2540 fold,
2541 PyDateTimeAPI->TimeType);
2542 }
2543 return rv;
2544}
2545
2546static PyObject *
2547get_delta_fromdsu(PyObject *self, PyObject *args)
2548{
2549 PyObject *rv = NULL;
2550 int macro;
2551 int days, seconds, microseconds;
2552
2553 if (!PyArg_ParseTuple(args, "piii",
2554 &macro,
2555 &days, &seconds, &microseconds)) {
2556 return NULL;
2557 }
2558
2559 if (macro) {
2560 rv = PyDelta_FromDSU(days, seconds, microseconds);
2561 }
2562 else {
2563 rv = PyDateTimeAPI->Delta_FromDelta(
2564 days, seconds, microseconds, 1,
2565 PyDateTimeAPI->DeltaType);
2566 }
2567
2568 return rv;
2569}
2570
2571static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002572get_date_fromtimestamp(PyObject* self, PyObject *args)
2573{
2574 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2575 int macro = 0;
2576
2577 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2578 return NULL;
2579 }
2580
2581 // Construct the argument tuple
2582 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2583 return NULL;
2584 }
2585
2586 // Pass along to the API function
2587 if (macro) {
2588 rv = PyDate_FromTimestamp(tsargs);
2589 }
2590 else {
2591 rv = PyDateTimeAPI->Date_FromTimestamp(
2592 (PyObject *)PyDateTimeAPI->DateType, tsargs
2593 );
2594 }
2595
2596 Py_DECREF(tsargs);
2597 return rv;
2598}
2599
2600static PyObject *
2601get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2602{
2603 int macro = 0;
2604 int usetz = 0;
2605 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2606 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2607 return NULL;
2608 }
2609
2610 // Construct the argument tuple
2611 if (usetz) {
2612 tsargs = PyTuple_Pack(2, ts, tzinfo);
2613 }
2614 else {
2615 tsargs = PyTuple_Pack(1, ts);
2616 }
2617
2618 if (tsargs == NULL) {
2619 return NULL;
2620 }
2621
2622 // Pass along to the API function
2623 if (macro) {
2624 rv = PyDateTime_FromTimestamp(tsargs);
2625 }
2626 else {
2627 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2628 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2629 );
2630 }
2631
2632 Py_DECREF(tsargs);
2633 return rv;
2634}
2635
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002636static PyObject *
2637test_PyDateTime_GET(PyObject *self, PyObject *obj)
2638{
2639 int year, month, day;
2640
2641 year = PyDateTime_GET_YEAR(obj);
2642 month = PyDateTime_GET_MONTH(obj);
2643 day = PyDateTime_GET_DAY(obj);
2644
2645 return Py_BuildValue("(lll)", year, month, day);
2646}
2647
2648static PyObject *
2649test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2650{
2651 int hour, minute, second, microsecond;
2652
2653 hour = PyDateTime_DATE_GET_HOUR(obj);
2654 minute = PyDateTime_DATE_GET_MINUTE(obj);
2655 second = PyDateTime_DATE_GET_SECOND(obj);
2656 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2657
2658 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2659}
2660
2661static PyObject *
2662test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2663{
2664 int hour, minute, second, microsecond;
2665
2666 hour = PyDateTime_TIME_GET_HOUR(obj);
2667 minute = PyDateTime_TIME_GET_MINUTE(obj);
2668 second = PyDateTime_TIME_GET_SECOND(obj);
2669 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
2670
2671 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2672}
2673
2674static PyObject *
2675test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2676{
2677 int days, seconds, microseconds;
2678
2679 days = PyDateTime_DELTA_GET_DAYS(obj);
2680 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2681 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2682
2683 return Py_BuildValue("(lll)", days, seconds, microseconds);
2684}
Benjamin Peterson16323982010-02-03 01:13:41 +00002685
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002686/* test_thread_state spawns a thread of its own, and that thread releases
2687 * `thread_done` when it's finished. The driver code has to know when the
2688 * thread finishes, because the thread uses a PyObject (the callable) that
2689 * may go away when the driver finishes. The former lack of this explicit
2690 * synchronization caused rare segfaults, so rare that they were seen only
2691 * on a Mac buildbot (although they were possible on any box).
2692 */
2693static PyThread_type_lock thread_done = NULL;
2694
Benjamin Petersona786b022008-08-25 21:05:21 +00002695static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002696_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 PyObject *rc;
2699 int success;
2700 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002701 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 success = (rc != NULL);
2703 Py_XDECREF(rc);
2704 PyGILState_Release(s);
2705 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002706}
2707
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002708/* Same thing, but releases `thread_done` when it returns. This variant
2709 * should be called only from threads spawned by test_thread_state().
2710 */
2711static void
2712_make_call_from_thread(void *callable)
2713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 _make_call(callable);
2715 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002716}
2717
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002718static PyObject *
2719test_thread_state(PyObject *self, PyObject *args)
2720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 PyObject *fn;
2722 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2725 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (!PyCallable_Check(fn)) {
2728 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002729 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 return NULL;
2731 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 thread_done = PyThread_allocate_lock();
2734 if (thread_done == NULL)
2735 return PyErr_NoMemory();
2736 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 /* Start a new thread with our callback. */
2739 PyThread_start_new_thread(_make_call_from_thread, fn);
2740 /* Make the callback with the thread lock held by this thread */
2741 success &= _make_call(fn);
2742 /* Do it all again, but this time with the thread-lock released */
2743 Py_BEGIN_ALLOW_THREADS
2744 success &= _make_call(fn);
2745 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2746 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 /* And once more with and without a thread
2749 XXX - should use a lock and work out exactly what we are trying
2750 to test <wink>
2751 */
2752 Py_BEGIN_ALLOW_THREADS
2753 PyThread_start_new_thread(_make_call_from_thread, fn);
2754 success &= _make_call(fn);
2755 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2756 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 /* Release lock we acquired above. This is required on HP-UX. */
2759 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 PyThread_free_lock(thread_done);
2762 if (!success)
2763 return NULL;
2764 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002765}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002766
2767/* test Py_AddPendingCalls using threads */
2768static int _pending_callback(void *arg)
2769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 /* we assume the argument is callable object to which we own a reference */
2771 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002772 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 Py_DECREF(callable);
2774 Py_XDECREF(r);
2775 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002776}
2777
2778/* The following requests n callbacks to _pending_callback. It can be
2779 * run from any python thread.
2780 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002781static PyObject *
2782pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 PyObject *callable;
2785 int r;
2786 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2787 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 /* create the reference for the callbackwhile we hold the lock */
2790 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 Py_BEGIN_ALLOW_THREADS
2793 r = Py_AddPendingCall(&_pending_callback, callable);
2794 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 if (r<0) {
2797 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002798 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002800 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002801}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002802
Neal Norwitzb0d26332007-08-25 00:49:05 +00002803/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002804static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002805test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 PyObject *result;
2808 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002809
Alexander Belopolskye239d232010-12-08 23:31:48 +00002810#define CHECK_1_FORMAT(FORMAT, TYPE) \
2811 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2812 if (result == NULL) \
2813 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002814 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002815 msg = FORMAT " failed at 1"; \
2816 goto Fail; \
2817 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 CHECK_1_FORMAT("%d", int);
2821 CHECK_1_FORMAT("%ld", long);
2822 /* The z width modifier was added in Python 2.5. */
2823 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 /* The u type code was added in Python 2.5. */
2826 CHECK_1_FORMAT("%u", unsigned int);
2827 CHECK_1_FORMAT("%lu", unsigned long);
2828 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002831 CHECK_1_FORMAT("%llu", unsigned long long);
2832 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835
2836 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 Py_XDECREF(result);
2838 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002839
2840#undef CHECK_1_FORMAT
2841}
2842
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002843
2844static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302845test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2847 int result;
2848 if (py_s == NULL)
2849 return NULL;
2850 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2851 Py_DECREF(py_s);
2852 if (!result) {
2853 PyErr_SetString(TestError, "Python string ending in NULL "
2854 "should not compare equal to c string.");
2855 return NULL;
2856 }
2857 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002858}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002859
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002860/* This is here to provide a docstring for test_descr. */
2861static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302862test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002865}
2866
Mark Dickinson725bfd82009-05-03 20:33:40 +00002867/* Test PyOS_string_to_double. */
2868static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302869test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002871 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873#define CHECK_STRING(STR, expected) \
2874 result = PyOS_string_to_double(STR, NULL, NULL); \
2875 if (result == -1.0 && PyErr_Occurred()) \
2876 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002877 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 msg = "conversion of " STR " to float failed"; \
2879 goto fail; \
2880 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882#define CHECK_INVALID(STR) \
2883 result = PyOS_string_to_double(STR, NULL, NULL); \
2884 if (result == -1.0 && PyErr_Occurred()) { \
2885 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2886 PyErr_Clear(); \
2887 else \
2888 return NULL; \
2889 } \
2890 else { \
2891 msg = "conversion of " STR " didn't raise ValueError"; \
2892 goto fail; \
2893 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 CHECK_STRING("0.1", 0.1);
2896 CHECK_STRING("1.234", 1.234);
2897 CHECK_STRING("-1.35", -1.35);
2898 CHECK_STRING(".1e01", 1.0);
2899 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 CHECK_INVALID(" 0.1");
2902 CHECK_INVALID("\t\n-3");
2903 CHECK_INVALID(".123 ");
2904 CHECK_INVALID("3\n");
2905 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002908 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002910#undef CHECK_STRING
2911#undef CHECK_INVALID
2912}
2913
2914
Benjamin Petersonb173f782009-05-05 22:31:58 +00002915/* Coverage testing of capsule objects. */
2916
2917static const char *capsule_name = "capsule name";
2918static char *capsule_pointer = "capsule pointer";
2919static char *capsule_context = "capsule context";
2920static const char *capsule_error = NULL;
2921static int
2922capsule_destructor_call_count = 0;
2923
2924static void
2925capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 capsule_destructor_call_count++;
2927 if (PyCapsule_GetContext(o) != capsule_context) {
2928 capsule_error = "context did not match in destructor!";
2929 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2930 capsule_error = "destructor did not match in destructor! (woah!)";
2931 } else if (PyCapsule_GetName(o) != capsule_name) {
2932 capsule_error = "name did not match in destructor!";
2933 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2934 capsule_error = "pointer did not match in destructor!";
2935 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002936}
2937
2938typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 char *name;
2940 char *module;
2941 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002942} known_capsule;
2943
2944static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002945test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 PyObject *object;
2948 const char *error = NULL;
2949 void *pointer;
2950 void *pointer2;
2951 known_capsule known_capsules[] = {
2952 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2953 KNOWN_CAPSULE("_socket", "CAPI"),
2954 KNOWN_CAPSULE("_curses", "_C_API"),
2955 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2956 { NULL, NULL },
2957 };
2958 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002959
2960#define FAIL(x) { error = (x); goto exit; }
2961
2962#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 if (capsule_error) { \
2964 FAIL(capsule_error); \
2965 } \
2966 else if (!capsule_destructor_call_count) { \
2967 FAIL("destructor not called!"); \
2968 } \
2969 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2972 PyCapsule_SetContext(object, capsule_context);
2973 capsule_destructor(object);
2974 CHECK_DESTRUCTOR;
2975 Py_DECREF(object);
2976 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 object = PyCapsule_New(known, "ignored", NULL);
2979 PyCapsule_SetPointer(object, capsule_pointer);
2980 PyCapsule_SetName(object, capsule_name);
2981 PyCapsule_SetDestructor(object, capsule_destructor);
2982 PyCapsule_SetContext(object, capsule_context);
2983 capsule_destructor(object);
2984 CHECK_DESTRUCTOR;
2985 /* intentionally access using the wrong name */
2986 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2987 if (!PyErr_Occurred()) {
2988 FAIL("PyCapsule_GetPointer should have failed but did not!");
2989 }
2990 PyErr_Clear();
2991 if (pointer2) {
2992 if (pointer2 == capsule_pointer) {
2993 FAIL("PyCapsule_GetPointer should not have"
2994 " returned the internal pointer!");
2995 } else {
2996 FAIL("PyCapsule_GetPointer should have "
2997 "returned NULL pointer but did not!");
2998 }
2999 }
3000 PyCapsule_SetDestructor(object, NULL);
3001 Py_DECREF(object);
3002 if (capsule_destructor_call_count) {
3003 FAIL("destructor called when it should not have been!");
3004 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 for (known = &known_capsules[0]; known->module != NULL; known++) {
3007 /* yeah, ordinarily I wouldn't do this either,
3008 but it's fine for this test harness.
3009 */
3010 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003011#undef FAIL
3012#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 { \
3014 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3015 x, known->module, known->attribute); \
3016 error = buffer; \
3017 goto exit; \
3018 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 PyObject *module = PyImport_ImportModule(known->module);
3021 if (module) {
3022 pointer = PyCapsule_Import(known->name, 0);
3023 if (!pointer) {
3024 Py_DECREF(module);
3025 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3026 }
3027 object = PyObject_GetAttrString(module, known->attribute);
3028 if (!object) {
3029 Py_DECREF(module);
3030 return NULL;
3031 }
3032 pointer2 = PyCapsule_GetPointer(object,
3033 "weebles wobble but they don't fall down");
3034 if (!PyErr_Occurred()) {
3035 Py_DECREF(object);
3036 Py_DECREF(module);
3037 FAIL("PyCapsule_GetPointer should have failed but did not!");
3038 }
3039 PyErr_Clear();
3040 if (pointer2) {
3041 Py_DECREF(module);
3042 Py_DECREF(object);
3043 if (pointer2 == pointer) {
3044 FAIL("PyCapsule_GetPointer should not have"
3045 " returned its internal pointer!");
3046 } else {
3047 FAIL("PyCapsule_GetPointer should have"
3048 " returned NULL pointer but did not!");
3049 }
3050 }
3051 Py_DECREF(object);
3052 Py_DECREF(module);
3053 }
3054 else
3055 PyErr_Clear();
3056 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003057
3058 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 if (error) {
3060 return raiseTestError("test_capsule", error);
3061 }
3062 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003063#undef FAIL
3064}
3065
Guido van Rossumddefaf32007-01-14 03:31:43 +00003066#ifdef HAVE_GETTIMEOFDAY
3067/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003068static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 e->tv_sec -= s->tv_sec;
3071 e->tv_usec -= s->tv_usec;
3072 if (e->tv_usec < 0) {
3073 e->tv_sec -=1;
3074 e->tv_usec += 1000000;
3075 }
3076 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003077}
3078
3079static PyObject *
3080profile_int(PyObject *self, PyObject* args)
3081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 int i, k;
3083 struct timeval start, stop;
3084 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 /* Test 1: Allocate and immediately deallocate
3087 many small integers */
3088 gettimeofday(&start, NULL);
3089 for(k=0; k < 20000; k++)
3090 for(i=0; i < 1000; i++) {
3091 single = PyLong_FromLong(i);
3092 Py_DECREF(single);
3093 }
3094 gettimeofday(&stop, NULL);
3095 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 /* Test 2: Allocate and immediately deallocate
3098 many large integers */
3099 gettimeofday(&start, NULL);
3100 for(k=0; k < 20000; k++)
3101 for(i=0; i < 1000; i++) {
3102 single = PyLong_FromLong(i+1000000);
3103 Py_DECREF(single);
3104 }
3105 gettimeofday(&stop, NULL);
3106 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 /* Test 3: Allocate a few integers, then release
3109 them all simultaneously. */
3110 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003111 if (multiple == NULL)
3112 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 gettimeofday(&start, NULL);
3114 for(k=0; k < 20000; k++) {
3115 for(i=0; i < 1000; i++) {
3116 multiple[i] = PyLong_FromLong(i+1000000);
3117 }
3118 for(i=0; i < 1000; i++) {
3119 Py_DECREF(multiple[i]);
3120 }
3121 }
3122 gettimeofday(&stop, NULL);
3123 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003124 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 /* Test 4: Allocate many integers, then release
3127 them all simultaneously. */
3128 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003129 if (multiple == NULL)
3130 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 gettimeofday(&start, NULL);
3132 for(k=0; k < 20; k++) {
3133 for(i=0; i < 1000000; i++) {
3134 multiple[i] = PyLong_FromLong(i+1000000);
3135 }
3136 for(i=0; i < 1000000; i++) {
3137 Py_DECREF(multiple[i]);
3138 }
3139 }
3140 gettimeofday(&stop, NULL);
3141 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003142 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 /* Test 5: Allocate many integers < 32000 */
3145 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003146 if (multiple == NULL)
3147 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 gettimeofday(&start, NULL);
3149 for(k=0; k < 10; k++) {
3150 for(i=0; i < 1000000; i++) {
3151 multiple[i] = PyLong_FromLong(i+1000);
3152 }
3153 for(i=0; i < 1000000; i++) {
3154 Py_DECREF(multiple[i]);
3155 }
3156 }
3157 gettimeofday(&stop, NULL);
3158 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003159 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 /* Test 6: Perform small int addition */
3162 op1 = PyLong_FromLong(1);
3163 gettimeofday(&start, NULL);
3164 for(i=0; i < 10000000; i++) {
3165 result = PyNumber_Add(op1, op1);
3166 Py_DECREF(result);
3167 }
3168 gettimeofday(&stop, NULL);
3169 Py_DECREF(op1);
3170 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 /* Test 7: Perform medium int addition */
3173 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003174 if (op1 == NULL)
3175 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 gettimeofday(&start, NULL);
3177 for(i=0; i < 10000000; i++) {
3178 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003179 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 }
3181 gettimeofday(&stop, NULL);
3182 Py_DECREF(op1);
3183 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003184
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003185 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003186}
3187#endif
3188
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003189/* To test the format of tracebacks as printed out. */
3190static PyObject *
3191traceback_print(PyObject *self, PyObject *args)
3192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 PyObject *file;
3194 PyObject *traceback;
3195 int result;
3196
3197 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3198 &traceback, &file))
3199 return NULL;
3200
3201 result = PyTraceBack_Print(traceback, file);
3202 if (result < 0)
3203 return NULL;
3204 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003205}
3206
Benjamin Petersone6528212008-07-15 15:32:09 +00003207/* To test the format of exceptions as printed out. */
3208static PyObject *
3209exception_print(PyObject *self, PyObject *args)
3210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 PyObject *value;
3212 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 if (!PyArg_ParseTuple(args, "O:exception_print",
3215 &value))
3216 return NULL;
3217 if (!PyExceptionInstance_Check(value)) {
3218 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3219 return NULL;
3220 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 tb = PyException_GetTraceback(value);
3223 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3224 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003227}
3228
3229
3230
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003231
3232/* reliably raise a MemoryError */
3233static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303234raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 PyErr_NoMemory();
3237 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003238}
3239
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003240/* Issue 6012 */
3241static PyObject *str1, *str2;
3242static int
3243failing_converter(PyObject *obj, void *arg)
3244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 /* Clone str1, then let the conversion fail. */
3246 assert(str1);
3247 str2 = str1;
3248 Py_INCREF(str2);
3249 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003250}
3251static PyObject*
3252argparsing(PyObject *o, PyObject *args)
3253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 PyObject *res;
3255 str1 = str2 = NULL;
3256 if (!PyArg_ParseTuple(args, "O&O&",
3257 PyUnicode_FSConverter, &str1,
3258 failing_converter, &str2)) {
3259 if (!str2)
3260 /* argument converter not called? */
3261 return NULL;
3262 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003263 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 Py_DECREF(str2);
3265 PyErr_Clear();
3266 return res;
3267 }
3268 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003269}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003270
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003271/* To test that the result of PyCode_NewEmpty has the right members. */
3272static PyObject *
3273code_newempty(PyObject *self, PyObject *args)
3274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 const char *filename;
3276 const char *funcname;
3277 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3280 &filename, &funcname, &firstlineno))
3281 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003284}
3285
Georg Brandl1e28a272009-12-28 08:41:01 +00003286/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3287 Run via Lib/test/test_exceptions.py */
3288static PyObject *
3289make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 const char *name;
3292 const char *doc = NULL;
3293 PyObject *base = NULL;
3294 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3299 "s|sOO:make_exception_with_doc", kwlist,
3300 &name, &doc, &base, &dict))
3301 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003304}
3305
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003306static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303307make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003308{
3309 Py_buffer info;
3310 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3311 return NULL;
3312 return PyMemoryView_FromBuffer(&info);
3313}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003314
Stefan Krah7213fcc2015-02-01 16:19:23 +01003315static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003316test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003317{
3318 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3319 int init[5] = {0, 1, 2, 3, 4};
3320 Py_ssize_t itemsize = sizeof(int);
3321 Py_ssize_t shape = 5;
3322 Py_ssize_t strides = 2 * itemsize;
3323 Py_buffer view = {
3324 data,
3325 NULL,
3326 5 * itemsize,
3327 itemsize,
3328 1,
3329 1,
3330 NULL,
3331 &shape,
3332 &strides,
3333 NULL,
3334 NULL
3335 };
3336 int *ptr;
3337 int i;
3338
3339 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3340 ptr = view.buf;
3341 for (i = 0; i < 5; i++) {
3342 if (ptr[2*i] != i) {
3343 PyErr_SetString(TestError,
3344 "test_from_contiguous: incorrect result");
3345 return NULL;
3346 }
3347 }
3348
3349 view.buf = &data[8];
3350 view.strides[0] = -2 * itemsize;
3351
3352 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3353 ptr = view.buf;
3354 for (i = 0; i < 5; i++) {
3355 if (*(ptr-2*i) != i) {
3356 PyErr_SetString(TestError,
3357 "test_from_contiguous: incorrect result");
3358 return NULL;
3359 }
3360 }
3361
3362 Py_RETURN_NONE;
3363}
Stefan Krah650c1e82015-02-03 21:43:23 +01003364
Stefan Kraha7559c02015-02-03 22:27:21 +01003365#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003366extern PyTypeObject _PyBytesIOBuffer_Type;
3367
Stefan Krah5178d912015-02-03 16:57:21 +01003368static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003369test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003370{
Stefan Krah650c1e82015-02-03 21:43:23 +01003371 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003372 PyObject *b;
3373 char *dummy[1];
3374 int ret, match;
3375
Stefan Krah650c1e82015-02-03 21:43:23 +01003376 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003377 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3378 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3379 PyErr_Clear();
3380 if (ret != -1 || match == 0)
3381 goto error;
3382
Stefan Krah650c1e82015-02-03 21:43:23 +01003383 /* bytesiobuf_getbuffer() */
3384 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003385 if (b == NULL) {
3386 return NULL;
3387 }
3388
3389 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3390 Py_DECREF(b);
3391 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3392 PyErr_Clear();
3393 if (ret != -1 || match == 0)
3394 goto error;
3395
3396 Py_RETURN_NONE;
3397
3398error:
3399 PyErr_SetString(TestError,
3400 "test_pep3118_obsolete_write_locks: failure");
3401 return NULL;
3402}
Stefan Kraha7559c02015-02-03 22:27:21 +01003403#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003404
Stefan Krah650c1e82015-02-03 21:43:23 +01003405/* This tests functions that historically supported write locks. It is
3406 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3407 is entitled to segfault in that case. */
3408static PyObject *
3409getbuffer_with_null_view(PyObject* self, PyObject *obj)
3410{
3411 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3412 return NULL;
3413
3414 Py_RETURN_NONE;
3415}
3416
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003417/* PyBuffer_SizeFromFormat() */
3418static PyObject *
3419test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3420{
3421 const char *format;
3422 Py_ssize_t result;
3423
3424 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3425 &format)) {
3426 return NULL;
3427 }
3428
3429 result = PyBuffer_SizeFromFormat(format);
3430 if (result == -1) {
3431 return NULL;
3432 }
3433
3434 return PyLong_FromSsize_t(result);
3435}
3436
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003437/* Test that the fatal error from not having a current thread doesn't
3438 cause an infinite loop. Run via Lib/test/test_capi.py */
3439static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303440crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003441{
3442 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003443 /* Using PyThreadState_Get() directly allows the test to pass in
3444 !pydebug mode. However, the test only actually tests anything
3445 in pydebug mode, since that's where the infinite loop was in
3446 the first place. */
3447 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003448 Py_END_ALLOW_THREADS
3449 return NULL;
3450}
3451
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003452/* To run some code in a sub-interpreter. */
3453static PyObject *
3454run_in_subinterp(PyObject *self, PyObject *args)
3455{
3456 const char *code;
3457 int r;
3458 PyThreadState *substate, *mainstate;
3459
3460 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3461 &code))
3462 return NULL;
3463
3464 mainstate = PyThreadState_Get();
3465
3466 PyThreadState_Swap(NULL);
3467
3468 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003469 if (substate == NULL) {
3470 /* Since no new thread state was created, there is no exception to
3471 propagate; raise a fresh one after swapping in the old thread
3472 state. */
3473 PyThreadState_Swap(mainstate);
3474 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3475 return NULL;
3476 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003477 r = PyRun_SimpleString(code);
3478 Py_EndInterpreter(substate);
3479
3480 PyThreadState_Swap(mainstate);
3481
3482 return PyLong_FromLong(r);
3483}
3484
Victor Stinner3c1b3792014-02-17 00:02:43 +01003485static int
3486check_time_rounding(int round)
3487{
Victor Stinner74474232015-09-02 01:43:56 +02003488 if (round != _PyTime_ROUND_FLOOR
3489 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003490 && round != _PyTime_ROUND_HALF_EVEN
3491 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003492 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3493 return -1;
3494 }
3495 return 0;
3496}
3497
Victor Stinner5d272cc2012-03-13 13:35:55 +01003498static PyObject *
3499test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3500{
3501 PyObject *obj;
3502 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003503 int round;
3504 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003505 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003506 if (check_time_rounding(round) < 0)
3507 return NULL;
3508 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003509 return NULL;
3510 return _PyLong_FromTime_t(sec);
3511}
3512
3513static PyObject *
3514test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3515{
3516 PyObject *obj;
3517 time_t sec;
3518 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003519 int round;
3520 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003521 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003522 if (check_time_rounding(round) < 0)
3523 return NULL;
3524 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003525 return NULL;
3526 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3527}
3528
Victor Stinner643cd682012-03-02 22:54:03 +01003529static PyObject *
3530test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3531{
3532 PyObject *obj;
3533 time_t sec;
3534 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003535 int round;
3536 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003537 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003538 if (check_time_rounding(round) < 0)
3539 return NULL;
3540 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003541 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003542 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003543}
3544
Antoine Pitrou796564c2013-07-30 19:59:21 +02003545static void
3546slot_tp_del(PyObject *self)
3547{
3548 _Py_IDENTIFIER(__tp_del__);
3549 PyObject *del, *res;
3550 PyObject *error_type, *error_value, *error_traceback;
3551
3552 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003553 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003554 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003555
3556 /* Save the current exception, if any. */
3557 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3558
3559 /* Execute __del__ method, if any. */
3560 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3561 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003562 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003563 if (res == NULL)
3564 PyErr_WriteUnraisable(del);
3565 else
3566 Py_DECREF(res);
3567 Py_DECREF(del);
3568 }
3569
3570 /* Restore the saved exception. */
3571 PyErr_Restore(error_type, error_value, error_traceback);
3572
3573 /* Undo the temporary resurrection; can't use DECREF here, it would
3574 * cause a recursive call.
3575 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003576 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003577 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3578 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003579 /* this is the normal path out */
3580 return;
3581 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003582
3583 /* __del__ resurrected it! Make it look like the original Py_DECREF
3584 * never happened.
3585 */
3586 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003587 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003588 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003589 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003590 }
INADA Naokid8521422018-05-17 11:07:21 +09003591 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003592 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3593 _Py_RefTotal, so we need to undo that. */
3594#ifdef Py_REF_DEBUG
3595 _Py_RefTotal--;
3596#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003597}
3598
3599static PyObject *
3600with_tp_del(PyObject *self, PyObject *args)
3601{
3602 PyObject *obj;
3603 PyTypeObject *tp;
3604
3605 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3606 return NULL;
3607 tp = (PyTypeObject *) obj;
3608 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3609 PyErr_Format(PyExc_TypeError,
3610 "heap type expected, got %R", obj);
3611 return NULL;
3612 }
3613 tp->tp_del = slot_tp_del;
3614 Py_INCREF(obj);
3615 return obj;
3616}
3617
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003618static PyMethodDef ml;
3619
3620static PyObject *
3621create_cfunction(PyObject *self, PyObject *args)
3622{
3623 return PyCFunction_NewEx(&ml, self, NULL);
3624}
3625
3626static PyMethodDef ml = {
3627 "create_cfunction",
3628 create_cfunction,
3629 METH_NOARGS,
3630 NULL
3631};
3632
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003633static PyObject *
3634_test_incref(PyObject *ob)
3635{
3636 Py_INCREF(ob);
3637 return ob;
3638}
3639
3640static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303641test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003642{
3643 PyObject *obj = PyLong_FromLong(0);
3644 Py_XINCREF(_test_incref(obj));
3645 Py_DECREF(obj);
3646 Py_DECREF(obj);
3647 Py_DECREF(obj);
3648 Py_RETURN_NONE;
3649}
3650
3651static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303652test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003653{
3654 PyObject *obj = PyLong_FromLong(0);
3655 Py_INCREF(_test_incref(obj));
3656 Py_DECREF(obj);
3657 Py_DECREF(obj);
3658 Py_DECREF(obj);
3659 Py_RETURN_NONE;
3660}
3661
3662static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303663test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003664{
3665 Py_XDECREF(PyLong_FromLong(0));
3666 Py_RETURN_NONE;
3667}
3668
3669static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303670test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003671{
3672 Py_DECREF(PyLong_FromLong(0));
3673 Py_RETURN_NONE;
3674}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003675
Victor Stinner0507bf52013-07-07 02:05:46 +02003676static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003677test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3678 PyObject *Py_UNUSED(args))
3679{
3680 PyStructSequence_Desc descr;
3681 PyStructSequence_Field descr_fields[3];
3682
3683 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3684 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3685 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3686
3687 descr.name = "_testcapi.test_descr";
3688 descr.doc = "This is used to test for memory leaks in NewType";
3689 descr.fields = descr_fields;
3690 descr.n_in_sequence = 1;
3691
3692 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3693 assert(structseq_type != NULL);
3694 assert(PyType_Check(structseq_type));
3695 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3696 Py_DECREF(structseq_type);
3697
3698 Py_RETURN_NONE;
3699}
3700
3701static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303702test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003703{
3704 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003705 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003706 Py_DecRef(obj);
3707 Py_DecRef(obj);
3708 Py_RETURN_NONE;
3709}
3710
3711static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303712test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003713{
3714 void *ptr;
3715
Victor Stinnerdb067af2014-05-02 22:31:14 +02003716 ptr = PyMem_RawMalloc(0);
3717 if (ptr == NULL) {
3718 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3719 return NULL;
3720 }
3721 PyMem_RawFree(ptr);
3722
3723 ptr = PyMem_RawCalloc(0, 0);
3724 if (ptr == NULL) {
3725 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3726 return NULL;
3727 }
3728 PyMem_RawFree(ptr);
3729
Victor Stinner0507bf52013-07-07 02:05:46 +02003730 ptr = PyMem_Malloc(0);
3731 if (ptr == NULL) {
3732 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3733 return NULL;
3734 }
3735 PyMem_Free(ptr);
3736
Victor Stinnerdb067af2014-05-02 22:31:14 +02003737 ptr = PyMem_Calloc(0, 0);
3738 if (ptr == NULL) {
3739 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3740 return NULL;
3741 }
3742 PyMem_Free(ptr);
3743
Victor Stinner0507bf52013-07-07 02:05:46 +02003744 ptr = PyObject_Malloc(0);
3745 if (ptr == NULL) {
3746 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3747 return NULL;
3748 }
3749 PyObject_Free(ptr);
3750
Victor Stinnerdb067af2014-05-02 22:31:14 +02003751 ptr = PyObject_Calloc(0, 0);
3752 if (ptr == NULL) {
3753 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3754 return NULL;
3755 }
3756 PyObject_Free(ptr);
3757
Victor Stinner0507bf52013-07-07 02:05:46 +02003758 Py_RETURN_NONE;
3759}
3760
3761typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003762 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003763
3764 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003765 size_t calloc_nelem;
3766 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003767 void *realloc_ptr;
3768 size_t realloc_new_size;
3769 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003770 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003771} alloc_hook_t;
3772
Victor Stinner9ed83c42017-10-31 12:18:10 -07003773static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003774{
3775 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003776 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003777 hook->malloc_size = size;
3778 return hook->alloc.malloc(hook->alloc.ctx, size);
3779}
3780
Victor Stinner9ed83c42017-10-31 12:18:10 -07003781static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003782{
3783 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003784 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003785 hook->calloc_nelem = nelem;
3786 hook->calloc_elsize = elsize;
3787 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3788}
3789
Victor Stinner9ed83c42017-10-31 12:18:10 -07003790static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003791{
3792 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003793 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003794 hook->realloc_ptr = ptr;
3795 hook->realloc_new_size = new_size;
3796 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3797}
3798
Victor Stinner9ed83c42017-10-31 12:18:10 -07003799static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003800{
3801 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003802 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003803 hook->free_ptr = ptr;
3804 hook->alloc.free(hook->alloc.ctx, ptr);
3805}
3806
3807static PyObject *
3808test_setallocators(PyMemAllocatorDomain domain)
3809{
3810 PyObject *res = NULL;
3811 const char *error_msg;
3812 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003813 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003814 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003815 void *ptr, *ptr2;
3816
Victor Stinnerdb067af2014-05-02 22:31:14 +02003817 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003818
3819 alloc.ctx = &hook;
3820 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003821 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003822 alloc.realloc = &hook_realloc;
3823 alloc.free = &hook_free;
3824 PyMem_GetAllocator(domain, &hook.alloc);
3825 PyMem_SetAllocator(domain, &alloc);
3826
Victor Stinner9ed83c42017-10-31 12:18:10 -07003827 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003828 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003829 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003830 switch(domain)
3831 {
3832 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3833 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3834 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3835 default: ptr = NULL; break;
3836 }
3837
Victor Stinner9ed83c42017-10-31 12:18:10 -07003838#define CHECK_CTX(FUNC) \
3839 if (hook.ctx != &hook) { \
3840 error_msg = FUNC " wrong context"; \
3841 goto fail; \
3842 } \
3843 hook.ctx = NULL; /* reset for next check */
3844
Victor Stinner0507bf52013-07-07 02:05:46 +02003845 if (ptr == NULL) {
3846 error_msg = "malloc failed";
3847 goto fail;
3848 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003849 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003850 if (hook.malloc_size != size) {
3851 error_msg = "malloc invalid size";
3852 goto fail;
3853 }
3854
3855 size2 = 200;
3856 switch(domain)
3857 {
3858 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3859 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3860 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003861 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003862 }
3863
3864 if (ptr2 == NULL) {
3865 error_msg = "realloc failed";
3866 goto fail;
3867 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003868 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003869 if (hook.realloc_ptr != ptr
3870 || hook.realloc_new_size != size2) {
3871 error_msg = "realloc invalid parameters";
3872 goto fail;
3873 }
3874
3875 switch(domain)
3876 {
3877 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3878 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3879 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3880 }
3881
Victor Stinner9ed83c42017-10-31 12:18:10 -07003882 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003883 if (hook.free_ptr != ptr2) {
3884 error_msg = "free invalid pointer";
3885 goto fail;
3886 }
3887
Victor Stinner9ed83c42017-10-31 12:18:10 -07003888 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003889 nelem = 2;
3890 elsize = 5;
3891 switch(domain)
3892 {
3893 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3894 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3895 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3896 default: ptr = NULL; break;
3897 }
3898
3899 if (ptr == NULL) {
3900 error_msg = "calloc failed";
3901 goto fail;
3902 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003903 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003904 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3905 error_msg = "calloc invalid nelem or elsize";
3906 goto fail;
3907 }
3908
Victor Stinner9ed83c42017-10-31 12:18:10 -07003909 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003910 switch(domain)
3911 {
3912 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3913 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3914 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3915 }
3916
Victor Stinner9ed83c42017-10-31 12:18:10 -07003917 CHECK_CTX("calloc free");
3918 if (hook.free_ptr != ptr) {
3919 error_msg = "calloc free invalid pointer";
3920 goto fail;
3921 }
3922
Victor Stinner0507bf52013-07-07 02:05:46 +02003923 Py_INCREF(Py_None);
3924 res = Py_None;
3925 goto finally;
3926
3927fail:
3928 PyErr_SetString(PyExc_RuntimeError, error_msg);
3929
3930finally:
3931 PyMem_SetAllocator(domain, &hook.alloc);
3932 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003933
3934#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003935}
3936
3937static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303938test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003939{
3940 return test_setallocators(PYMEM_DOMAIN_RAW);
3941}
3942
3943static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303944test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003945{
3946 return test_setallocators(PYMEM_DOMAIN_MEM);
3947}
3948
3949static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303950test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003951{
3952 return test_setallocators(PYMEM_DOMAIN_OBJ);
3953}
3954
xdegaye85f64302017-07-01 14:14:45 +02003955/* Most part of the following code is inherited from the pyfailmalloc project
3956 * written by Victor Stinner. */
3957static struct {
3958 int installed;
3959 PyMemAllocatorEx raw;
3960 PyMemAllocatorEx mem;
3961 PyMemAllocatorEx obj;
3962} FmHook;
3963
3964static struct {
3965 int start;
3966 int stop;
3967 Py_ssize_t count;
3968} FmData;
3969
3970static int
3971fm_nomemory(void)
3972{
3973 FmData.count++;
3974 if (FmData.count > FmData.start &&
3975 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3976 return 1;
3977 }
3978 return 0;
3979}
3980
3981static void *
3982hook_fmalloc(void *ctx, size_t size)
3983{
3984 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3985 if (fm_nomemory()) {
3986 return NULL;
3987 }
3988 return alloc->malloc(alloc->ctx, size);
3989}
3990
3991static void *
3992hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3993{
3994 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3995 if (fm_nomemory()) {
3996 return NULL;
3997 }
3998 return alloc->calloc(alloc->ctx, nelem, elsize);
3999}
4000
4001static void *
4002hook_frealloc(void *ctx, void *ptr, size_t new_size)
4003{
4004 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4005 if (fm_nomemory()) {
4006 return NULL;
4007 }
4008 return alloc->realloc(alloc->ctx, ptr, new_size);
4009}
4010
4011static void
4012hook_ffree(void *ctx, void *ptr)
4013{
4014 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4015 alloc->free(alloc->ctx, ptr);
4016}
4017
4018static void
4019fm_setup_hooks(void)
4020{
4021 PyMemAllocatorEx alloc;
4022
4023 if (FmHook.installed) {
4024 return;
4025 }
4026 FmHook.installed = 1;
4027
4028 alloc.malloc = hook_fmalloc;
4029 alloc.calloc = hook_fcalloc;
4030 alloc.realloc = hook_frealloc;
4031 alloc.free = hook_ffree;
4032 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4033 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4034 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4035
4036 alloc.ctx = &FmHook.raw;
4037 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4038
4039 alloc.ctx = &FmHook.mem;
4040 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4041
4042 alloc.ctx = &FmHook.obj;
4043 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4044}
4045
4046static void
4047fm_remove_hooks(void)
4048{
4049 if (FmHook.installed) {
4050 FmHook.installed = 0;
4051 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4052 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4053 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4054 }
4055}
4056
4057static PyObject*
4058set_nomemory(PyObject *self, PyObject *args)
4059{
4060 /* Memory allocation fails after 'start' allocation requests, and until
4061 * 'stop' allocation requests except when 'stop' is negative or equal
4062 * to 0 (default) in which case allocation failures never stop. */
4063 FmData.count = 0;
4064 FmData.stop = 0;
4065 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4066 return NULL;
4067 }
4068 fm_setup_hooks();
4069 Py_RETURN_NONE;
4070}
4071
4072static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304073remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004074{
4075 fm_remove_hooks();
4076 Py_RETURN_NONE;
4077}
4078
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004079PyDoc_STRVAR(docstring_empty,
4080""
4081);
4082
4083PyDoc_STRVAR(docstring_no_signature,
4084"This docstring has no signature."
4085);
4086
4087PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004088"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004089"\n"
4090"This docstring has an invalid signature."
4091);
4092
Larry Hastings2623c8c2014-02-08 22:15:29 -08004093PyDoc_STRVAR(docstring_with_invalid_signature2,
4094"docstring_with_invalid_signature2($module, /, boo)\n"
4095"\n"
4096"--\n"
4097"\n"
4098"This docstring also has an invalid signature."
4099);
4100
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004101PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004102"docstring_with_signature($module, /, sig)\n"
4103"--\n"
4104"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004105"This docstring has a valid signature."
4106);
4107
Zachary Ware8ef887c2015-04-13 18:22:35 -05004108PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4109"docstring_with_signature_but_no_doc($module, /, sig)\n"
4110"--\n"
4111"\n"
4112);
4113
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004114PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004115"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4116"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004117"\n"
4118"\n"
4119"This docstring has a valid signature and some extra newlines."
4120);
4121
Larry Hastings16c51912014-01-07 11:53:01 -08004122PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004123"docstring_with_signature_with_defaults(module, s='avocado',\n"
4124" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4125" local=the_number_three, sys=sys.maxsize,\n"
4126" exp=sys.maxsize - 1)\n"
4127"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004128"\n"
4129"\n"
4130"\n"
4131"This docstring has a valid signature with parameters,\n"
4132"and the parameters take defaults of varying types."
4133);
4134
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004135typedef struct {
4136 PyThread_type_lock start_event;
4137 PyThread_type_lock exit_event;
4138 PyObject *callback;
4139} test_c_thread_t;
4140
4141static void
4142temporary_c_thread(void *data)
4143{
4144 test_c_thread_t *test_c_thread = data;
4145 PyGILState_STATE state;
4146 PyObject *res;
4147
4148 PyThread_release_lock(test_c_thread->start_event);
4149
4150 /* Allocate a Python thread state for this thread */
4151 state = PyGILState_Ensure();
4152
Victor Stinner3466bde2016-09-05 18:16:01 -07004153 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004154 Py_CLEAR(test_c_thread->callback);
4155
4156 if (res == NULL) {
4157 PyErr_Print();
4158 }
4159 else {
4160 Py_DECREF(res);
4161 }
4162
4163 /* Destroy the Python thread state for this thread */
4164 PyGILState_Release(state);
4165
4166 PyThread_release_lock(test_c_thread->exit_event);
4167
4168 PyThread_exit_thread();
4169}
4170
4171static PyObject *
4172call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4173{
4174 PyObject *res = NULL;
4175 test_c_thread_t test_c_thread;
4176 long thread;
4177
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004178 test_c_thread.start_event = PyThread_allocate_lock();
4179 test_c_thread.exit_event = PyThread_allocate_lock();
4180 test_c_thread.callback = NULL;
4181 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4182 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4183 goto exit;
4184 }
4185
4186 Py_INCREF(callback);
4187 test_c_thread.callback = callback;
4188
4189 PyThread_acquire_lock(test_c_thread.start_event, 1);
4190 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4191
4192 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4193 if (thread == -1) {
4194 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4195 PyThread_release_lock(test_c_thread.start_event);
4196 PyThread_release_lock(test_c_thread.exit_event);
4197 goto exit;
4198 }
4199
4200 PyThread_acquire_lock(test_c_thread.start_event, 1);
4201 PyThread_release_lock(test_c_thread.start_event);
4202
4203 Py_BEGIN_ALLOW_THREADS
4204 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4205 PyThread_release_lock(test_c_thread.exit_event);
4206 Py_END_ALLOW_THREADS
4207
4208 Py_INCREF(Py_None);
4209 res = Py_None;
4210
4211exit:
4212 Py_CLEAR(test_c_thread.callback);
4213 if (test_c_thread.start_event)
4214 PyThread_free_lock(test_c_thread.start_event);
4215 if (test_c_thread.exit_event)
4216 PyThread_free_lock(test_c_thread.exit_event);
4217 return res;
4218}
Victor Stinner13105102013-12-13 02:17:29 +01004219
Serhiy Storchakab5181342015-02-06 08:58:56 +02004220/* marshal */
4221
4222static PyObject*
4223pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4224{
4225 long value;
4226 char *filename;
4227 int version;
4228 FILE *fp;
4229
4230 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4231 &value, &filename, &version))
4232 return NULL;
4233
4234 fp = fopen(filename, "wb");
4235 if (fp == NULL) {
4236 PyErr_SetFromErrno(PyExc_OSError);
4237 return NULL;
4238 }
4239
4240 PyMarshal_WriteLongToFile(value, fp, version);
4241
4242 fclose(fp);
4243 if (PyErr_Occurred())
4244 return NULL;
4245 Py_RETURN_NONE;
4246}
4247
4248static PyObject*
4249pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4250{
4251 PyObject *obj;
4252 char *filename;
4253 int version;
4254 FILE *fp;
4255
4256 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4257 &obj, &filename, &version))
4258 return NULL;
4259
4260 fp = fopen(filename, "wb");
4261 if (fp == NULL) {
4262 PyErr_SetFromErrno(PyExc_OSError);
4263 return NULL;
4264 }
4265
4266 PyMarshal_WriteObjectToFile(obj, fp, version);
4267
4268 fclose(fp);
4269 if (PyErr_Occurred())
4270 return NULL;
4271 Py_RETURN_NONE;
4272}
4273
4274static PyObject*
4275pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4276{
4277 int value;
4278 long pos;
4279 char *filename;
4280 FILE *fp;
4281
4282 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4283 return NULL;
4284
4285 fp = fopen(filename, "rb");
4286 if (fp == NULL) {
4287 PyErr_SetFromErrno(PyExc_OSError);
4288 return NULL;
4289 }
4290
4291 value = PyMarshal_ReadShortFromFile(fp);
4292 pos = ftell(fp);
4293
4294 fclose(fp);
4295 if (PyErr_Occurred())
4296 return NULL;
4297 return Py_BuildValue("il", value, pos);
4298}
4299
4300static PyObject*
4301pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4302{
4303 long value, pos;
4304 char *filename;
4305 FILE *fp;
4306
4307 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4308 return NULL;
4309
4310 fp = fopen(filename, "rb");
4311 if (fp == NULL) {
4312 PyErr_SetFromErrno(PyExc_OSError);
4313 return NULL;
4314 }
4315
4316 value = PyMarshal_ReadLongFromFile(fp);
4317 pos = ftell(fp);
4318
4319 fclose(fp);
4320 if (PyErr_Occurred())
4321 return NULL;
4322 return Py_BuildValue("ll", value, pos);
4323}
4324
4325static PyObject*
4326pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4327{
4328 PyObject *obj;
4329 long pos;
4330 char *filename;
4331 FILE *fp;
4332
4333 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4334 return NULL;
4335
4336 fp = fopen(filename, "rb");
4337 if (fp == NULL) {
4338 PyErr_SetFromErrno(PyExc_OSError);
4339 return NULL;
4340 }
4341
4342 obj = PyMarshal_ReadLastObjectFromFile(fp);
4343 pos = ftell(fp);
4344
4345 fclose(fp);
4346 return Py_BuildValue("Nl", obj, pos);
4347}
4348
4349static PyObject*
4350pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4351{
4352 PyObject *obj;
4353 long pos;
4354 char *filename;
4355 FILE *fp;
4356
4357 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4358 return NULL;
4359
4360 fp = fopen(filename, "rb");
4361 if (fp == NULL) {
4362 PyErr_SetFromErrno(PyExc_OSError);
4363 return NULL;
4364 }
4365
4366 obj = PyMarshal_ReadObjectFromFile(fp);
4367 pos = ftell(fp);
4368
4369 fclose(fp);
4370 return Py_BuildValue("Nl", obj, pos);
4371}
4372
Victor Stinnerefde1462015-03-21 15:04:43 +01004373static PyObject*
4374return_null_without_error(PyObject *self, PyObject *args)
4375{
4376 /* invalid call: return NULL without setting an error,
4377 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4378 PyErr_Clear();
4379 return NULL;
4380}
4381
4382static PyObject*
4383return_result_with_error(PyObject *self, PyObject *args)
4384{
4385 /* invalid call: return a result with an error set,
4386 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4387 PyErr_SetNone(PyExc_ValueError);
4388 Py_RETURN_NONE;
4389}
4390
Victor Stinner992c43f2015-03-27 17:12:45 +01004391static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004392test_pytime_fromseconds(PyObject *self, PyObject *args)
4393{
4394 int seconds;
4395 _PyTime_t ts;
4396
4397 if (!PyArg_ParseTuple(args, "i", &seconds))
4398 return NULL;
4399 ts = _PyTime_FromSeconds(seconds);
4400 return _PyTime_AsNanosecondsObject(ts);
4401}
4402
4403static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004404test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4405{
4406 PyObject *obj;
4407 int round;
4408 _PyTime_t ts;
4409
4410 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4411 return NULL;
4412 if (check_time_rounding(round) < 0)
4413 return NULL;
4414 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4415 return NULL;
4416 return _PyTime_AsNanosecondsObject(ts);
4417}
4418
Victor Stinner4bfb4602015-03-27 22:27:24 +01004419static PyObject *
4420test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4421{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004422 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004423 _PyTime_t ts;
4424 double d;
4425
Victor Stinnerc29b5852017-11-02 07:28:27 -07004426 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004427 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004428 }
4429 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4430 return NULL;
4431 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004432 d = _PyTime_AsSecondsDouble(ts);
4433 return PyFloat_FromDouble(d);
4434}
4435
Victor Stinner95e9cef2015-03-28 01:26:47 +01004436static PyObject *
4437test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4438{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004439 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004440 int round;
4441 _PyTime_t t;
4442 struct timeval tv;
4443 PyObject *seconds;
4444
Victor Stinnerc29b5852017-11-02 07:28:27 -07004445 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004446 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004447 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004448 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004449 }
4450 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004451 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004452 }
4453 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4454 return NULL;
4455 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004456
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004457 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004458 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004459 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004460 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004461 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4462}
4463
Victor Stinner34dc0f42015-03-27 18:19:03 +01004464#ifdef HAVE_CLOCK_GETTIME
4465static PyObject *
4466test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4467{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004468 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004469 _PyTime_t t;
4470 struct timespec ts;
4471
Victor Stinnerc29b5852017-11-02 07:28:27 -07004472 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004473 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004474 }
4475 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004476 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004477 }
4478 if (_PyTime_AsTimespec(t, &ts) == -1) {
4479 return NULL;
4480 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004481 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4482}
4483#endif
4484
Victor Stinner62d1c702015-04-01 17:47:07 +02004485static PyObject *
4486test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4487{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004488 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004489 int round;
4490 _PyTime_t t, ms;
4491
Victor Stinnerc29b5852017-11-02 07:28:27 -07004492 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004493 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004494 }
4495 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004496 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004497 }
4498 if (check_time_rounding(round) < 0) {
4499 return NULL;
4500 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004501 ms = _PyTime_AsMilliseconds(t, round);
4502 /* This conversion rely on the fact that _PyTime_t is a number of
4503 nanoseconds */
4504 return _PyTime_AsNanosecondsObject(ms);
4505}
4506
4507static PyObject *
4508test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4509{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004510 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004511 int round;
4512 _PyTime_t t, ms;
4513
Victor Stinnerc29b5852017-11-02 07:28:27 -07004514 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004515 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004516 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004517 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004518 }
4519 if (check_time_rounding(round) < 0) {
4520 return NULL;
4521 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004522 ms = _PyTime_AsMicroseconds(t, round);
4523 /* This conversion rely on the fact that _PyTime_t is a number of
4524 nanoseconds */
4525 return _PyTime_AsNanosecondsObject(ms);
4526}
4527
Victor Stinner50856d52015-10-13 00:11:21 +02004528static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004529pymem_buffer_overflow(PyObject *self, PyObject *args)
4530{
4531 char *buffer;
4532
4533 /* Deliberate buffer overflow to check that PyMem_Free() detects
4534 the overflow when debug hooks are installed. */
4535 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004536 if (buffer == NULL) {
4537 PyErr_NoMemory();
4538 return NULL;
4539 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004540 buffer[16] = 'x';
4541 PyMem_Free(buffer);
4542
4543 Py_RETURN_NONE;
4544}
4545
4546static PyObject*
4547pymem_api_misuse(PyObject *self, PyObject *args)
4548{
4549 char *buffer;
4550
4551 /* Deliberate misusage of Python allocators:
4552 allococate with PyMem but release with PyMem_Raw. */
4553 buffer = PyMem_Malloc(16);
4554 PyMem_RawFree(buffer);
4555
4556 Py_RETURN_NONE;
4557}
4558
Victor Stinnerc4aec362016-03-14 22:26:53 +01004559static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004560pymem_malloc_without_gil(PyObject *self, PyObject *args)
4561{
4562 char *buffer;
4563
4564 /* Deliberate bug to test debug hooks on Python memory allocators:
4565 call PyMem_Malloc() without holding the GIL */
4566 Py_BEGIN_ALLOW_THREADS
4567 buffer = PyMem_Malloc(10);
4568 Py_END_ALLOW_THREADS
4569
4570 PyMem_Free(buffer);
4571
4572 Py_RETURN_NONE;
4573}
4574
Victor Stinner5d39e042017-11-29 17:20:38 +01004575
4576static PyObject*
4577test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4578{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004579 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004580 if (name == NULL) {
4581 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4582 return NULL;
4583 }
4584 return PyUnicode_FromString(name);
4585}
4586
4587
Victor Stinnerad524372016-03-16 12:12:53 +01004588static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004589test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004590{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004591 if (!_PyObject_IsFreed(op)) {
4592 return raiseTestError(test_name, "object is not seen as freed");
4593 }
4594 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004595}
4596
4597
4598static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004599check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4600{
4601 PyObject *op = NULL;
4602 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4603}
4604
4605
4606static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004607check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004608{
4609 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4610 if (op == NULL) {
4611 return NULL;
4612 }
4613 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004614 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004615 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004616 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004617}
4618
4619
4620static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004621check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004622{
4623 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4624 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4625 if (op == NULL) {
4626 return NULL;
4627 }
4628 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004629 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004630 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004631 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004632 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004633}
4634
4635
4636static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004637check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004638{
4639 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4640 if (op == NULL) {
4641 return NULL;
4642 }
4643 Py_TYPE(op)->tp_dealloc(op);
4644 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004645 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004646 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004647 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004648}
4649
4650
4651static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004652pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4653{
4654 char *buffer;
4655
Victor Stinnerad524372016-03-16 12:12:53 +01004656 /* Deliberate bug to test debug hooks on Python memory allocators:
4657 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004658 Py_BEGIN_ALLOW_THREADS
4659 buffer = PyObject_Malloc(10);
4660 Py_END_ALLOW_THREADS
4661
4662 PyObject_Free(buffer);
4663
4664 Py_RETURN_NONE;
4665}
4666
Victor Stinner10b73e12016-03-22 13:39:05 +01004667static PyObject *
4668tracemalloc_track(PyObject *self, PyObject *args)
4669{
4670 unsigned int domain;
4671 PyObject *ptr_obj;
4672 void *ptr;
4673 Py_ssize_t size;
4674 int release_gil = 0;
4675 int res;
4676
4677 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4678 return NULL;
4679 ptr = PyLong_AsVoidPtr(ptr_obj);
4680 if (PyErr_Occurred())
4681 return NULL;
4682
4683 if (release_gil) {
4684 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004685 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004686 Py_END_ALLOW_THREADS
4687 }
4688 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004689 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004690 }
4691
4692 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004693 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004694 return NULL;
4695 }
4696
4697 Py_RETURN_NONE;
4698}
4699
4700static PyObject *
4701tracemalloc_untrack(PyObject *self, PyObject *args)
4702{
4703 unsigned int domain;
4704 PyObject *ptr_obj;
4705 void *ptr;
4706 int res;
4707
4708 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4709 return NULL;
4710 ptr = PyLong_AsVoidPtr(ptr_obj);
4711 if (PyErr_Occurred())
4712 return NULL;
4713
Victor Stinner5ea4c062017-06-20 17:46:36 +02004714 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004715 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004716 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004717 return NULL;
4718 }
4719
4720 Py_RETURN_NONE;
4721}
4722
4723static PyObject *
4724tracemalloc_get_traceback(PyObject *self, PyObject *args)
4725{
4726 unsigned int domain;
4727 PyObject *ptr_obj;
4728 void *ptr;
4729
4730 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4731 return NULL;
4732 ptr = PyLong_AsVoidPtr(ptr_obj);
4733 if (PyErr_Occurred())
4734 return NULL;
4735
Benjamin Petersonca470632016-09-06 13:47:26 -07004736 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004737}
4738
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004739static PyObject *
4740dict_get_version(PyObject *self, PyObject *args)
4741{
4742 PyDictObject *dict;
4743 uint64_t version;
4744
4745 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4746 return NULL;
4747
4748 version = dict->ma_version_tag;
4749
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004750 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4751 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004752}
4753
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004754
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004755static PyObject *
4756raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4757{
4758 PyGenObject *gen;
4759
4760 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4761 return NULL;
4762
4763 /* This is used in a test to check what happens if a signal arrives just
4764 as we're in the process of entering a yield from chain (see
4765 bpo-30039).
4766
4767 Needs to be done in C, because:
4768 - we don't have a Python wrapper for raise()
4769 - we need to make sure that the Python-level signal handler doesn't run
4770 *before* we enter the generator frame, which is impossible in Python
4771 because we check for signals before every bytecode operation.
4772 */
4773 raise(SIGINT);
4774 return _PyGen_Send(gen, Py_None);
4775}
4776
4777
Victor Stinner3b5cf852017-06-09 16:48:45 +02004778static int
4779fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4780{
4781 if (args == Py_None) {
4782 *stack = NULL;
4783 *nargs = 0;
4784 }
4785 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004786 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004787 *nargs = PyTuple_GET_SIZE(args);
4788 }
4789 else {
4790 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4791 return -1;
4792 }
4793 return 0;
4794}
4795
4796
4797static PyObject *
4798test_pyobject_fastcall(PyObject *self, PyObject *args)
4799{
4800 PyObject *func, *func_args;
4801 PyObject **stack;
4802 Py_ssize_t nargs;
4803
4804 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4805 return NULL;
4806 }
4807
4808 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4809 return NULL;
4810 }
4811 return _PyObject_FastCall(func, stack, nargs);
4812}
4813
4814
4815static PyObject *
4816test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4817{
4818 PyObject *func, *func_args, *kwargs;
4819 PyObject **stack;
4820 Py_ssize_t nargs;
4821
4822 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4823 return NULL;
4824 }
4825
4826 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4827 return NULL;
4828 }
4829
4830 if (kwargs == Py_None) {
4831 kwargs = NULL;
4832 }
4833 else if (!PyDict_Check(kwargs)) {
4834 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4835 return NULL;
4836 }
4837
Petr Viktorinffd97532020-02-11 17:46:57 +01004838 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004839}
4840
4841
4842static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004843test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004844{
4845 PyObject *func, *func_args, *kwnames = NULL;
4846 PyObject **stack;
4847 Py_ssize_t nargs, nkw;
4848
4849 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4850 return NULL;
4851 }
4852
4853 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4854 return NULL;
4855 }
4856
4857 if (kwnames == Py_None) {
4858 kwnames = NULL;
4859 }
4860 else if (PyTuple_Check(kwnames)) {
4861 nkw = PyTuple_GET_SIZE(kwnames);
4862 if (nargs < nkw) {
4863 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4864 return NULL;
4865 }
4866 nargs -= nkw;
4867 }
4868 else {
4869 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4870 return NULL;
4871 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004872 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004873}
4874
4875
4876static PyObject *
4877test_pyvectorcall_call(PyObject *self, PyObject *args)
4878{
4879 PyObject *func;
4880 PyObject *argstuple;
4881 PyObject *kwargs = NULL;
4882
4883 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4884 return NULL;
4885 }
4886
4887 if (!PyTuple_Check(argstuple)) {
4888 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4889 return NULL;
4890 }
4891 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4892 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4893 return NULL;
4894 }
4895
4896 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004897}
4898
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004899
Victor Stinner64fa4492017-07-10 14:37:49 +02004900static PyObject*
4901stack_pointer(PyObject *self, PyObject *args)
4902{
4903 int v = 5;
4904 return PyLong_FromVoidPtr(&v);
4905}
4906
Victor Stinner3b5cf852017-06-09 16:48:45 +02004907
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004908#ifdef W_STOPCODE
4909static PyObject*
4910py_w_stopcode(PyObject *self, PyObject *args)
4911{
4912 int sig, status;
4913 if (!PyArg_ParseTuple(args, "i", &sig)) {
4914 return NULL;
4915 }
4916 status = W_STOPCODE(sig);
4917 return PyLong_FromLong(status);
4918}
4919#endif
4920
4921
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004922static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004923get_mapping_keys(PyObject* self, PyObject *obj)
4924{
4925 return PyMapping_Keys(obj);
4926}
4927
4928static PyObject *
4929get_mapping_values(PyObject* self, PyObject *obj)
4930{
4931 return PyMapping_Values(obj);
4932}
4933
4934static PyObject *
4935get_mapping_items(PyObject* self, PyObject *obj)
4936{
4937 return PyMapping_Items(obj);
4938}
4939
4940
4941static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004942test_pythread_tss_key_state(PyObject *self, PyObject *args)
4943{
4944 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4945 if (PyThread_tss_is_created(&tss_key)) {
4946 return raiseTestError("test_pythread_tss_key_state",
4947 "TSS key not in an uninitialized state at "
4948 "creation time");
4949 }
4950 if (PyThread_tss_create(&tss_key) != 0) {
4951 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4952 return NULL;
4953 }
4954 if (!PyThread_tss_is_created(&tss_key)) {
4955 return raiseTestError("test_pythread_tss_key_state",
4956 "PyThread_tss_create succeeded, "
4957 "but with TSS key in an uninitialized state");
4958 }
4959 if (PyThread_tss_create(&tss_key) != 0) {
4960 return raiseTestError("test_pythread_tss_key_state",
4961 "PyThread_tss_create unsuccessful with "
4962 "an already initialized key");
4963 }
4964#define CHECK_TSS_API(expr) \
4965 (void)(expr); \
4966 if (!PyThread_tss_is_created(&tss_key)) { \
4967 return raiseTestError("test_pythread_tss_key_state", \
4968 "TSS key initialization state was not " \
4969 "preserved after calling " #expr); }
4970 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4971 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4972#undef CHECK_TSS_API
4973 PyThread_tss_delete(&tss_key);
4974 if (PyThread_tss_is_created(&tss_key)) {
4975 return raiseTestError("test_pythread_tss_key_state",
4976 "PyThread_tss_delete called, but did not "
4977 "set the key state to uninitialized");
4978 }
4979
4980 Py_tss_t *ptr_key = PyThread_tss_alloc();
4981 if (ptr_key == NULL) {
4982 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4983 return NULL;
4984 }
4985 if (PyThread_tss_is_created(ptr_key)) {
4986 return raiseTestError("test_pythread_tss_key_state",
4987 "TSS key not in an uninitialized state at "
4988 "allocation time");
4989 }
4990 PyThread_tss_free(ptr_key);
4991 ptr_key = NULL;
4992 Py_RETURN_NONE;
4993}
4994
4995
Yury Selivanovf23746a2018-01-22 19:11:18 -05004996static PyObject*
4997new_hamt(PyObject *self, PyObject *args)
4998{
4999 return _PyContext_NewHamtForTests();
5000}
5001
5002
jdemeyer5a306202018-10-19 23:50:06 +02005003/* def bad_get(self, obj, cls):
5004 cls()
5005 return repr(self)
5006*/
5007static PyObject*
5008bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5009{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005010 PyObject *self, *obj, *cls;
5011 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005012 return NULL;
5013 }
5014
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005015 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005016 if (res == NULL) {
5017 return NULL;
5018 }
5019 Py_DECREF(res);
5020
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005021 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005022}
5023
5024
Victor Stinner3d4226a2018-08-29 22:21:32 +02005025static PyObject *
5026encode_locale_ex(PyObject *self, PyObject *args)
5027{
5028 PyObject *unicode;
5029 int current_locale = 0;
5030 wchar_t *wstr;
5031 PyObject *res = NULL;
5032 const char *errors = NULL;
5033
5034 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5035 return NULL;
5036 }
5037 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5038 if (wstr == NULL) {
5039 return NULL;
5040 }
5041 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5042
5043 char *str = NULL;
5044 size_t error_pos;
5045 const char *reason = NULL;
5046 int ret = _Py_EncodeLocaleEx(wstr,
5047 &str, &error_pos, &reason,
5048 current_locale, error_handler);
5049 PyMem_Free(wstr);
5050
5051 switch(ret) {
5052 case 0:
5053 res = PyBytes_FromString(str);
5054 PyMem_RawFree(str);
5055 break;
5056 case -1:
5057 PyErr_NoMemory();
5058 break;
5059 case -2:
5060 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5061 error_pos, reason);
5062 break;
5063 case -3:
5064 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5065 break;
5066 default:
5067 PyErr_SetString(PyExc_ValueError, "unknow error code");
5068 break;
5069 }
5070 return res;
5071}
5072
5073
5074static PyObject *
5075decode_locale_ex(PyObject *self, PyObject *args)
5076{
5077 char *str;
5078 int current_locale = 0;
5079 PyObject *res = NULL;
5080 const char *errors = NULL;
5081
5082 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5083 return NULL;
5084 }
5085 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5086
5087 wchar_t *wstr = NULL;
5088 size_t wlen = 0;
5089 const char *reason = NULL;
5090 int ret = _Py_DecodeLocaleEx(str,
5091 &wstr, &wlen, &reason,
5092 current_locale, error_handler);
5093
5094 switch(ret) {
5095 case 0:
5096 res = PyUnicode_FromWideChar(wstr, wlen);
5097 PyMem_RawFree(wstr);
5098 break;
5099 case -1:
5100 PyErr_NoMemory();
5101 break;
5102 case -2:
5103 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5104 wlen, reason);
5105 break;
5106 case -3:
5107 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5108 break;
5109 default:
5110 PyErr_SetString(PyExc_ValueError, "unknow error code");
5111 break;
5112 }
5113 return res;
5114}
5115
5116
Victor Stinner18618e652018-10-25 17:28:11 +02005117#ifdef Py_REF_DEBUG
5118static PyObject *
5119negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5120{
5121 PyObject *obj = PyUnicode_FromString("negative_refcount");
5122 if (obj == NULL) {
5123 return NULL;
5124 }
5125 assert(Py_REFCNT(obj) == 1);
5126
Victor Stinnerc86a1122020-02-07 01:24:29 +01005127 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005128 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5129 Py_DECREF(obj);
5130
5131 Py_RETURN_NONE;
5132}
5133#endif
5134
5135
Victor Stinneref9d9b62019-05-22 11:28:22 +02005136static PyObject*
5137test_write_unraisable_exc(PyObject *self, PyObject *args)
5138{
Victor Stinner71c52e32019-05-27 08:57:14 +02005139 PyObject *exc, *err_msg, *obj;
5140 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005141 return NULL;
5142 }
5143
Victor Stinner71c52e32019-05-27 08:57:14 +02005144 const char *err_msg_utf8;
5145 if (err_msg != Py_None) {
5146 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5147 if (err_msg_utf8 == NULL) {
5148 return NULL;
5149 }
5150 }
5151 else {
5152 err_msg_utf8 = NULL;
5153 }
5154
Victor Stinneref9d9b62019-05-22 11:28:22 +02005155 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005156 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005157 Py_RETURN_NONE;
5158}
5159
5160
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005161static PyObject *
5162sequence_getitem(PyObject *self, PyObject *args)
5163{
5164 PyObject *seq;
5165 Py_ssize_t i;
5166 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5167 return NULL;
5168 }
5169 return PySequence_GetItem(seq, i);
5170}
5171
5172
Petr Viktorinf9583772019-09-10 12:21:09 +01005173/* Functions for testing C calling conventions (METH_*) are named meth_*,
5174 * e.g. "meth_varargs" for METH_VARARGS.
5175 *
5176 * They all return a tuple of their C-level arguments, with None instead
5177 * of NULL and Python tuples instead of C arrays.
5178 */
5179
5180
5181static PyObject*
5182_null_to_none(PyObject* obj)
5183{
5184 if (obj == NULL) {
5185 Py_RETURN_NONE;
5186 }
5187 Py_INCREF(obj);
5188 return obj;
5189}
5190
5191static PyObject*
5192meth_varargs(PyObject* self, PyObject* args)
5193{
5194 return Py_BuildValue("NO", _null_to_none(self), args);
5195}
5196
5197static PyObject*
5198meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5199{
5200 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5201}
5202
5203static PyObject*
5204meth_o(PyObject* self, PyObject* obj)
5205{
5206 return Py_BuildValue("NO", _null_to_none(self), obj);
5207}
5208
5209static PyObject*
5210meth_noargs(PyObject* self, PyObject* ignored)
5211{
5212 return _null_to_none(self);
5213}
5214
5215static PyObject*
5216_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5217{
5218 PyObject *tuple = PyTuple_New(nargs);
5219 if (tuple == NULL) {
5220 return NULL;
5221 }
5222 for (Py_ssize_t i=0; i < nargs; i++) {
5223 Py_INCREF(args[i]);
5224 PyTuple_SET_ITEM(tuple, i, args[i]);
5225 }
5226 return tuple;
5227}
5228
5229static PyObject*
5230meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5231{
5232 return Py_BuildValue(
5233 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5234 );
5235}
5236
5237static PyObject*
5238meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5239 Py_ssize_t nargs, PyObject* kwargs)
5240{
5241 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5242 if (pyargs == NULL) {
5243 return NULL;
5244 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005245 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005246 args + nargs, 0, kwargs);
5247 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5248}
5249
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005250
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005251static PyObject*
5252pynumber_tobase(PyObject *module, PyObject *args)
5253{
5254 PyObject *obj;
5255 int base;
5256 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5257 &obj, &base)) {
5258 return NULL;
5259 }
5260 return PyNumber_ToBase(obj, base);
5261}
5262
5263
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005264static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5265
Tim Peters9ea17ac2001-02-02 05:57:15 +00005266static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305268 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005269 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305270 {"test_config", test_config, METH_NOARGS},
5271 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005272 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005273 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5274 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5275 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5276 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5277 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5278 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005279 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005280 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005281 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5282 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5283 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5284 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5285 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5286 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005287 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5288 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005289 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5290 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5291 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5292 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305293 {"test_list_api", test_list_api, METH_NOARGS},
5294 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005295 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005296 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305297 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5298 {"test_long_api", test_long_api, METH_NOARGS},
5299 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5300 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5301 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5302 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005303 {"test_structseq_newtype_doesnt_leak",
5304 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305305 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5306 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5307 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5308 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005309 {"test_long_as_unsigned_long_long_mask",
5310 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305311 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5312 {"test_k_code", test_k_code, METH_NOARGS},
5313 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005314 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305315 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305317 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305319 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5320 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5321 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005323 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005324#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005325 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005326#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005327 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005328 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005329 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005330 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005331 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005332 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005334 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005336 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005337 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005338 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005339 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005340 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 {"getargs_b", getargs_b, METH_VARARGS},
5342 {"getargs_B", getargs_B, METH_VARARGS},
5343 {"getargs_h", getargs_h, METH_VARARGS},
5344 {"getargs_H", getargs_H, METH_VARARGS},
5345 {"getargs_I", getargs_I, METH_VARARGS},
5346 {"getargs_k", getargs_k, METH_VARARGS},
5347 {"getargs_i", getargs_i, METH_VARARGS},
5348 {"getargs_l", getargs_l, METH_VARARGS},
5349 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005350 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 {"getargs_L", getargs_L, METH_VARARGS},
5352 {"getargs_K", getargs_K, METH_VARARGS},
5353 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305354 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5355 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005356 {"getargs_f", getargs_f, METH_VARARGS},
5357 {"getargs_d", getargs_d, METH_VARARGS},
5358 {"getargs_D", getargs_D, METH_VARARGS},
5359 {"getargs_S", getargs_S, METH_VARARGS},
5360 {"getargs_Y", getargs_Y, METH_VARARGS},
5361 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005362 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005363 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005364 {"getargs_s", getargs_s, METH_VARARGS},
5365 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5366 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5367 {"getargs_z", getargs_z, METH_VARARGS},
5368 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5369 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5370 {"getargs_y", getargs_y, METH_VARARGS},
5371 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5372 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5373 {"getargs_u", getargs_u, METH_VARARGS},
5374 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5375 {"getargs_Z", getargs_Z, METH_VARARGS},
5376 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005377 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005378 {"getargs_es", getargs_es, METH_VARARGS},
5379 {"getargs_et", getargs_et, METH_VARARGS},
5380 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5381 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005383 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005385 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305386 {"test_s_code", test_s_code, METH_NOARGS},
5387 {"test_u_code", test_u_code, METH_NOARGS},
5388 {"test_Z_code", test_Z_code, METH_NOARGS},
5389 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005390 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5391 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005392 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005393 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5394 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005395 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005396 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005397 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5398 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005399 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005400 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005402#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005403 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005404#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005405 {"traceback_print", traceback_print, METH_VARARGS},
5406 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005407 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005408 {"argparsing", argparsing, METH_VARARGS},
5409 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005410 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305412 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005413 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305414 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005415 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005416 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5417 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005418 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005419 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005420 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305421 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5422 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5423 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5424 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005425 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5426 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305427 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005428 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005429 {"no_docstring",
5430 (PyCFunction)test_with_docstring, METH_NOARGS},
5431 {"docstring_empty",
5432 (PyCFunction)test_with_docstring, METH_NOARGS,
5433 docstring_empty},
5434 {"docstring_no_signature",
5435 (PyCFunction)test_with_docstring, METH_NOARGS,
5436 docstring_no_signature},
5437 {"docstring_with_invalid_signature",
5438 (PyCFunction)test_with_docstring, METH_NOARGS,
5439 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005440 {"docstring_with_invalid_signature2",
5441 (PyCFunction)test_with_docstring, METH_NOARGS,
5442 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005443 {"docstring_with_signature",
5444 (PyCFunction)test_with_docstring, METH_NOARGS,
5445 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005446 {"docstring_with_signature_but_no_doc",
5447 (PyCFunction)test_with_docstring, METH_NOARGS,
5448 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005449 {"docstring_with_signature_and_extra_newlines",
5450 (PyCFunction)test_with_docstring, METH_NOARGS,
5451 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005452 {"docstring_with_signature_with_defaults",
5453 (PyCFunction)test_with_docstring, METH_NOARGS,
5454 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005455 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5456 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005457 {"pymarshal_write_long_to_file",
5458 pymarshal_write_long_to_file, METH_VARARGS},
5459 {"pymarshal_write_object_to_file",
5460 pymarshal_write_object_to_file, METH_VARARGS},
5461 {"pymarshal_read_short_from_file",
5462 pymarshal_read_short_from_file, METH_VARARGS},
5463 {"pymarshal_read_long_from_file",
5464 pymarshal_read_long_from_file, METH_VARARGS},
5465 {"pymarshal_read_last_object_from_file",
5466 pymarshal_read_last_object_from_file, METH_VARARGS},
5467 {"pymarshal_read_object_from_file",
5468 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005469 {"return_null_without_error",
5470 return_null_without_error, METH_NOARGS},
5471 {"return_result_with_error",
5472 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005473 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005474 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5475 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005476 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005477#ifdef HAVE_CLOCK_GETTIME
5478 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5479#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005480 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5481 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005482 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5483 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005484 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005485 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005486 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005487 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5488 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5489 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005490 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005491 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5492 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5493 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005494 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005495 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005496 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5497 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005498 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5499 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005500 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005501#ifdef W_STOPCODE
5502 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5503#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005504 {"get_mapping_keys", get_mapping_keys, METH_O},
5505 {"get_mapping_values", get_mapping_values, METH_O},
5506 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005507 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005508 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005509 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005510 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5511 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005512#ifdef Py_REF_DEBUG
5513 {"negative_refcount", negative_refcount, METH_NOARGS},
5514#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005515 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005516 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005517 {"meth_varargs", meth_varargs, METH_VARARGS},
5518 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5519 {"meth_o", meth_o, METH_O},
5520 {"meth_noargs", meth_noargs, METH_NOARGS},
5521 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5522 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005523 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005525};
5526
Thomas Hellera4ea6032003-04-17 18:55:45 +00005527#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5528
Thomas Wouters89f507f2006-12-13 04:49:30 +00005529typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 char bool_member;
5531 char byte_member;
5532 unsigned char ubyte_member;
5533 short short_member;
5534 unsigned short ushort_member;
5535 int int_member;
5536 unsigned int uint_member;
5537 long long_member;
5538 unsigned long ulong_member;
5539 Py_ssize_t pyssizet_member;
5540 float float_member;
5541 double double_member;
5542 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005543 long long longlong_member;
5544 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005545} all_structmembers;
5546
5547typedef struct {
5548 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005550} test_structmembers;
5551
5552static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5554 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5555 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5556 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5557 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5558 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5559 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5560 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5561 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5562 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5563 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5564 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5565 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5567 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005569};
5570
5571
Christian Heimes1af737c2008-01-23 08:24:23 +00005572static PyObject *
5573test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 static char *keywords[] = {
5576 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5577 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5578 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005581 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 test_structmembers *ob;
5583 const char *s = NULL;
5584 Py_ssize_t string_len = 0;
5585 ob = PyObject_New(test_structmembers, type);
5586 if (ob == NULL)
5587 return NULL;
5588 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5589 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5590 &ob->structmembers.bool_member,
5591 &ob->structmembers.byte_member,
5592 &ob->structmembers.ubyte_member,
5593 &ob->structmembers.short_member,
5594 &ob->structmembers.ushort_member,
5595 &ob->structmembers.int_member,
5596 &ob->structmembers.uint_member,
5597 &ob->structmembers.long_member,
5598 &ob->structmembers.ulong_member,
5599 &ob->structmembers.pyssizet_member,
5600 &ob->structmembers.float_member,
5601 &ob->structmembers.double_member,
5602 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 , &ob->structmembers.longlong_member,
5604 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 )) {
5606 Py_DECREF(ob);
5607 return NULL;
5608 }
5609 if (s != NULL) {
5610 if (string_len > 5) {
5611 Py_DECREF(ob);
5612 PyErr_SetString(PyExc_ValueError, "string too long");
5613 return NULL;
5614 }
5615 strcpy(ob->structmembers.inplace_member, s);
5616 }
5617 else {
5618 strcpy(ob->structmembers.inplace_member, "");
5619 }
5620 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005621}
5622
Christian Heimes1af737c2008-01-23 08:24:23 +00005623static void
5624test_structmembers_free(PyObject *ob)
5625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005627}
5628
5629static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005630 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 "test_structmembersType",
5632 sizeof(test_structmembers), /* tp_basicsize */
5633 0, /* tp_itemsize */
5634 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005635 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 0, /* tp_getattr */
5637 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005638 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 0, /* tp_repr */
5640 0, /* tp_as_number */
5641 0, /* tp_as_sequence */
5642 0, /* tp_as_mapping */
5643 0, /* tp_hash */
5644 0, /* tp_call */
5645 0, /* tp_str */
5646 PyObject_GenericGetAttr, /* tp_getattro */
5647 PyObject_GenericSetAttr, /* tp_setattro */
5648 0, /* tp_as_buffer */
5649 0, /* tp_flags */
5650 "Type containing all structmember types",
5651 0, /* traverseproc tp_traverse */
5652 0, /* tp_clear */
5653 0, /* tp_richcompare */
5654 0, /* tp_weaklistoffset */
5655 0, /* tp_iter */
5656 0, /* tp_iternext */
5657 0, /* tp_methods */
5658 test_members, /* tp_members */
5659 0,
5660 0,
5661 0,
5662 0,
5663 0,
5664 0,
5665 0,
5666 0,
5667 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005668};
5669
5670
Benjamin Petersond51374e2014-04-09 23:55:56 -04005671typedef struct {
5672 PyObject_HEAD
5673} matmulObject;
5674
5675static PyObject *
5676matmulType_matmul(PyObject *self, PyObject *other)
5677{
5678 return Py_BuildValue("(sOO)", "matmul", self, other);
5679}
5680
5681static PyObject *
5682matmulType_imatmul(PyObject *self, PyObject *other)
5683{
5684 return Py_BuildValue("(sOO)", "imatmul", self, other);
5685}
5686
5687static void
5688matmulType_dealloc(PyObject *self)
5689{
Zachary Ware420dc562014-04-23 13:51:27 -05005690 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005691}
5692
5693static PyNumberMethods matmulType_as_number = {
5694 0, /* nb_add */
5695 0, /* nb_subtract */
5696 0, /* nb_multiply */
5697 0, /* nb_remainde r*/
5698 0, /* nb_divmod */
5699 0, /* nb_power */
5700 0, /* nb_negative */
5701 0, /* tp_positive */
5702 0, /* tp_absolute */
5703 0, /* tp_bool */
5704 0, /* nb_invert */
5705 0, /* nb_lshift */
5706 0, /* nb_rshift */
5707 0, /* nb_and */
5708 0, /* nb_xor */
5709 0, /* nb_or */
5710 0, /* nb_int */
5711 0, /* nb_reserved */
5712 0, /* nb_float */
5713 0, /* nb_inplace_add */
5714 0, /* nb_inplace_subtract */
5715 0, /* nb_inplace_multiply */
5716 0, /* nb_inplace_remainder */
5717 0, /* nb_inplace_power */
5718 0, /* nb_inplace_lshift */
5719 0, /* nb_inplace_rshift */
5720 0, /* nb_inplace_and */
5721 0, /* nb_inplace_xor */
5722 0, /* nb_inplace_or */
5723 0, /* nb_floor_divide */
5724 0, /* nb_true_divide */
5725 0, /* nb_inplace_floor_divide */
5726 0, /* nb_inplace_true_divide */
5727 0, /* nb_index */
5728 matmulType_matmul, /* nb_matrix_multiply */
5729 matmulType_imatmul /* nb_matrix_inplace_multiply */
5730};
5731
5732static PyTypeObject matmulType = {
5733 PyVarObject_HEAD_INIT(NULL, 0)
5734 "matmulType",
5735 sizeof(matmulObject), /* tp_basicsize */
5736 0, /* tp_itemsize */
5737 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005738 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005739 0, /* tp_getattr */
5740 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005741 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005742 0, /* tp_repr */
5743 &matmulType_as_number, /* tp_as_number */
5744 0, /* tp_as_sequence */
5745 0, /* tp_as_mapping */
5746 0, /* tp_hash */
5747 0, /* tp_call */
5748 0, /* tp_str */
5749 PyObject_GenericGetAttr, /* tp_getattro */
5750 PyObject_GenericSetAttr, /* tp_setattro */
5751 0, /* tp_as_buffer */
5752 0, /* tp_flags */
5753 "C level type with matrix operations defined",
5754 0, /* traverseproc tp_traverse */
5755 0, /* tp_clear */
5756 0, /* tp_richcompare */
5757 0, /* tp_weaklistoffset */
5758 0, /* tp_iter */
5759 0, /* tp_iternext */
5760 0, /* tp_methods */
5761 0, /* tp_members */
5762 0,
5763 0,
5764 0,
5765 0,
5766 0,
5767 0,
5768 0,
5769 0,
5770 PyType_GenericNew, /* tp_new */
5771 PyObject_Del, /* tp_free */
5772};
5773
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005774typedef struct {
5775 PyObject_HEAD
5776} ipowObject;
5777
5778static PyObject *
5779ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5780{
5781 return Py_BuildValue("OO", other, mod);
5782}
5783
5784static PyNumberMethods ipowType_as_number = {
5785 .nb_inplace_power = ipowType_ipow
5786};
5787
5788static PyTypeObject ipowType = {
5789 PyVarObject_HEAD_INIT(NULL, 0)
5790 .tp_name = "ipowType",
5791 .tp_basicsize = sizeof(ipowObject),
5792 .tp_as_number = &ipowType_as_number,
5793 .tp_new = PyType_GenericNew
5794};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005795
Yury Selivanov75445082015-05-11 22:57:16 -04005796typedef struct {
5797 PyObject_HEAD
5798 PyObject *ao_iterator;
5799} awaitObject;
5800
5801
5802static PyObject *
5803awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5804{
5805 PyObject *v;
5806 awaitObject *ao;
5807
5808 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5809 return NULL;
5810
5811 ao = (awaitObject *)type->tp_alloc(type, 0);
5812 if (ao == NULL) {
5813 return NULL;
5814 }
5815
5816 Py_INCREF(v);
5817 ao->ao_iterator = v;
5818
5819 return (PyObject *)ao;
5820}
5821
5822
5823static void
5824awaitObject_dealloc(awaitObject *ao)
5825{
5826 Py_CLEAR(ao->ao_iterator);
5827 Py_TYPE(ao)->tp_free(ao);
5828}
5829
5830
5831static PyObject *
5832awaitObject_await(awaitObject *ao)
5833{
5834 Py_INCREF(ao->ao_iterator);
5835 return ao->ao_iterator;
5836}
5837
5838static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005839 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005840 0, /* am_aiter */
5841 0 /* am_anext */
5842};
5843
5844
5845static PyTypeObject awaitType = {
5846 PyVarObject_HEAD_INIT(NULL, 0)
5847 "awaitType",
5848 sizeof(awaitObject), /* tp_basicsize */
5849 0, /* tp_itemsize */
5850 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005851 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005852 0, /* tp_getattr */
5853 0, /* tp_setattr */
5854 &awaitType_as_async, /* tp_as_async */
5855 0, /* tp_repr */
5856 0, /* tp_as_number */
5857 0, /* tp_as_sequence */
5858 0, /* tp_as_mapping */
5859 0, /* tp_hash */
5860 0, /* tp_call */
5861 0, /* tp_str */
5862 PyObject_GenericGetAttr, /* tp_getattro */
5863 PyObject_GenericSetAttr, /* tp_setattro */
5864 0, /* tp_as_buffer */
5865 0, /* tp_flags */
5866 "C level type with tp_as_async",
5867 0, /* traverseproc tp_traverse */
5868 0, /* tp_clear */
5869 0, /* tp_richcompare */
5870 0, /* tp_weaklistoffset */
5871 0, /* tp_iter */
5872 0, /* tp_iternext */
5873 0, /* tp_methods */
5874 0, /* tp_members */
5875 0,
5876 0,
5877 0,
5878 0,
5879 0,
5880 0,
5881 0,
5882 0,
5883 awaitObject_new, /* tp_new */
5884 PyObject_Del, /* tp_free */
5885};
5886
5887
xdegaye56d1f5c2017-10-26 15:09:06 +02005888static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5889
5890static PyTypeObject PyRecursingInfinitelyError_Type = {
5891 PyVarObject_HEAD_INIT(NULL, 0)
5892 "RecursingInfinitelyError", /* tp_name */
5893 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5894 0, /* tp_itemsize */
5895 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005896 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005897 0, /* tp_getattr */
5898 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005899 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005900 0, /* tp_repr */
5901 0, /* tp_as_number */
5902 0, /* tp_as_sequence */
5903 0, /* tp_as_mapping */
5904 0, /* tp_hash */
5905 0, /* tp_call */
5906 0, /* tp_str */
5907 0, /* tp_getattro */
5908 0, /* tp_setattro */
5909 0, /* tp_as_buffer */
5910 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5911 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5912 0, /* tp_traverse */
5913 0, /* tp_clear */
5914 0, /* tp_richcompare */
5915 0, /* tp_weaklistoffset */
5916 0, /* tp_iter */
5917 0, /* tp_iternext */
5918 0, /* tp_methods */
5919 0, /* tp_members */
5920 0, /* tp_getset */
5921 0, /* tp_base */
5922 0, /* tp_dict */
5923 0, /* tp_descr_get */
5924 0, /* tp_descr_set */
5925 0, /* tp_dictoffset */
5926 (initproc)recurse_infinitely_error_init, /* tp_init */
5927 0, /* tp_alloc */
5928 0, /* tp_new */
5929};
5930
5931static int
5932recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5933{
5934 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5935
5936 /* Instantiating this exception starts infinite recursion. */
5937 Py_INCREF(type);
5938 PyErr_SetObject(type, NULL);
5939 return -1;
5940}
5941
5942
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005943/* Test bpo-35983: create a subclass of "list" which checks that instances
5944 * are not deallocated twice */
5945
5946typedef struct {
5947 PyListObject list;
5948 int deallocated;
5949} MyListObject;
5950
5951static PyObject *
5952MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5953{
5954 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5955 ((MyListObject*)op)->deallocated = 0;
5956 return op;
5957}
5958
5959void
5960MyList_dealloc(MyListObject* op)
5961{
5962 if (op->deallocated) {
5963 /* We cannot raise exceptions here but we still want the testsuite
5964 * to fail when we hit this */
5965 Py_FatalError("MyList instance deallocated twice");
5966 }
5967 op->deallocated = 1;
5968 PyList_Type.tp_dealloc((PyObject *)op);
5969}
5970
5971static PyTypeObject MyList_Type = {
5972 PyVarObject_HEAD_INIT(NULL, 0)
5973 "MyList",
5974 sizeof(MyListObject),
5975 0,
5976 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005977 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005978 0, /* tp_getattr */
5979 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005980 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005981 0, /* tp_repr */
5982 0, /* tp_as_number */
5983 0, /* tp_as_sequence */
5984 0, /* tp_as_mapping */
5985 0, /* tp_hash */
5986 0, /* tp_call */
5987 0, /* tp_str */
5988 0, /* tp_getattro */
5989 0, /* tp_setattro */
5990 0, /* tp_as_buffer */
5991 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5992 0, /* tp_doc */
5993 0, /* tp_traverse */
5994 0, /* tp_clear */
5995 0, /* tp_richcompare */
5996 0, /* tp_weaklistoffset */
5997 0, /* tp_iter */
5998 0, /* tp_iternext */
5999 0, /* tp_methods */
6000 0, /* tp_members */
6001 0, /* tp_getset */
6002 0, /* &PyList_Type */ /* tp_base */
6003 0, /* tp_dict */
6004 0, /* tp_descr_get */
6005 0, /* tp_descr_set */
6006 0, /* tp_dictoffset */
6007 0, /* tp_init */
6008 0, /* tp_alloc */
6009 MyList_new, /* tp_new */
6010};
6011
6012
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006013/* Test PEP 560 */
6014
6015typedef struct {
6016 PyObject_HEAD
6017 PyObject *item;
6018} PyGenericAliasObject;
6019
6020static void
6021generic_alias_dealloc(PyGenericAliasObject *self)
6022{
6023 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006024 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006025}
6026
6027static PyObject *
6028generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6029{
6030 return PyTuple_Pack(1, self->item);
6031}
6032
6033static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006034 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006035 {NULL} /* sentinel */
6036};
6037
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006038static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006039 PyVarObject_HEAD_INIT(NULL, 0)
6040 "GenericAlias",
6041 sizeof(PyGenericAliasObject),
6042 0,
6043 .tp_dealloc = (destructor)generic_alias_dealloc,
6044 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6045 .tp_methods = generic_alias_methods,
6046};
6047
6048static PyObject *
6049generic_alias_new(PyObject *item)
6050{
6051 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6052 if (o == NULL) {
6053 return NULL;
6054 }
6055 Py_INCREF(item);
6056 o->item = item;
6057 return (PyObject*) o;
6058}
6059
6060typedef struct {
6061 PyObject_HEAD
6062} PyGenericObject;
6063
6064static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006065generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006066{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006067 return generic_alias_new(item);
6068}
6069
6070static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006071 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006072 {NULL} /* sentinel */
6073};
6074
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006075static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006076 PyVarObject_HEAD_INIT(NULL, 0)
6077 "Generic",
6078 sizeof(PyGenericObject),
6079 0,
6080 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6081 .tp_methods = generic_methods,
6082};
6083
6084
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006085/* Test PEP 590 */
6086
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006087typedef struct {
6088 PyObject_HEAD
6089 vectorcallfunc vectorcall;
6090} MethodDescriptorObject;
6091
6092static PyObject *
6093MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6094 size_t nargsf, PyObject *kwnames)
6095{
6096 /* True if using the vectorcall function in MethodDescriptorObject
6097 * but False for MethodDescriptor2Object */
6098 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6099 return PyBool_FromLong(md->vectorcall != NULL);
6100}
6101
6102static PyObject *
6103MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6104{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006105 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006106 op->vectorcall = MethodDescriptor_vectorcall;
6107 return (PyObject *)op;
6108}
6109
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006110static PyObject *
6111func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6112{
6113 if (obj == Py_None || obj == NULL) {
6114 Py_INCREF(func);
6115 return func;
6116 }
6117 return PyMethod_New(func, obj);
6118}
6119
6120static PyObject *
6121nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6122{
6123 Py_INCREF(func);
6124 return func;
6125}
6126
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006127static PyObject *
6128call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6129{
6130 Py_INCREF(args);
6131 return args;
6132}
6133
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006134static PyTypeObject MethodDescriptorBase_Type = {
6135 PyVarObject_HEAD_INIT(NULL, 0)
6136 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006137 sizeof(MethodDescriptorObject),
6138 .tp_new = MethodDescriptor_new,
6139 .tp_call = PyVectorcall_Call,
6140 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6141 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006142 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006143 .tp_descr_get = func_descr_get,
6144};
6145
6146static PyTypeObject MethodDescriptorDerived_Type = {
6147 PyVarObject_HEAD_INIT(NULL, 0)
6148 "MethodDescriptorDerived",
6149 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6150};
6151
6152static PyTypeObject MethodDescriptorNopGet_Type = {
6153 PyVarObject_HEAD_INIT(NULL, 0)
6154 "MethodDescriptorNopGet",
6155 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006156 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006157 .tp_descr_get = nop_descr_get,
6158};
6159
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006160typedef struct {
6161 MethodDescriptorObject base;
6162 vectorcallfunc vectorcall;
6163} MethodDescriptor2Object;
6164
6165static PyObject *
6166MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6167{
6168 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6169 op->base.vectorcall = NULL;
6170 op->vectorcall = MethodDescriptor_vectorcall;
6171 return (PyObject *)op;
6172}
6173
6174static PyTypeObject MethodDescriptor2_Type = {
6175 PyVarObject_HEAD_INIT(NULL, 0)
6176 "MethodDescriptor2",
6177 sizeof(MethodDescriptor2Object),
6178 .tp_new = MethodDescriptor2_new,
6179 .tp_call = PyVectorcall_Call,
6180 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006181 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006182};
6183
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006184PyDoc_STRVAR(heapgctype__doc__,
6185"A heap type with GC, and with overridden dealloc.\n\n"
6186"The 'value' attribute is set to 10 in __init__.");
6187
6188typedef struct {
6189 PyObject_HEAD
6190 int value;
6191} HeapCTypeObject;
6192
6193static struct PyMemberDef heapctype_members[] = {
6194 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6195 {NULL} /* Sentinel */
6196};
6197
6198static int
6199heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6200{
6201 ((HeapCTypeObject *)self)->value = 10;
6202 return 0;
6203}
6204
6205static void
6206heapgcctype_dealloc(HeapCTypeObject *self)
6207{
6208 PyTypeObject *tp = Py_TYPE(self);
6209 PyObject_GC_UnTrack(self);
6210 PyObject_GC_Del(self);
6211 Py_DECREF(tp);
6212}
6213
6214static PyType_Slot HeapGcCType_slots[] = {
6215 {Py_tp_init, heapctype_init},
6216 {Py_tp_members, heapctype_members},
6217 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006218 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006219 {0, 0},
6220};
6221
6222static PyType_Spec HeapGcCType_spec = {
6223 "_testcapi.HeapGcCType",
6224 sizeof(HeapCTypeObject),
6225 0,
6226 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6227 HeapGcCType_slots
6228};
6229
6230PyDoc_STRVAR(heapctype__doc__,
6231"A heap type without GC, but with overridden dealloc.\n\n"
6232"The 'value' attribute is set to 10 in __init__.");
6233
6234static void
6235heapctype_dealloc(HeapCTypeObject *self)
6236{
6237 PyTypeObject *tp = Py_TYPE(self);
6238 PyObject_Del(self);
6239 Py_DECREF(tp);
6240}
6241
6242static PyType_Slot HeapCType_slots[] = {
6243 {Py_tp_init, heapctype_init},
6244 {Py_tp_members, heapctype_members},
6245 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006246 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006247 {0, 0},
6248};
6249
6250static PyType_Spec HeapCType_spec = {
6251 "_testcapi.HeapCType",
6252 sizeof(HeapCTypeObject),
6253 0,
6254 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6255 HeapCType_slots
6256};
6257
6258PyDoc_STRVAR(heapctypesubclass__doc__,
6259"Subclass of HeapCType, without GC.\n\n"
6260"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6261
6262typedef struct {
6263 HeapCTypeObject base;
6264 int value2;
6265} HeapCTypeSubclassObject;
6266
6267static int
6268heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6269{
6270 /* Call __init__ of the superclass */
6271 if (heapctype_init(self, args, kwargs) < 0) {
6272 return -1;
6273 }
6274 /* Initialize additional element */
6275 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6276 return 0;
6277}
6278
6279static struct PyMemberDef heapctypesubclass_members[] = {
6280 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6281 {NULL} /* Sentinel */
6282};
6283
6284static PyType_Slot HeapCTypeSubclass_slots[] = {
6285 {Py_tp_init, heapctypesubclass_init},
6286 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006287 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006288 {0, 0},
6289};
6290
6291static PyType_Spec HeapCTypeSubclass_spec = {
6292 "_testcapi.HeapCTypeSubclass",
6293 sizeof(HeapCTypeSubclassObject),
6294 0,
6295 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6296 HeapCTypeSubclass_slots
6297};
6298
6299PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6300"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6301"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6302"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6303
6304static int
6305heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6306{
6307 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6308 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6309 base_init(self, args, kwargs);
6310 return 0;
6311}
6312
6313static void
6314heapctypesubclasswithfinalizer_finalize(PyObject *self)
6315{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006316 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006317 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006318
6319 /* Save the current exception, if any. */
6320 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6321
6322 m = PyState_FindModule(&_testcapimodule);
6323 if (m == NULL) {
6324 goto cleanup_finalize;
6325 }
6326 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6327 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6328 if (oldtype == NULL || newtype == NULL) {
6329 goto cleanup_finalize;
6330 }
6331
6332 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6333 goto cleanup_finalize;
6334 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006335 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6336 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006337 goto cleanup_finalize;
6338 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006339 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6340 goto cleanup_finalize;
6341 }
6342 Py_DECREF(refcnt);
6343 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6344 if (refcnt == NULL) {
6345 goto cleanup_finalize;
6346 }
6347 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006348 goto cleanup_finalize;
6349 }
6350
6351cleanup_finalize:
6352 Py_XDECREF(oldtype);
6353 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006354 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006355
6356 /* Restore the saved exception. */
6357 PyErr_Restore(error_type, error_value, error_traceback);
6358}
6359
6360static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6361 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6362 {Py_tp_members, heapctypesubclass_members},
6363 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006364 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006365 {0, 0},
6366};
6367
6368static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6369 "_testcapi.HeapCTypeSubclassWithFinalizer",
6370 sizeof(HeapCTypeSubclassObject),
6371 0,
6372 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6373 HeapCTypeSubclassWithFinalizer_slots
6374};
6375
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006376typedef struct {
6377 PyObject_HEAD
6378 PyObject *dict;
6379} HeapCTypeWithDictObject;
6380
6381static void
6382heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6383{
6384
6385 PyTypeObject *tp = Py_TYPE(self);
6386 Py_XDECREF(self->dict);
6387 PyObject_DEL(self);
6388 Py_DECREF(tp);
6389}
6390
6391static PyGetSetDef heapctypewithdict_getsetlist[] = {
6392 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6393 {NULL} /* Sentinel */
6394};
6395
6396static struct PyMemberDef heapctypewithdict_members[] = {
6397 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6398 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6399 {NULL} /* Sentinel */
6400};
6401
6402static PyType_Slot HeapCTypeWithDict_slots[] = {
6403 {Py_tp_members, heapctypewithdict_members},
6404 {Py_tp_getset, heapctypewithdict_getsetlist},
6405 {Py_tp_dealloc, heapctypewithdict_dealloc},
6406 {0, 0},
6407};
6408
6409static PyType_Spec HeapCTypeWithDict_spec = {
6410 "_testcapi.HeapCTypeWithDict",
6411 sizeof(HeapCTypeWithDictObject),
6412 0,
6413 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6414 HeapCTypeWithDict_slots
6415};
6416
6417static struct PyMemberDef heapctypewithnegativedict_members[] = {
6418 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006419 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006420 {NULL} /* Sentinel */
6421};
6422
6423static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6424 {Py_tp_members, heapctypewithnegativedict_members},
6425 {Py_tp_getset, heapctypewithdict_getsetlist},
6426 {Py_tp_dealloc, heapctypewithdict_dealloc},
6427 {0, 0},
6428};
6429
6430static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6431 "_testcapi.HeapCTypeWithNegativeDict",
6432 sizeof(HeapCTypeWithDictObject),
6433 0,
6434 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6435 HeapCTypeWithNegativeDict_slots
6436};
6437
6438typedef struct {
6439 PyObject_HEAD
6440 PyObject *weakreflist;
6441} HeapCTypeWithWeakrefObject;
6442
6443static struct PyMemberDef heapctypewithweakref_members[] = {
6444 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6445 {"__weaklistoffset__", T_PYSSIZET,
6446 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6447 {NULL} /* Sentinel */
6448};
6449
6450static void
6451heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6452{
6453
6454 PyTypeObject *tp = Py_TYPE(self);
6455 if (self->weakreflist != NULL)
6456 PyObject_ClearWeakRefs((PyObject *) self);
6457 Py_XDECREF(self->weakreflist);
6458 PyObject_DEL(self);
6459 Py_DECREF(tp);
6460}
6461
6462static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6463 {Py_tp_members, heapctypewithweakref_members},
6464 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6465 {0, 0},
6466};
6467
6468static PyType_Spec HeapCTypeWithWeakref_spec = {
6469 "_testcapi.HeapCTypeWithWeakref",
6470 sizeof(HeapCTypeWithWeakrefObject),
6471 0,
6472 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6473 HeapCTypeWithWeakref_slots
6474};
6475
Petr Viktorinf9583772019-09-10 12:21:09 +01006476static PyMethodDef meth_instance_methods[] = {
6477 {"meth_varargs", meth_varargs, METH_VARARGS},
6478 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6479 {"meth_o", meth_o, METH_O},
6480 {"meth_noargs", meth_noargs, METH_NOARGS},
6481 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6482 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6483 {NULL, NULL} /* sentinel */
6484};
6485
6486
6487static PyTypeObject MethInstance_Type = {
6488 PyVarObject_HEAD_INIT(NULL, 0)
6489 "MethInstance",
6490 sizeof(PyObject),
6491 .tp_new = PyType_GenericNew,
6492 .tp_flags = Py_TPFLAGS_DEFAULT,
6493 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006494 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006495 "Class with normal (instance) methods to test calling conventions"),
6496};
6497
6498static PyMethodDef meth_class_methods[] = {
6499 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6500 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6501 {"meth_o", meth_o, METH_O|METH_CLASS},
6502 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6503 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6504 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6505 {NULL, NULL} /* sentinel */
6506};
6507
6508
6509static PyTypeObject MethClass_Type = {
6510 PyVarObject_HEAD_INIT(NULL, 0)
6511 "MethClass",
6512 sizeof(PyObject),
6513 .tp_new = PyType_GenericNew,
6514 .tp_flags = Py_TPFLAGS_DEFAULT,
6515 .tp_methods = meth_class_methods,
6516 .tp_doc = PyDoc_STR(
6517 "Class with class methods to test calling conventions"),
6518};
6519
6520static PyMethodDef meth_static_methods[] = {
6521 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6522 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6523 {"meth_o", meth_o, METH_O|METH_STATIC},
6524 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6525 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6526 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6527 {NULL, NULL} /* sentinel */
6528};
6529
6530
6531static PyTypeObject MethStatic_Type = {
6532 PyVarObject_HEAD_INIT(NULL, 0)
6533 "MethStatic",
6534 sizeof(PyObject),
6535 .tp_new = PyType_GenericNew,
6536 .tp_flags = Py_TPFLAGS_DEFAULT,
6537 .tp_methods = meth_static_methods,
6538 .tp_doc = PyDoc_STR(
6539 "Class with static methods to test calling conventions"),
6540};
6541
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006542/* ContainerNoGC -- a simple container without GC methods */
6543
6544typedef struct {
6545 PyObject_HEAD
6546 PyObject *value;
6547} ContainerNoGCobject;
6548
6549static PyObject *
6550ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6551{
6552 PyObject *value;
6553 char *names[] = {"value", NULL};
6554 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6555 return NULL;
6556 }
6557 PyObject *self = type->tp_alloc(type, 0);
6558 if (self == NULL) {
6559 return NULL;
6560 }
6561 Py_INCREF(value);
6562 ((ContainerNoGCobject *)self)->value = value;
6563 return self;
6564}
6565
6566static void
6567ContainerNoGC_dealloc(ContainerNoGCobject *self)
6568{
6569 Py_DECREF(self->value);
6570 Py_TYPE(self)->tp_free((PyObject *)self);
6571}
6572
6573static PyMemberDef ContainerNoGC_members[] = {
6574 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6575 PyDoc_STR("a container value for test purposes")},
6576 {0}
6577};
6578
6579static PyTypeObject ContainerNoGC_type = {
6580 PyVarObject_HEAD_INIT(NULL, 0)
6581 "_testcapi.ContainerNoGC",
6582 sizeof(ContainerNoGCobject),
6583 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
6584 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6585 .tp_members = ContainerNoGC_members,
6586 .tp_new = ContainerNoGC_new,
6587};
6588
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006589
Martin v. Löwis1a214512008-06-11 05:26:20 +00006590static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyModuleDef_HEAD_INIT,
6592 "_testcapi",
6593 NULL,
6594 -1,
6595 TestMethods,
6596 NULL,
6597 NULL,
6598 NULL,
6599 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006600};
6601
Nick Coghland5cacbb2015-05-23 22:24:10 +10006602/* Per PEP 489, this module will not be converted to multi-phase initialization
6603 */
6604
Mark Hammond62b1ab12002-07-23 06:31:15 +00006605PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006606PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 m = PyModule_Create(&_testcapimodule);
6611 if (m == NULL)
6612 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006613
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006614 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006615
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006616 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 Py_INCREF(&test_structmembersType);
6618 /* don't use a name starting with "test", since we don't want
6619 test_capi to automatically call this */
6620 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006621 if (PyType_Ready(&matmulType) < 0)
6622 return NULL;
6623 Py_INCREF(&matmulType);
6624 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006625 if (PyType_Ready(&ipowType) < 0) {
6626 return NULL;
6627 }
6628 Py_INCREF(&ipowType);
6629 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006630
Yury Selivanov75445082015-05-11 22:57:16 -04006631 if (PyType_Ready(&awaitType) < 0)
6632 return NULL;
6633 Py_INCREF(&awaitType);
6634 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6635
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006636 MyList_Type.tp_base = &PyList_Type;
6637 if (PyType_Ready(&MyList_Type) < 0)
6638 return NULL;
6639 Py_INCREF(&MyList_Type);
6640 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6641
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006642 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6643 return NULL;
6644 Py_INCREF(&MethodDescriptorBase_Type);
6645 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6646
6647 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6648 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6649 return NULL;
6650 Py_INCREF(&MethodDescriptorDerived_Type);
6651 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6652
6653 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6654 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6655 return NULL;
6656 Py_INCREF(&MethodDescriptorNopGet_Type);
6657 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6658
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006659 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6660 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6661 return NULL;
6662 Py_INCREF(&MethodDescriptor2_Type);
6663 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6664
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006665 if (PyType_Ready(&GenericAlias_Type) < 0)
6666 return NULL;
6667 Py_INCREF(&GenericAlias_Type);
6668 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6669
6670 if (PyType_Ready(&Generic_Type) < 0)
6671 return NULL;
6672 Py_INCREF(&Generic_Type);
6673 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6674
Petr Viktorinf9583772019-09-10 12:21:09 +01006675 if (PyType_Ready(&MethInstance_Type) < 0)
6676 return NULL;
6677 Py_INCREF(&MethInstance_Type);
6678 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
6679
6680 if (PyType_Ready(&MethClass_Type) < 0)
6681 return NULL;
6682 Py_INCREF(&MethClass_Type);
6683 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
6684
6685 if (PyType_Ready(&MethStatic_Type) < 0)
6686 return NULL;
6687 Py_INCREF(&MethStatic_Type);
6688 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
6689
xdegaye56d1f5c2017-10-26 15:09:06 +02006690 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6691 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6692 return NULL;
6693 }
6694 Py_INCREF(&PyRecursingInfinitelyError_Type);
6695 PyModule_AddObject(m, "RecursingInfinitelyError",
6696 (PyObject *)&PyRecursingInfinitelyError_Type);
6697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6699 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6700 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6701 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6702 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6703 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6704 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6705 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6706 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6707 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6708 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6709 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6710 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6711 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6712 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6713 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05006714 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
6715 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
6716 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6718 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
6719 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02006720 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 Py_INCREF(&PyInstanceMethod_Type);
6722 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006723
Larry Hastings2a727912014-01-16 11:32:01 -08006724 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01006725 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01006726#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01006727 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01006728#else
Victor Stinner310e2d22019-11-22 10:58:00 +01006729 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01006730#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01006731 Py_INCREF(v);
6732 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08006733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6735 Py_INCREF(TestError);
6736 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006737
6738 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
6739 if (HeapGcCType == NULL) {
6740 return NULL;
6741 }
6742 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
6743
6744 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
6745 if (HeapCType == NULL) {
6746 return NULL;
6747 }
6748 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
6749 if (subclass_bases == NULL) {
6750 return NULL;
6751 }
6752 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
6753 if (HeapCTypeSubclass == NULL) {
6754 return NULL;
6755 }
6756 Py_DECREF(subclass_bases);
6757 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
6758
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006759 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
6760 if (HeapCTypeWithDict == NULL) {
6761 return NULL;
6762 }
6763 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
6764
6765 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
6766 if (HeapCTypeWithNegativeDict == NULL) {
6767 return NULL;
6768 }
6769 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
6770
6771 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
6772 if (HeapCTypeWithWeakref == NULL) {
6773 return NULL;
6774 }
6775 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
6776
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006777 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
6778 if (subclass_with_finalizer_bases == NULL) {
6779 return NULL;
6780 }
6781 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
6782 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
6783 if (HeapCTypeSubclassWithFinalizer == NULL) {
6784 return NULL;
6785 }
6786 Py_DECREF(subclass_with_finalizer_bases);
6787 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
6788
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006789 if (PyType_Ready(&ContainerNoGC_type) < 0) {
6790 return NULL;
6791 }
6792 Py_INCREF(&ContainerNoGC_type);
6793 if (PyModule_AddObject(m, "ContainerNoGC",
6794 (PyObject *) &ContainerNoGC_type) < 0)
6795 return NULL;
6796
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006797 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006799}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006800
6801
6802/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
6803
6804#undef Py_BuildValue
6805PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
6806
6807static PyObject *
6808test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
6809{
6810 PyObject *res;
6811 const char str[] = "string";
6812 const Py_UNICODE unicode[] = L"unicode";
6813 PyErr_SetNone(PyExc_ZeroDivisionError);
6814
6815 res = Py_BuildValue("(s#O)", str, 1, Py_None);
6816 assert(res == NULL);
6817 if (!PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
6818 return NULL;
6819 }
6820 res = Py_BuildValue("(z#O)", str, 1, Py_None);
6821 assert(res == NULL);
6822 if (!PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
6823 return NULL;
6824 }
6825 res = Py_BuildValue("(y#O)", str, 1, Py_None);
6826 assert(res == NULL);
6827 if (!PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
6828 return NULL;
6829 }
6830 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
6831 assert(res == NULL);
6832 if (!PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
6833 return NULL;
6834 }
6835
6836 PyErr_Clear();
6837 Py_RETURN_NONE;
6838}