2 * C Extension module to test Python interpreter C APIs.
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.
8 #define PY_SSIZE_T_CLEAN
12 #include "structmember.h"
16 #endif /* WITH_THREAD */
17 static PyObject
*TestError
; /* set to exception object in init */
19 /* Raise TestError with test_name + ": " + msg, and return NULL. */
22 raiseTestError(const char* test_name
, const char* msg
)
26 if (strlen(test_name
) + strlen(msg
) > sizeof(buf
) - 50)
27 PyErr_SetString(TestError
, "internal error msg too large");
29 PyOS_snprintf(buf
, sizeof(buf
), "%s: %s", test_name
, msg
);
30 PyErr_SetString(TestError
, buf
);
35 /* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
37 The ones derived from autoconf on the UNIX-like OSes can be relied
38 upon (in the absence of sloppy cross-compiling), but the Windows
39 platforms have these hardcoded. Better safe than sorry.
42 sizeof_error(const char* fatname
, const char* typname
,
43 int expected
, int got
)
46 PyOS_snprintf(buf
, sizeof(buf
),
47 "%.200s #define == %d but sizeof(%.200s) == %d",
48 fatname
, expected
, typname
, got
);
49 PyErr_SetString(TestError
, buf
);
50 return (PyObject
*)NULL
;
54 test_config(PyObject
*self
)
56 #define CHECK_SIZEOF(FATNAME, TYPE) \
57 if (FATNAME != sizeof(TYPE)) \
58 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
60 CHECK_SIZEOF(SIZEOF_SHORT
, short);
61 CHECK_SIZEOF(SIZEOF_INT
, int);
62 CHECK_SIZEOF(SIZEOF_LONG
, long);
63 CHECK_SIZEOF(SIZEOF_VOID_P
, void*);
64 CHECK_SIZEOF(SIZEOF_TIME_T
, time_t);
66 CHECK_SIZEOF(SIZEOF_LONG_LONG
, PY_LONG_LONG
);
76 test_list_api(PyObject
*self
)
81 /* SF bug 132008: PyList_Reverse segfaults */
83 list
= PyList_New(NLIST
);
84 if (list
== (PyObject
*)NULL
)
85 return (PyObject
*)NULL
;
86 /* list = range(NLIST) */
87 for (i
= 0; i
< NLIST
; ++i
) {
88 PyObject
* anint
= PyLong_FromLong(i
);
89 if (anint
== (PyObject
*)NULL
) {
91 return (PyObject
*)NULL
;
93 PyList_SET_ITEM(list
, i
, anint
);
95 /* list.reverse(), via PyList_Reverse() */
96 i
= PyList_Reverse(list
); /* should not blow up! */
99 return (PyObject
*)NULL
;
101 /* Check that list == range(29, -1, -1) now */
102 for (i
= 0; i
< NLIST
; ++i
) {
103 PyObject
* anint
= PyList_GET_ITEM(list
, i
);
104 if (PyLong_AS_LONG(anint
) != NLIST
-1-i
) {
105 PyErr_SetString(TestError
,
106 "test_list_api: reverse screwed up");
108 return (PyObject
*)NULL
;
119 test_dict_inner(int count
)
121 Py_ssize_t pos
= 0, iterations
= 0;
123 PyObject
*dict
= PyDict_New();
129 for (i
= 0; i
< count
; i
++) {
130 v
= PyLong_FromLong(i
);
131 PyDict_SetItem(dict
, v
, v
);
135 while (PyDict_Next(dict
, &pos
, &k
, &v
)) {
139 i
= PyLong_AS_LONG(v
) + 1;
140 o
= PyLong_FromLong(i
);
143 if (PyDict_SetItem(dict
, k
, o
) < 0) {
152 if (iterations
!= count
) {
155 "test_dict_iteration: dict iteration went wrong ");
163 test_dict_iteration(PyObject
* self
)
167 for (i
= 0; i
< 200; i
++) {
168 if (test_dict_inner(i
) < 0) {
178 /* Issue #4701: Check that PyObject_Hash implicitly calls
179 * PyType_Ready if it hasn't already been called
181 static PyTypeObject _HashInheritanceTester_Type
= {
182 PyVarObject_HEAD_INIT(NULL
, 0)
183 "hashinheritancetester", /* Name of this type */
184 sizeof(PyObject
), /* Basic object size */
185 0, /* Item size for varobject */
186 (destructor
)PyObject_Del
, /* tp_dealloc */
192 0, /* tp_as_number */
193 0, /* tp_as_sequence */
194 0, /* tp_as_mapping */
198 PyObject_GenericGetAttr
, /* tp_getattro */
200 0, /* tp_as_buffer */
201 Py_TPFLAGS_DEFAULT
, /* tp_flags */
205 0, /* tp_richcompare */
206 0, /* tp_weaklistoffset */
214 0, /* tp_descr_get */
215 0, /* tp_descr_set */
216 0, /* tp_dictoffset */
219 PyType_GenericNew
, /* tp_new */
223 test_lazy_hash_inheritance(PyObject
* self
)
229 type
= &_HashInheritanceTester_Type
;
230 obj
= PyObject_New(PyObject
, type
);
235 "test_lazy_hash_inheritance: failed to create object");
239 if (type
->tp_dict
!= NULL
) {
242 "test_lazy_hash_inheritance: type initialised too soon");
247 hash
= PyObject_Hash(obj
);
248 if ((hash
== -1) && PyErr_Occurred()) {
252 "test_lazy_hash_inheritance: could not hash object");
257 if (type
->tp_dict
== NULL
) {
260 "test_lazy_hash_inheritance: type not initialised by hash()");
265 if (type
->tp_hash
!= PyType_Type
.tp_hash
) {
268 "test_lazy_hash_inheritance: unexpected hash function");
277 /* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
278 PyLong_{As, From}{Unsigned,}LongLong().
280 Note that the meat of the test is contained in testcapi_long.h.
281 This is revolting, but delicate code duplication is worse: "almost
282 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
283 dependence on type names makes it impossible to use a parameterized
284 function. A giant macro would be even worse than this. A C++ template
287 The "report an error" functions are deliberately not part of the #include
288 file: if the test fails, you can set a breakpoint in the appropriate
289 error function directly, and crawl back from there in the debugger.
292 #define UNBIND(X) Py_DECREF(X); (X) = NULL
295 raise_test_long_error(const char* msg
)
297 return raiseTestError("test_long_api", msg
);
300 #define TESTNAME test_long_api_inner
301 #define TYPENAME long
302 #define F_S_TO_PY PyLong_FromLong
303 #define F_PY_TO_S PyLong_AsLong
304 #define F_U_TO_PY PyLong_FromUnsignedLong
305 #define F_PY_TO_U PyLong_AsUnsignedLong
307 #include "testcapi_long.h"
310 test_long_api(PyObject
* self
)
312 return TESTNAME(raise_test_long_error
);
322 #ifdef HAVE_LONG_LONG
325 raise_test_longlong_error(const char* msg
)
327 return raiseTestError("test_longlong_api", msg
);
330 #define TESTNAME test_longlong_api_inner
331 #define TYPENAME PY_LONG_LONG
332 #define F_S_TO_PY PyLong_FromLongLong
333 #define F_PY_TO_S PyLong_AsLongLong
334 #define F_U_TO_PY PyLong_FromUnsignedLongLong
335 #define F_PY_TO_U PyLong_AsUnsignedLongLong
337 #include "testcapi_long.h"
340 test_longlong_api(PyObject
* self
, PyObject
*args
)
342 return TESTNAME(raise_test_longlong_error
);
352 /* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
353 for both long and int arguments. The test may leak a little memory if
357 test_L_code(PyObject
*self
)
359 PyObject
*tuple
, *num
;
362 tuple
= PyTuple_New(1);
366 num
= PyLong_FromLong(42);
370 PyTuple_SET_ITEM(tuple
, 0, num
);
373 if (PyArg_ParseTuple(tuple
, "L:test_L_code", &value
) < 0)
376 return raiseTestError("test_L_code",
377 "L code returned wrong value for long 42");
380 num
= PyLong_FromLong(42);
384 PyTuple_SET_ITEM(tuple
, 0, num
);
387 if (PyArg_ParseTuple(tuple
, "L:test_L_code", &value
) < 0)
390 return raiseTestError("test_L_code",
391 "L code returned wrong value for int 42");
398 #endif /* ifdef HAVE_LONG_LONG */
400 /* Test tuple argument processing */
402 getargs_tuple(PyObject
*self
, PyObject
*args
)
405 if (!PyArg_ParseTuple(args
, "i(ii)", &a
, &b
, &c
))
407 return Py_BuildValue("iii", a
, b
, c
);
410 /* test PyArg_ParseTupleAndKeywords */
411 static PyObject
*getargs_keywords(PyObject
*self
, PyObject
*args
, PyObject
*kwargs
)
413 static char *keywords
[] = {"arg1","arg2","arg3","arg4","arg5", NULL
};
414 static char *fmt
="(ii)i|(i(ii))(iii)i";
415 int int_args
[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
417 if (!PyArg_ParseTupleAndKeywords(args
, kwargs
, fmt
, keywords
,
418 &int_args
[0], &int_args
[1], &int_args
[2], &int_args
[3], &int_args
[4],
419 &int_args
[5], &int_args
[6], &int_args
[7], &int_args
[8], &int_args
[9]))
421 return Py_BuildValue("iiiiiiiiii",
422 int_args
[0], int_args
[1], int_args
[2], int_args
[3], int_args
[4],
423 int_args
[5], int_args
[6], int_args
[7], int_args
[8], int_args
[9]);
426 /* Functions to call PyArg_ParseTuple with integer format codes,
427 and return the result.
430 getargs_b(PyObject
*self
, PyObject
*args
)
433 if (!PyArg_ParseTuple(args
, "b", &value
))
435 return PyLong_FromUnsignedLong((unsigned long)value
);
439 getargs_B(PyObject
*self
, PyObject
*args
)
442 if (!PyArg_ParseTuple(args
, "B", &value
))
444 return PyLong_FromUnsignedLong((unsigned long)value
);
448 getargs_H(PyObject
*self
, PyObject
*args
)
450 unsigned short value
;
451 if (!PyArg_ParseTuple(args
, "H", &value
))
453 return PyLong_FromUnsignedLong((unsigned long)value
);
457 getargs_I(PyObject
*self
, PyObject
*args
)
460 if (!PyArg_ParseTuple(args
, "I", &value
))
462 return PyLong_FromUnsignedLong((unsigned long)value
);
466 getargs_k(PyObject
*self
, PyObject
*args
)
469 if (!PyArg_ParseTuple(args
, "k", &value
))
471 return PyLong_FromUnsignedLong(value
);
475 getargs_i(PyObject
*self
, PyObject
*args
)
478 if (!PyArg_ParseTuple(args
, "i", &value
))
480 return PyLong_FromLong((long)value
);
484 getargs_l(PyObject
*self
, PyObject
*args
)
487 if (!PyArg_ParseTuple(args
, "l", &value
))
489 return PyLong_FromLong(value
);
493 getargs_n(PyObject
*self
, PyObject
*args
)
496 if (!PyArg_ParseTuple(args
, "n", &value
))
498 return PyLong_FromSsize_t(value
);
501 #ifdef HAVE_LONG_LONG
503 getargs_L(PyObject
*self
, PyObject
*args
)
506 if (!PyArg_ParseTuple(args
, "L", &value
))
508 return PyLong_FromLongLong(value
);
512 getargs_K(PyObject
*self
, PyObject
*args
)
514 unsigned PY_LONG_LONG value
;
515 if (!PyArg_ParseTuple(args
, "K", &value
))
517 return PyLong_FromUnsignedLongLong(value
);
521 /* This function not only tests the 'k' getargs code, but also the
522 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
524 test_k_code(PyObject
*self
)
526 PyObject
*tuple
, *num
;
529 tuple
= PyTuple_New(1);
533 /* a number larger than ULONG_MAX even on 64-bit platforms */
534 num
= PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL
, 16);
538 value
= PyLong_AsUnsignedLongMask(num
);
539 if (value
!= ULONG_MAX
)
540 return raiseTestError("test_k_code",
541 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
543 PyTuple_SET_ITEM(tuple
, 0, num
);
546 if (PyArg_ParseTuple(tuple
, "k:test_k_code", &value
) < 0)
548 if (value
!= ULONG_MAX
)
549 return raiseTestError("test_k_code",
550 "k code returned wrong value for long 0xFFF...FFF");
553 num
= PyLong_FromString("-FFFFFFFF000000000000000042", NULL
, 16);
557 value
= PyLong_AsUnsignedLongMask(num
);
558 if (value
!= (unsigned long)-0x42)
559 return raiseTestError("test_k_code",
560 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
562 PyTuple_SET_ITEM(tuple
, 0, num
);
565 if (PyArg_ParseTuple(tuple
, "k:test_k_code", &value
) < 0)
567 if (value
!= (unsigned long)-0x42)
568 return raiseTestError("test_k_code",
569 "k code returned wrong value for long -0xFFF..000042");
577 /* Test the s and z codes for PyArg_ParseTuple.
580 test_s_code(PyObject
*self
)
582 /* Unicode strings should be accepted */
583 PyObject
*tuple
, *obj
;
586 tuple
= PyTuple_New(1);
590 obj
= PyUnicode_Decode("t\xeate", strlen("t\xeate"),
595 PyTuple_SET_ITEM(tuple
, 0, obj
);
597 /* These two blocks used to raise a TypeError:
598 * "argument must be string without null bytes, not str"
600 if (PyArg_ParseTuple(tuple
, "s:test_s_code1", &value
) < 0)
603 if (PyArg_ParseTuple(tuple
, "z:test_s_code2", &value
) < 0)
610 static volatile int x
;
612 /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
616 test_u_code(PyObject
*self
)
618 PyObject
*tuple
, *obj
;
623 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
624 /* Just use the macro and check that it compiles */
625 x
= Py_UNICODE_ISSPACE(25);
627 tuple
= PyTuple_New(1);
631 obj
= PyUnicode_Decode("test", strlen("test"),
636 PyTuple_SET_ITEM(tuple
, 0, obj
);
639 if (PyArg_ParseTuple(tuple
, "u:test_u_code", &value
) < 0)
641 if (value
!= PyUnicode_AS_UNICODE(obj
))
642 return raiseTestError("test_u_code",
643 "u code returned wrong value for u'test'");
645 if (PyArg_ParseTuple(tuple
, "u#:test_u_code", &value
, &len
) < 0)
647 if (value
!= PyUnicode_AS_UNICODE(obj
) ||
648 len
!= PyUnicode_GET_SIZE(obj
))
649 return raiseTestError("test_u_code",
650 "u# code returned wrong values for u'test'");
657 /* Test Z and Z# codes for PyArg_ParseTuple */
659 test_Z_code(PyObject
*self
)
661 PyObject
*tuple
, *obj
;
662 Py_UNICODE
*value1
, *value2
;
663 Py_ssize_t len1
, len2
;
665 tuple
= PyTuple_New(2);
669 obj
= PyUnicode_FromString("test");
670 PyTuple_SET_ITEM(tuple
, 0, obj
);
672 PyTuple_SET_ITEM(tuple
, 1, Py_None
);
674 /* swap values on purpose */
676 value2
= PyUnicode_AS_UNICODE(obj
);
678 /* Test Z for both values */
679 if (PyArg_ParseTuple(tuple
, "ZZ:test_Z_code", &value1
, &value2
) < 0)
681 if (value1
!= PyUnicode_AS_UNICODE(obj
))
682 return raiseTestError("test_Z_code",
683 "Z code returned wrong value for 'test'");
685 return raiseTestError("test_Z_code",
686 "Z code returned wrong value for None");
689 value2
= PyUnicode_AS_UNICODE(obj
);
693 /* Test Z# for both values */
694 if (PyArg_ParseTuple(tuple
, "Z#Z#:test_Z_code", &value1
, &len1
,
697 if (value1
!= PyUnicode_AS_UNICODE(obj
) ||
698 len1
!= PyUnicode_GET_SIZE(obj
))
699 return raiseTestError("test_Z_code",
700 "Z# code returned wrong values for 'test'");
701 if (value2
!= NULL
||
703 return raiseTestError("test_Z_code",
704 "Z# code returned wrong values for None'");
711 test_widechar(PyObject
*self
)
713 #if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
714 const wchar_t wtext
[2] = {(wchar_t)0x10ABCDu
};
717 const wchar_t wtext
[3] = {(wchar_t)0xDBEAu
, (wchar_t)0xDFCDu
};
720 PyObject
*wide
, *utf8
;
722 wide
= PyUnicode_FromWideChar(wtext
, wtextlen
);
726 utf8
= PyUnicode_FromString("\xf4\x8a\xaf\x8d");
732 if (PyUnicode_GET_SIZE(wide
) != PyUnicode_GET_SIZE(utf8
)) {
735 return raiseTestError("test_widechar",
736 "wide string and utf8 string "
737 "have different length");
739 if (PyUnicode_Compare(wide
, utf8
)) {
742 if (PyErr_Occurred())
744 return raiseTestError("test_widechar",
745 "wide string and utf8 string "
755 test_empty_argparse(PyObject
*self
)
757 /* Test that formats can begin with '|'. See issue #4720. */
758 PyObject
*tuple
, *dict
= NULL
;
759 static char *kwlist
[] = {NULL
};
761 tuple
= PyTuple_New(0);
764 if ((result
= PyArg_ParseTuple(tuple
, "|:test_empty_argparse")) < 0)
769 result
= PyArg_ParseTupleAndKeywords(tuple
, dict
, "|:test_empty_argparse", kwlist
);
781 codec_incrementalencoder(PyObject
*self
, PyObject
*args
)
783 const char *encoding
, *errors
= NULL
;
784 if (!PyArg_ParseTuple(args
, "s|s:test_incrementalencoder",
787 return PyCodec_IncrementalEncoder(encoding
, errors
);
791 codec_incrementaldecoder(PyObject
*self
, PyObject
*args
)
793 const char *encoding
, *errors
= NULL
;
794 if (!PyArg_ParseTuple(args
, "s|s:test_incrementaldecoder",
797 return PyCodec_IncrementalDecoder(encoding
, errors
);
801 /* Simple test of _PyLong_NumBits and _PyLong_Sign. */
803 test_long_numbits(PyObject
*self
)
809 } testcases
[] = {{0, 0, 0},
818 {0x7fffL
, 15, 1}, /* one Python long digit */
823 {-0xfffffffL
, 28, -1}};
826 for (i
= 0; i
< sizeof(testcases
) / sizeof(struct triple
); ++i
) {
827 PyObject
*plong
= PyLong_FromLong(testcases
[i
].input
);
828 size_t nbits
= _PyLong_NumBits(plong
);
829 int sign
= _PyLong_Sign(plong
);
832 if (nbits
!= testcases
[i
].nbits
)
833 return raiseTestError("test_long_numbits",
834 "wrong result for _PyLong_NumBits");
835 if (sign
!= testcases
[i
].sign
)
836 return raiseTestError("test_long_numbits",
837 "wrong result for _PyLong_Sign");
843 /* Example passing NULLs to PyObject_Str(NULL). */
846 test_null_strings(PyObject
*self
)
848 PyObject
*o1
= PyObject_Str(NULL
), *o2
= PyObject_Str(NULL
);
849 PyObject
*tuple
= PyTuple_Pack(2, o1
, o2
);
856 raise_exception(PyObject
*self
, PyObject
*args
)
859 PyObject
*exc_args
, *v
;
862 if (!PyArg_ParseTuple(args
, "Oi:raise_exception",
866 exc_args
= PyTuple_New(num_args
);
867 if (exc_args
== NULL
)
869 for (i
= 0; i
< num_args
; ++i
) {
870 v
= PyLong_FromLong(i
);
875 PyTuple_SET_ITEM(exc_args
, i
, v
);
877 PyErr_SetObject(exc
, exc_args
);
884 /* test_thread_state spawns a thread of its own, and that thread releases
885 * `thread_done` when it's finished. The driver code has to know when the
886 * thread finishes, because the thread uses a PyObject (the callable) that
887 * may go away when the driver finishes. The former lack of this explicit
888 * synchronization caused rare segfaults, so rare that they were seen only
889 * on a Mac buildbot (although they were possible on any box).
891 static PyThread_type_lock thread_done
= NULL
;
894 _make_call(void *callable
)
898 PyGILState_STATE s
= PyGILState_Ensure();
899 rc
= PyObject_CallFunction((PyObject
*)callable
, "");
900 success
= (rc
!= NULL
);
902 PyGILState_Release(s
);
906 /* Same thing, but releases `thread_done` when it returns. This variant
907 * should be called only from threads spawned by test_thread_state().
910 _make_call_from_thread(void *callable
)
912 _make_call(callable
);
913 PyThread_release_lock(thread_done
);
917 test_thread_state(PyObject
*self
, PyObject
*args
)
922 if (!PyArg_ParseTuple(args
, "O:test_thread_state", &fn
))
925 if (!PyCallable_Check(fn
)) {
926 PyErr_Format(PyExc_TypeError
, "'%s' object is not callable",
927 fn
->ob_type
->tp_name
);
931 /* Ensure Python is set up for threading */
932 PyEval_InitThreads();
933 thread_done
= PyThread_allocate_lock();
934 if (thread_done
== NULL
)
935 return PyErr_NoMemory();
936 PyThread_acquire_lock(thread_done
, 1);
938 /* Start a new thread with our callback. */
939 PyThread_start_new_thread(_make_call_from_thread
, fn
);
940 /* Make the callback with the thread lock held by this thread */
941 success
&= _make_call(fn
);
942 /* Do it all again, but this time with the thread-lock released */
943 Py_BEGIN_ALLOW_THREADS
944 success
&= _make_call(fn
);
945 PyThread_acquire_lock(thread_done
, 1); /* wait for thread to finish */
948 /* And once more with and without a thread
949 XXX - should use a lock and work out exactly what we are trying
952 Py_BEGIN_ALLOW_THREADS
953 PyThread_start_new_thread(_make_call_from_thread
, fn
);
954 success
&= _make_call(fn
);
955 PyThread_acquire_lock(thread_done
, 1); /* wait for thread to finish */
958 /* Release lock we acquired above. This is required on HP-UX. */
959 PyThread_release_lock(thread_done
);
961 PyThread_free_lock(thread_done
);
967 /* test Py_AddPendingCalls using threads */
968 static int _pending_callback(void *arg
)
970 /* we assume the argument is callable object to which we own a reference */
971 PyObject
*callable
= (PyObject
*)arg
;
972 PyObject
*r
= PyObject_CallObject(callable
, NULL
);
975 return r
!= NULL
? 0 : -1;
978 /* The following requests n callbacks to _pending_callback. It can be
979 * run from any python thread.
981 PyObject
*pending_threadfunc(PyObject
*self
, PyObject
*arg
)
985 if (PyArg_ParseTuple(arg
, "O", &callable
) == 0)
988 /* create the reference for the callbackwhile we hold the lock */
991 Py_BEGIN_ALLOW_THREADS
992 r
= Py_AddPendingCall(&_pending_callback
, callable
);
996 Py_DECREF(callable
); /* unsuccessful add, destroy the extra reference */
1005 /* Some tests of PyUnicode_FromFormat(). This needs more tests. */
1007 test_string_from_format(PyObject
*self
, PyObject
*args
)
1012 #define CHECK_1_FORMAT(FORMAT, TYPE) \
1013 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1014 if (result == NULL) \
1016 if (strcmp(_PyUnicode_AsString(result), "1")) { \
1017 msg = FORMAT " failed at 1"; \
1022 CHECK_1_FORMAT("%d", int);
1023 CHECK_1_FORMAT("%ld", long);
1024 /* The z width modifier was added in Python 2.5. */
1025 CHECK_1_FORMAT("%zd", Py_ssize_t
);
1027 /* The u type code was added in Python 2.5. */
1028 CHECK_1_FORMAT("%u", unsigned int);
1029 CHECK_1_FORMAT("%lu", unsigned long);
1030 CHECK_1_FORMAT("%zu", size_t);
1036 return raiseTestError("test_string_from_format", msg
);
1038 #undef CHECK_1_FORMAT
1041 /* This is here to provide a docstring for test_descr. */
1043 test_with_docstring(PyObject
*self
)
1048 #ifdef HAVE_GETTIMEOFDAY
1049 /* Profiling of integer performance */
1050 static void print_delta(int test
, struct timeval
*s
, struct timeval
*e
)
1052 e
->tv_sec
-= s
->tv_sec
;
1053 e
->tv_usec
-= s
->tv_usec
;
1054 if (e
->tv_usec
< 0) {
1056 e
->tv_usec
+= 1000000;
1058 printf("Test %d: %d.%06ds\n", test
, (int)e
->tv_sec
, (int)e
->tv_usec
);
1062 profile_int(PyObject
*self
, PyObject
* args
)
1065 struct timeval start
, stop
;
1066 PyObject
*single
, **multiple
, *op1
, *result
;
1068 /* Test 1: Allocate and immediately deallocate
1069 many small integers */
1070 gettimeofday(&start
, NULL
);
1071 for(k
=0; k
< 20000; k
++)
1072 for(i
=0; i
< 1000; i
++) {
1073 single
= PyLong_FromLong(i
);
1076 gettimeofday(&stop
, NULL
);
1077 print_delta(1, &start
, &stop
);
1079 /* Test 2: Allocate and immediately deallocate
1080 many large integers */
1081 gettimeofday(&start
, NULL
);
1082 for(k
=0; k
< 20000; k
++)
1083 for(i
=0; i
< 1000; i
++) {
1084 single
= PyLong_FromLong(i
+1000000);
1087 gettimeofday(&stop
, NULL
);
1088 print_delta(2, &start
, &stop
);
1090 /* Test 3: Allocate a few integers, then release
1091 them all simultaneously. */
1092 multiple
= malloc(sizeof(PyObject
*) * 1000);
1093 gettimeofday(&start
, NULL
);
1094 for(k
=0; k
< 20000; k
++) {
1095 for(i
=0; i
< 1000; i
++) {
1096 multiple
[i
] = PyLong_FromLong(i
+1000000);
1098 for(i
=0; i
< 1000; i
++) {
1099 Py_DECREF(multiple
[i
]);
1102 gettimeofday(&stop
, NULL
);
1103 print_delta(3, &start
, &stop
);
1105 /* Test 4: Allocate many integers, then release
1106 them all simultaneously. */
1107 multiple
= malloc(sizeof(PyObject
*) * 1000000);
1108 gettimeofday(&start
, NULL
);
1109 for(k
=0; k
< 20; k
++) {
1110 for(i
=0; i
< 1000000; i
++) {
1111 multiple
[i
] = PyLong_FromLong(i
+1000000);
1113 for(i
=0; i
< 1000000; i
++) {
1114 Py_DECREF(multiple
[i
]);
1117 gettimeofday(&stop
, NULL
);
1118 print_delta(4, &start
, &stop
);
1120 /* Test 5: Allocate many integers < 32000 */
1121 multiple
= malloc(sizeof(PyObject
*) * 1000000);
1122 gettimeofday(&start
, NULL
);
1123 for(k
=0; k
< 10; k
++) {
1124 for(i
=0; i
< 1000000; i
++) {
1125 multiple
[i
] = PyLong_FromLong(i
+1000);
1127 for(i
=0; i
< 1000000; i
++) {
1128 Py_DECREF(multiple
[i
]);
1131 gettimeofday(&stop
, NULL
);
1132 print_delta(5, &start
, &stop
);
1134 /* Test 6: Perform small int addition */
1135 op1
= PyLong_FromLong(1);
1136 gettimeofday(&start
, NULL
);
1137 for(i
=0; i
< 10000000; i
++) {
1138 result
= PyNumber_Add(op1
, op1
);
1141 gettimeofday(&stop
, NULL
);
1143 print_delta(6, &start
, &stop
);
1145 /* Test 7: Perform medium int addition */
1146 op1
= PyLong_FromLong(1000);
1147 gettimeofday(&start
, NULL
);
1148 for(i
=0; i
< 10000000; i
++) {
1149 result
= PyNumber_Add(op1
, op1
);
1152 gettimeofday(&stop
, NULL
);
1154 print_delta(7, &start
, &stop
);
1161 /* To test the format of tracebacks as printed out. */
1163 traceback_print(PyObject
*self
, PyObject
*args
)
1166 PyObject
*traceback
;
1169 if (!PyArg_ParseTuple(args
, "OO:traceback_print",
1173 result
= PyTraceBack_Print(traceback
, file
);
1179 /* To test the format of exceptions as printed out. */
1181 exception_print(PyObject
*self
, PyObject
*args
)
1186 if (!PyArg_ParseTuple(args
, "O:exception_print",
1189 if (!PyExceptionInstance_Check(value
)) {
1190 PyErr_Format(PyExc_TypeError
, "an exception instance is required");
1194 tb
= PyException_GetTraceback(value
);
1195 PyErr_Display((PyObject
*) Py_TYPE(value
), value
, tb
);
1204 /* reliably raise a MemoryError */
1206 raise_memoryerror(PyObject
*self
)
1213 static PyMethodDef TestMethods
[] = {
1214 {"raise_exception", raise_exception
, METH_VARARGS
},
1215 {"raise_memoryerror", (PyCFunction
)raise_memoryerror
, METH_NOARGS
},
1216 {"test_config", (PyCFunction
)test_config
, METH_NOARGS
},
1217 {"test_list_api", (PyCFunction
)test_list_api
, METH_NOARGS
},
1218 {"test_dict_iteration", (PyCFunction
)test_dict_iteration
,METH_NOARGS
},
1219 {"test_lazy_hash_inheritance", (PyCFunction
)test_lazy_hash_inheritance
,METH_NOARGS
},
1220 {"test_long_api", (PyCFunction
)test_long_api
, METH_NOARGS
},
1221 {"test_long_numbits", (PyCFunction
)test_long_numbits
, METH_NOARGS
},
1222 {"test_k_code", (PyCFunction
)test_k_code
, METH_NOARGS
},
1223 {"test_empty_argparse", (PyCFunction
)test_empty_argparse
,METH_NOARGS
},
1224 {"test_null_strings", (PyCFunction
)test_null_strings
, METH_NOARGS
},
1225 {"test_string_from_format", (PyCFunction
)test_string_from_format
, METH_NOARGS
},
1226 {"test_with_docstring", (PyCFunction
)test_with_docstring
, METH_NOARGS
,
1227 PyDoc_STR("This is a pretty normal docstring.")},
1229 {"getargs_tuple", getargs_tuple
, METH_VARARGS
},
1230 {"getargs_keywords", (PyCFunction
)getargs_keywords
,
1231 METH_VARARGS
|METH_KEYWORDS
},
1232 {"getargs_b", getargs_b
, METH_VARARGS
},
1233 {"getargs_B", getargs_B
, METH_VARARGS
},
1234 {"getargs_H", getargs_H
, METH_VARARGS
},
1235 {"getargs_I", getargs_I
, METH_VARARGS
},
1236 {"getargs_k", getargs_k
, METH_VARARGS
},
1237 {"getargs_i", getargs_i
, METH_VARARGS
},
1238 {"getargs_l", getargs_l
, METH_VARARGS
},
1239 {"getargs_n", getargs_n
, METH_VARARGS
},
1240 #ifdef HAVE_LONG_LONG
1241 {"getargs_L", getargs_L
, METH_VARARGS
},
1242 {"getargs_K", getargs_K
, METH_VARARGS
},
1243 {"test_longlong_api", test_longlong_api
, METH_NOARGS
},
1244 {"test_L_code", (PyCFunction
)test_L_code
, METH_NOARGS
},
1245 {"codec_incrementalencoder",
1246 (PyCFunction
)codec_incrementalencoder
, METH_VARARGS
},
1247 {"codec_incrementaldecoder",
1248 (PyCFunction
)codec_incrementaldecoder
, METH_VARARGS
},
1250 {"test_s_code", (PyCFunction
)test_s_code
, METH_NOARGS
},
1251 {"test_u_code", (PyCFunction
)test_u_code
, METH_NOARGS
},
1252 {"test_Z_code", (PyCFunction
)test_Z_code
, METH_NOARGS
},
1253 {"test_widechar", (PyCFunction
)test_widechar
, METH_NOARGS
},
1255 {"_test_thread_state", test_thread_state
, METH_VARARGS
},
1256 {"_pending_threadfunc", pending_threadfunc
, METH_VARARGS
},
1258 #ifdef HAVE_GETTIMEOFDAY
1259 {"profile_int", profile_int
, METH_NOARGS
},
1261 {"traceback_print", traceback_print
, METH_VARARGS
},
1262 {"exception_print", exception_print
, METH_VARARGS
},
1263 {NULL
, NULL
} /* sentinel */
1266 #define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
1271 unsigned char ubyte_member
;
1273 unsigned short ushort_member
;
1275 unsigned int uint_member
;
1277 unsigned long ulong_member
;
1279 double double_member
;
1280 #ifdef HAVE_LONG_LONG
1281 PY_LONG_LONG longlong_member
;
1282 unsigned PY_LONG_LONG ulonglong_member
;
1284 } all_structmembers
;
1288 all_structmembers structmembers
;
1289 } test_structmembers
;
1291 static struct PyMemberDef test_members
[] = {
1292 {"T_BOOL", T_BOOL
, offsetof(test_structmembers
, structmembers
.bool_member
), 0, NULL
},
1293 {"T_BYTE", T_BYTE
, offsetof(test_structmembers
, structmembers
.byte_member
), 0, NULL
},
1294 {"T_UBYTE", T_UBYTE
, offsetof(test_structmembers
, structmembers
.ubyte_member
), 0, NULL
},
1295 {"T_SHORT", T_SHORT
, offsetof(test_structmembers
, structmembers
.short_member
), 0, NULL
},
1296 {"T_USHORT", T_USHORT
, offsetof(test_structmembers
, structmembers
.ushort_member
), 0, NULL
},
1297 {"T_INT", T_INT
, offsetof(test_structmembers
, structmembers
.int_member
), 0, NULL
},
1298 {"T_UINT", T_UINT
, offsetof(test_structmembers
, structmembers
.uint_member
), 0, NULL
},
1299 {"T_LONG", T_LONG
, offsetof(test_structmembers
, structmembers
.long_member
), 0, NULL
},
1300 {"T_ULONG", T_ULONG
, offsetof(test_structmembers
, structmembers
.ulong_member
), 0, NULL
},
1301 {"T_FLOAT", T_FLOAT
, offsetof(test_structmembers
, structmembers
.float_member
), 0, NULL
},
1302 {"T_DOUBLE", T_DOUBLE
, offsetof(test_structmembers
, structmembers
.double_member
), 0, NULL
},
1303 #ifdef HAVE_LONG_LONG
1304 {"T_LONGLONG", T_LONGLONG
, offsetof(test_structmembers
, structmembers
.longlong_member
), 0, NULL
},
1305 {"T_ULONGLONG", T_ULONGLONG
, offsetof(test_structmembers
, structmembers
.ulonglong_member
), 0, NULL
},
1312 test_structmembers_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwargs
)
1314 static char *keywords
[] = {
1315 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
1316 "T_INT", "T_UINT", "T_LONG", "T_ULONG",
1317 "T_FLOAT", "T_DOUBLE",
1318 #ifdef HAVE_LONG_LONG
1319 "T_LONGLONG", "T_ULONGLONG",
1322 static char *fmt
= "|bbBhHiIlkfd"
1323 #ifdef HAVE_LONG_LONG
1327 test_structmembers
*ob
;
1328 ob
= PyObject_New(test_structmembers
, type
);
1331 memset(&ob
->structmembers
, 0, sizeof(all_structmembers
));
1332 if (!PyArg_ParseTupleAndKeywords(args
, kwargs
, fmt
, keywords
,
1333 &ob
->structmembers
.bool_member
,
1334 &ob
->structmembers
.byte_member
,
1335 &ob
->structmembers
.ubyte_member
,
1336 &ob
->structmembers
.short_member
,
1337 &ob
->structmembers
.ushort_member
,
1338 &ob
->structmembers
.int_member
,
1339 &ob
->structmembers
.uint_member
,
1340 &ob
->structmembers
.long_member
,
1341 &ob
->structmembers
.ulong_member
,
1342 &ob
->structmembers
.float_member
,
1343 &ob
->structmembers
.double_member
1344 #ifdef HAVE_LONG_LONG
1345 , &ob
->structmembers
.longlong_member
,
1346 &ob
->structmembers
.ulonglong_member
1352 return (PyObject
*)ob
;
1356 test_structmembers_free(PyObject
*ob
)
1361 static PyTypeObject test_structmembersType
= {
1362 PyVarObject_HEAD_INIT(NULL
, 0)
1363 "test_structmembersType",
1364 sizeof(test_structmembers
), /* tp_basicsize */
1365 0, /* tp_itemsize */
1366 test_structmembers_free
, /* destructor tp_dealloc */
1370 0, /* tp_reserved */
1372 0, /* tp_as_number */
1373 0, /* tp_as_sequence */
1374 0, /* tp_as_mapping */
1378 PyObject_GenericGetAttr
, /* tp_getattro */
1379 PyObject_GenericSetAttr
, /* tp_setattro */
1380 0, /* tp_as_buffer */
1382 "Type containing all structmember types",
1383 0, /* traverseproc tp_traverse */
1385 0, /* tp_richcompare */
1386 0, /* tp_weaklistoffset */
1388 0, /* tp_iternext */
1390 test_members
, /* tp_members */
1399 test_structmembers_new
, /* tp_new */
1404 static struct PyModuleDef _testcapimodule
= {
1405 PyModuleDef_HEAD_INIT
,
1417 PyInit__testcapi(void)
1421 m
= PyModule_Create(&_testcapimodule
);
1425 Py_TYPE(&_HashInheritanceTester_Type
)=&PyType_Type
;
1427 Py_TYPE(&test_structmembersType
)=&PyType_Type
;
1428 Py_INCREF(&test_structmembersType
);
1429 PyModule_AddObject(m
, "test_structmembersType", (PyObject
*)&test_structmembersType
);
1431 PyModule_AddObject(m
, "CHAR_MAX", PyLong_FromLong(CHAR_MAX
));
1432 PyModule_AddObject(m
, "CHAR_MIN", PyLong_FromLong(CHAR_MIN
));
1433 PyModule_AddObject(m
, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX
));
1434 PyModule_AddObject(m
, "SHRT_MAX", PyLong_FromLong(SHRT_MAX
));
1435 PyModule_AddObject(m
, "SHRT_MIN", PyLong_FromLong(SHRT_MIN
));
1436 PyModule_AddObject(m
, "USHRT_MAX", PyLong_FromLong(USHRT_MAX
));
1437 PyModule_AddObject(m
, "INT_MAX", PyLong_FromLong(INT_MAX
));
1438 PyModule_AddObject(m
, "INT_MIN", PyLong_FromLong(INT_MIN
));
1439 PyModule_AddObject(m
, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX
));
1440 PyModule_AddObject(m
, "LONG_MAX", PyLong_FromLong(LONG_MAX
));
1441 PyModule_AddObject(m
, "LONG_MIN", PyLong_FromLong(LONG_MIN
));
1442 PyModule_AddObject(m
, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX
));
1443 PyModule_AddObject(m
, "FLT_MAX", PyFloat_FromDouble(FLT_MAX
));
1444 PyModule_AddObject(m
, "FLT_MIN", PyFloat_FromDouble(FLT_MIN
));
1445 PyModule_AddObject(m
, "DBL_MAX", PyFloat_FromDouble(DBL_MAX
));
1446 PyModule_AddObject(m
, "DBL_MIN", PyFloat_FromDouble(DBL_MIN
));
1447 PyModule_AddObject(m
, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX
));
1448 PyModule_AddObject(m
, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN
));
1449 PyModule_AddObject(m
, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX
));
1450 PyModule_AddObject(m
, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX
));
1451 PyModule_AddObject(m
, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN
));
1452 PyModule_AddObject(m
, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head
)));
1453 Py_INCREF(&PyInstanceMethod_Type
);
1454 PyModule_AddObject(m
, "instancemethod", (PyObject
*)&PyInstanceMethod_Type
);
1456 TestError
= PyErr_NewException("_testcapi.error", NULL
, NULL
);
1457 Py_INCREF(TestError
);
1458 PyModule_AddObject(m
, "error", TestError
);