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.
10 #include "structmember.h"
14 #endif /* WITH_THREAD */
15 static PyObject
*TestError
; /* set to exception object in init */
17 /* Raise TestError with test_name + ": " + msg, and return NULL. */
20 raiseTestError(const char* test_name
, const char* msg
)
24 if (strlen(test_name
) + strlen(msg
) > sizeof(buf
) - 50)
25 PyErr_SetString(TestError
, "internal error msg too large");
27 PyOS_snprintf(buf
, sizeof(buf
), "%s: %s", test_name
, msg
);
28 PyErr_SetString(TestError
, buf
);
33 /* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
35 The ones derived from autoconf on the UNIX-like OSes can be relied
36 upon (in the absence of sloppy cross-compiling), but the Windows
37 platforms have these hardcoded. Better safe than sorry.
40 sizeof_error(const char* fatname
, const char* typname
,
41 int expected
, int got
)
44 PyOS_snprintf(buf
, sizeof(buf
),
45 "%.200s #define == %d but sizeof(%.200s) == %d",
46 fatname
, expected
, typname
, got
);
47 PyErr_SetString(TestError
, buf
);
48 return (PyObject
*)NULL
;
52 test_config(PyObject
*self
)
54 #define CHECK_SIZEOF(FATNAME, TYPE) \
55 if (FATNAME != sizeof(TYPE)) \
56 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
58 CHECK_SIZEOF(SIZEOF_SHORT
, short);
59 CHECK_SIZEOF(SIZEOF_INT
, int);
60 CHECK_SIZEOF(SIZEOF_LONG
, long);
61 CHECK_SIZEOF(SIZEOF_VOID_P
, void*);
62 CHECK_SIZEOF(SIZEOF_TIME_T
, time_t);
64 CHECK_SIZEOF(SIZEOF_LONG_LONG
, PY_LONG_LONG
);
74 test_list_api(PyObject
*self
)
79 /* SF bug 132008: PyList_Reverse segfaults */
81 list
= PyList_New(NLIST
);
82 if (list
== (PyObject
*)NULL
)
83 return (PyObject
*)NULL
;
84 /* list = range(NLIST) */
85 for (i
= 0; i
< NLIST
; ++i
) {
86 PyObject
* anint
= PyInt_FromLong(i
);
87 if (anint
== (PyObject
*)NULL
) {
89 return (PyObject
*)NULL
;
91 PyList_SET_ITEM(list
, i
, anint
);
93 /* list.reverse(), via PyList_Reverse() */
94 i
= PyList_Reverse(list
); /* should not blow up! */
97 return (PyObject
*)NULL
;
99 /* Check that list == range(29, -1, -1) now */
100 for (i
= 0; i
< NLIST
; ++i
) {
101 PyObject
* anint
= PyList_GET_ITEM(list
, i
);
102 if (PyInt_AS_LONG(anint
) != NLIST
-1-i
) {
103 PyErr_SetString(TestError
,
104 "test_list_api: reverse screwed up");
106 return (PyObject
*)NULL
;
117 test_dict_inner(int count
)
119 Py_ssize_t pos
= 0, iterations
= 0;
121 PyObject
*dict
= PyDict_New();
127 for (i
= 0; i
< count
; i
++) {
128 v
= PyInt_FromLong(i
);
129 PyDict_SetItem(dict
, v
, v
);
133 while (PyDict_Next(dict
, &pos
, &k
, &v
)) {
137 i
= PyInt_AS_LONG(v
) + 1;
138 o
= PyInt_FromLong(i
);
141 if (PyDict_SetItem(dict
, k
, o
) < 0) {
150 if (iterations
!= count
) {
153 "test_dict_iteration: dict iteration went wrong ");
161 test_dict_iteration(PyObject
* self
)
165 for (i
= 0; i
< 200; i
++) {
166 if (test_dict_inner(i
) < 0) {
176 /* Issue #4701: Check that PyObject_Hash implicitly calls
177 * PyType_Ready if it hasn't already been called
179 static PyTypeObject _HashInheritanceTester_Type
= {
180 PyObject_HEAD_INIT(NULL
)
181 0, /* Number of items for varobject */
182 "hashinheritancetester", /* Name of this type */
183 sizeof(PyObject
), /* Basic object size */
184 0, /* Item size for varobject */
185 (destructor
)PyObject_Del
, /* tp_dealloc */
191 0, /* tp_as_number */
192 0, /* tp_as_sequence */
193 0, /* tp_as_mapping */
197 PyObject_GenericGetAttr
, /* tp_getattro */
199 0, /* tp_as_buffer */
200 Py_TPFLAGS_DEFAULT
, /* tp_flags */
204 0, /* tp_richcompare */
205 0, /* tp_weaklistoffset */
213 0, /* tp_descr_get */
214 0, /* tp_descr_set */
215 0, /* tp_dictoffset */
218 PyType_GenericNew
, /* tp_new */
222 test_lazy_hash_inheritance(PyObject
* self
)
228 type
= &_HashInheritanceTester_Type
;
229 obj
= PyObject_New(PyObject
, type
);
234 "test_lazy_hash_inheritance: failed to create object");
238 if (type
->tp_dict
!= NULL
) {
241 "test_lazy_hash_inheritance: type initialised too soon");
246 hash
= PyObject_Hash(obj
);
247 if ((hash
== -1) && PyErr_Occurred()) {
251 "test_lazy_hash_inheritance: could not hash object");
256 if (type
->tp_dict
== NULL
) {
259 "test_lazy_hash_inheritance: type not initialised by hash()");
264 if (type
->tp_hash
!= PyType_Type
.tp_hash
) {
267 "test_lazy_hash_inheritance: unexpected hash function");
276 /* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
277 PyLong_{As, From}{Unsigned,}LongLong().
279 Note that the meat of the test is contained in testcapi_long.h.
280 This is revolting, but delicate code duplication is worse: "almost
281 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
282 dependence on type names makes it impossible to use a parameterized
283 function. A giant macro would be even worse than this. A C++ template
286 The "report an error" functions are deliberately not part of the #include
287 file: if the test fails, you can set a breakpoint in the appropriate
288 error function directly, and crawl back from there in the debugger.
291 #define UNBIND(X) Py_DECREF(X); (X) = NULL
294 raise_test_long_error(const char* msg
)
296 return raiseTestError("test_long_api", msg
);
299 #define TESTNAME test_long_api_inner
300 #define TYPENAME long
301 #define F_S_TO_PY PyLong_FromLong
302 #define F_PY_TO_S PyLong_AsLong
303 #define F_U_TO_PY PyLong_FromUnsignedLong
304 #define F_PY_TO_U PyLong_AsUnsignedLong
306 #include "testcapi_long.h"
309 test_long_api(PyObject
* self
)
311 return TESTNAME(raise_test_long_error
);
321 #ifdef HAVE_LONG_LONG
324 raise_test_longlong_error(const char* msg
)
326 return raiseTestError("test_longlong_api", msg
);
329 #define TESTNAME test_longlong_api_inner
330 #define TYPENAME PY_LONG_LONG
331 #define F_S_TO_PY PyLong_FromLongLong
332 #define F_PY_TO_S PyLong_AsLongLong
333 #define F_U_TO_PY PyLong_FromUnsignedLongLong
334 #define F_PY_TO_U PyLong_AsUnsignedLongLong
336 #include "testcapi_long.h"
339 test_longlong_api(PyObject
* self
, PyObject
*args
)
341 return TESTNAME(raise_test_longlong_error
);
351 /* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
352 for both long and int arguments. The test may leak a little memory if
356 test_L_code(PyObject
*self
)
358 PyObject
*tuple
, *num
;
361 tuple
= PyTuple_New(1);
365 num
= PyLong_FromLong(42);
369 PyTuple_SET_ITEM(tuple
, 0, num
);
372 if (PyArg_ParseTuple(tuple
, "L:test_L_code", &value
) < 0)
375 return raiseTestError("test_L_code",
376 "L code returned wrong value for long 42");
379 num
= PyInt_FromLong(42);
383 PyTuple_SET_ITEM(tuple
, 0, num
);
386 if (PyArg_ParseTuple(tuple
, "L:test_L_code", &value
) < 0)
389 return raiseTestError("test_L_code",
390 "L code returned wrong value for int 42");
397 #endif /* ifdef HAVE_LONG_LONG */
399 /* Test tuple argument processing */
401 getargs_tuple(PyObject
*self
, PyObject
*args
)
404 if (!PyArg_ParseTuple(args
, "i(ii)", &a
, &b
, &c
))
406 return Py_BuildValue("iii", a
, b
, c
);
409 /* test PyArg_ParseTupleAndKeywords */
410 static PyObject
*getargs_keywords(PyObject
*self
, PyObject
*args
, PyObject
*kwargs
)
412 static char *keywords
[] = {"arg1","arg2","arg3","arg4","arg5", NULL
};
413 static char *fmt
="(ii)i|(i(ii))(iii)i";
414 int int_args
[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
416 if (!PyArg_ParseTupleAndKeywords(args
, kwargs
, fmt
, keywords
,
417 &int_args
[0], &int_args
[1], &int_args
[2], &int_args
[3], &int_args
[4],
418 &int_args
[5], &int_args
[6], &int_args
[7], &int_args
[8], &int_args
[9]))
420 return Py_BuildValue("iiiiiiiiii",
421 int_args
[0], int_args
[1], int_args
[2], int_args
[3], int_args
[4],
422 int_args
[5], int_args
[6], int_args
[7], int_args
[8], int_args
[9]);
425 /* Functions to call PyArg_ParseTuple with integer format codes,
426 and return the result.
429 getargs_b(PyObject
*self
, PyObject
*args
)
432 if (!PyArg_ParseTuple(args
, "b", &value
))
434 return PyLong_FromUnsignedLong((unsigned long)value
);
438 getargs_B(PyObject
*self
, PyObject
*args
)
441 if (!PyArg_ParseTuple(args
, "B", &value
))
443 return PyLong_FromUnsignedLong((unsigned long)value
);
447 getargs_H(PyObject
*self
, PyObject
*args
)
449 unsigned short value
;
450 if (!PyArg_ParseTuple(args
, "H", &value
))
452 return PyLong_FromUnsignedLong((unsigned long)value
);
456 getargs_I(PyObject
*self
, PyObject
*args
)
459 if (!PyArg_ParseTuple(args
, "I", &value
))
461 return PyLong_FromUnsignedLong((unsigned long)value
);
465 getargs_k(PyObject
*self
, PyObject
*args
)
468 if (!PyArg_ParseTuple(args
, "k", &value
))
470 return PyLong_FromUnsignedLong(value
);
474 getargs_i(PyObject
*self
, PyObject
*args
)
477 if (!PyArg_ParseTuple(args
, "i", &value
))
479 return PyLong_FromLong((long)value
);
483 getargs_l(PyObject
*self
, PyObject
*args
)
486 if (!PyArg_ParseTuple(args
, "l", &value
))
488 return PyLong_FromLong(value
);
492 getargs_n(PyObject
*self
, PyObject
*args
)
495 if (!PyArg_ParseTuple(args
, "n", &value
))
497 return PyInt_FromSsize_t(value
);
500 #ifdef HAVE_LONG_LONG
502 getargs_L(PyObject
*self
, PyObject
*args
)
505 if (!PyArg_ParseTuple(args
, "L", &value
))
507 return PyLong_FromLongLong(value
);
511 getargs_K(PyObject
*self
, PyObject
*args
)
513 unsigned PY_LONG_LONG value
;
514 if (!PyArg_ParseTuple(args
, "K", &value
))
516 return PyLong_FromUnsignedLongLong(value
);
520 /* This function not only tests the 'k' getargs code, but also the
521 PyInt_AsUnsignedLongMask() and PyInt_AsUnsignedLongMask() functions. */
523 test_k_code(PyObject
*self
)
525 PyObject
*tuple
, *num
;
528 tuple
= PyTuple_New(1);
532 /* a number larger than ULONG_MAX even on 64-bit platforms */
533 num
= PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL
, 16);
537 value
= PyInt_AsUnsignedLongMask(num
);
538 if (value
!= ULONG_MAX
)
539 return raiseTestError("test_k_code",
540 "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
542 PyTuple_SET_ITEM(tuple
, 0, num
);
545 if (PyArg_ParseTuple(tuple
, "k:test_k_code", &value
) < 0)
547 if (value
!= ULONG_MAX
)
548 return raiseTestError("test_k_code",
549 "k code returned wrong value for long 0xFFF...FFF");
552 num
= PyLong_FromString("-FFFFFFFF000000000000000042", NULL
, 16);
556 value
= PyInt_AsUnsignedLongMask(num
);
557 if (value
!= (unsigned long)-0x42)
558 return raiseTestError("test_k_code",
559 "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
561 PyTuple_SET_ITEM(tuple
, 0, num
);
564 if (PyArg_ParseTuple(tuple
, "k:test_k_code", &value
) < 0)
566 if (value
!= (unsigned long)-0x42)
567 return raiseTestError("test_k_code",
568 "k code returned wrong value for long -0xFFF..000042");
575 #ifdef Py_USING_UNICODE
577 static volatile int x
;
579 /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
583 test_u_code(PyObject
*self
)
585 PyObject
*tuple
, *obj
;
589 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
590 /* Just use the macro and check that it compiles */
591 x
= Py_UNICODE_ISSPACE(25);
593 tuple
= PyTuple_New(1);
597 obj
= PyUnicode_Decode("test", strlen("test"),
602 PyTuple_SET_ITEM(tuple
, 0, obj
);
605 if (PyArg_ParseTuple(tuple
, "u:test_u_code", &value
) < 0)
607 if (value
!= PyUnicode_AS_UNICODE(obj
))
608 return raiseTestError("test_u_code",
609 "u code returned wrong value for u'test'");
611 if (PyArg_ParseTuple(tuple
, "u#:test_u_code", &value
, &len
) < 0)
613 if (value
!= PyUnicode_AS_UNICODE(obj
) ||
614 len
!= PyUnicode_GET_SIZE(obj
))
615 return raiseTestError("test_u_code",
616 "u# code returned wrong values for u'test'");
624 test_empty_argparse(PyObject
*self
)
626 /* Test that formats can begin with '|'. See issue #4720. */
627 PyObject
*tuple
, *dict
= NULL
;
628 static char *kwlist
[] = {NULL
};
630 tuple
= PyTuple_New(0);
633 if ((result
= PyArg_ParseTuple(tuple
, "|:test_empty_argparse")) < 0)
638 result
= PyArg_ParseTupleAndKeywords(tuple
, dict
, "|:test_empty_argparse", kwlist
);
650 codec_incrementalencoder(PyObject
*self
, PyObject
*args
)
652 const char *encoding
, *errors
= NULL
;
653 if (!PyArg_ParseTuple(args
, "s|s:test_incrementalencoder",
656 return PyCodec_IncrementalEncoder(encoding
, errors
);
660 codec_incrementaldecoder(PyObject
*self
, PyObject
*args
)
662 const char *encoding
, *errors
= NULL
;
663 if (!PyArg_ParseTuple(args
, "s|s:test_incrementaldecoder",
666 return PyCodec_IncrementalDecoder(encoding
, errors
);
671 /* Simple test of _PyLong_NumBits and _PyLong_Sign. */
673 test_long_numbits(PyObject
*self
)
679 } testcases
[] = {{0, 0, 0},
688 {0x7fffL
, 15, 1}, /* one Python long digit */
693 {-0xfffffffL
, 28, -1}};
696 for (i
= 0; i
< sizeof(testcases
) / sizeof(struct triple
); ++i
) {
697 PyObject
*plong
= PyLong_FromLong(testcases
[i
].input
);
698 size_t nbits
= _PyLong_NumBits(plong
);
699 int sign
= _PyLong_Sign(plong
);
702 if (nbits
!= testcases
[i
].nbits
)
703 return raiseTestError("test_long_numbits",
704 "wrong result for _PyLong_NumBits");
705 if (sign
!= testcases
[i
].sign
)
706 return raiseTestError("test_long_numbits",
707 "wrong result for _PyLong_Sign");
713 /* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */
716 test_null_strings(PyObject
*self
)
718 PyObject
*o1
= PyObject_Str(NULL
), *o2
= PyObject_Unicode(NULL
);
719 PyObject
*tuple
= PyTuple_Pack(2, o1
, o2
);
726 raise_exception(PyObject
*self
, PyObject
*args
)
729 PyObject
*exc_args
, *v
;
732 if (!PyArg_ParseTuple(args
, "Oi:raise_exception",
735 if (!PyExceptionClass_Check(exc
)) {
736 PyErr_Format(PyExc_TypeError
, "an exception class is required");
740 exc_args
= PyTuple_New(num_args
);
741 if (exc_args
== NULL
)
743 for (i
= 0; i
< num_args
; ++i
) {
744 v
= PyInt_FromLong(i
);
749 PyTuple_SET_ITEM(exc_args
, i
, v
);
751 PyErr_SetObject(exc
, exc_args
);
758 /* test_thread_state spawns a thread of its own, and that thread releases
759 * `thread_done` when it's finished. The driver code has to know when the
760 * thread finishes, because the thread uses a PyObject (the callable) that
761 * may go away when the driver finishes. The former lack of this explicit
762 * synchronization caused rare segfaults, so rare that they were seen only
763 * on a Mac buildbot (although they were possible on any box).
765 static PyThread_type_lock thread_done
= NULL
;
768 _make_call(void *callable
)
772 PyGILState_STATE s
= PyGILState_Ensure();
773 rc
= PyObject_CallFunction((PyObject
*)callable
, "");
774 success
= (rc
!= NULL
);
776 PyGILState_Release(s
);
780 /* Same thing, but releases `thread_done` when it returns. This variant
781 * should be called only from threads spawned by test_thread_state().
784 _make_call_from_thread(void *callable
)
786 _make_call(callable
);
787 PyThread_release_lock(thread_done
);
791 test_thread_state(PyObject
*self
, PyObject
*args
)
796 if (!PyArg_ParseTuple(args
, "O:test_thread_state", &fn
))
799 if (!PyCallable_Check(fn
)) {
800 PyErr_Format(PyExc_TypeError
, "'%s' object is not callable",
801 fn
->ob_type
->tp_name
);
805 /* Ensure Python is set up for threading */
806 PyEval_InitThreads();
807 thread_done
= PyThread_allocate_lock();
808 if (thread_done
== NULL
)
809 return PyErr_NoMemory();
810 PyThread_acquire_lock(thread_done
, 1);
812 /* Start a new thread with our callback. */
813 PyThread_start_new_thread(_make_call_from_thread
, fn
);
814 /* Make the callback with the thread lock held by this thread */
815 success
&= _make_call(fn
);
816 /* Do it all again, but this time with the thread-lock released */
817 Py_BEGIN_ALLOW_THREADS
818 success
&= _make_call(fn
);
819 PyThread_acquire_lock(thread_done
, 1); /* wait for thread to finish */
822 /* And once more with and without a thread
823 XXX - should use a lock and work out exactly what we are trying
826 Py_BEGIN_ALLOW_THREADS
827 PyThread_start_new_thread(_make_call_from_thread
, fn
);
828 success
&= _make_call(fn
);
829 PyThread_acquire_lock(thread_done
, 1); /* wait for thread to finish */
832 /* Release lock we acquired above. This is required on HP-UX. */
833 PyThread_release_lock(thread_done
);
835 PyThread_free_lock(thread_done
);
841 /* test Py_AddPendingCalls using threads */
842 static int _pending_callback(void *arg
)
844 /* we assume the argument is callable object to which we own a reference */
845 PyObject
*callable
= (PyObject
*)arg
;
846 PyObject
*r
= PyObject_CallObject(callable
, NULL
);
849 return r
!= NULL
? 0 : -1;
852 /* The following requests n callbacks to _pending_callback. It can be
853 * run from any python thread.
855 PyObject
*pending_threadfunc(PyObject
*self
, PyObject
*arg
)
859 if (PyArg_ParseTuple(arg
, "O", &callable
) == 0)
862 /* create the reference for the callbackwhile we hold the lock */
865 Py_BEGIN_ALLOW_THREADS
866 r
= Py_AddPendingCall(&_pending_callback
, callable
);
870 Py_DECREF(callable
); /* unsuccessful add, destroy the extra reference */
879 /* Some tests of PyString_FromFormat(). This needs more tests. */
881 test_string_from_format(PyObject
*self
, PyObject
*args
)
886 #define CHECK_1_FORMAT(FORMAT, TYPE) \
887 result = PyString_FromFormat(FORMAT, (TYPE)1); \
888 if (result == NULL) \
890 if (strcmp(PyString_AsString(result), "1")) { \
891 msg = FORMAT " failed at 1"; \
896 CHECK_1_FORMAT("%d", int);
897 CHECK_1_FORMAT("%ld", long);
898 /* The z width modifier was added in Python 2.5. */
899 CHECK_1_FORMAT("%zd", Py_ssize_t
);
901 /* The u type code was added in Python 2.5. */
902 CHECK_1_FORMAT("%u", unsigned int);
903 CHECK_1_FORMAT("%lu", unsigned long);
904 CHECK_1_FORMAT("%zu", size_t);
910 return raiseTestError("test_string_from_format", msg
);
912 #undef CHECK_1_FORMAT
915 /* This is here to provide a docstring for test_descr. */
917 test_with_docstring(PyObject
*self
)
922 /* To test the format of tracebacks as printed out. */
924 traceback_print(PyObject
*self
, PyObject
*args
)
930 if (!PyArg_ParseTuple(args
, "OO:traceback_print",
934 result
= PyTraceBack_Print(traceback
, file
);
940 static PyMethodDef TestMethods
[] = {
941 {"raise_exception", raise_exception
, METH_VARARGS
},
942 {"test_config", (PyCFunction
)test_config
, METH_NOARGS
},
943 {"test_list_api", (PyCFunction
)test_list_api
, METH_NOARGS
},
944 {"test_dict_iteration", (PyCFunction
)test_dict_iteration
,METH_NOARGS
},
945 {"test_lazy_hash_inheritance", (PyCFunction
)test_lazy_hash_inheritance
,METH_NOARGS
},
946 {"test_long_api", (PyCFunction
)test_long_api
, METH_NOARGS
},
947 {"test_long_numbits", (PyCFunction
)test_long_numbits
, METH_NOARGS
},
948 {"test_k_code", (PyCFunction
)test_k_code
, METH_NOARGS
},
949 {"test_empty_argparse", (PyCFunction
)test_empty_argparse
,METH_NOARGS
},
950 {"test_null_strings", (PyCFunction
)test_null_strings
, METH_NOARGS
},
951 {"test_string_from_format", (PyCFunction
)test_string_from_format
, METH_NOARGS
},
952 {"test_with_docstring", (PyCFunction
)test_with_docstring
, METH_NOARGS
,
953 PyDoc_STR("This is a pretty normal docstring.")},
955 {"getargs_tuple", getargs_tuple
, METH_VARARGS
},
956 {"getargs_keywords", (PyCFunction
)getargs_keywords
,
957 METH_VARARGS
|METH_KEYWORDS
},
958 {"getargs_b", getargs_b
, METH_VARARGS
},
959 {"getargs_B", getargs_B
, METH_VARARGS
},
960 {"getargs_H", getargs_H
, METH_VARARGS
},
961 {"getargs_I", getargs_I
, METH_VARARGS
},
962 {"getargs_k", getargs_k
, METH_VARARGS
},
963 {"getargs_i", getargs_i
, METH_VARARGS
},
964 {"getargs_l", getargs_l
, METH_VARARGS
},
965 {"getargs_n", getargs_n
, METH_VARARGS
},
966 #ifdef HAVE_LONG_LONG
967 {"getargs_L", getargs_L
, METH_VARARGS
},
968 {"getargs_K", getargs_K
, METH_VARARGS
},
969 {"test_longlong_api", test_longlong_api
, METH_NOARGS
},
970 {"test_L_code", (PyCFunction
)test_L_code
, METH_NOARGS
},
971 {"codec_incrementalencoder",
972 (PyCFunction
)codec_incrementalencoder
, METH_VARARGS
},
973 {"codec_incrementaldecoder",
974 (PyCFunction
)codec_incrementaldecoder
, METH_VARARGS
},
976 #ifdef Py_USING_UNICODE
977 {"test_u_code", (PyCFunction
)test_u_code
, METH_NOARGS
},
980 {"_test_thread_state", test_thread_state
, METH_VARARGS
},
981 {"_pending_threadfunc", pending_threadfunc
, METH_VARARGS
},
983 {"traceback_print", traceback_print
, METH_VARARGS
},
984 {NULL
, NULL
} /* sentinel */
987 #define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
992 unsigned char ubyte_member
;
994 unsigned short ushort_member
;
996 unsigned int uint_member
;
998 unsigned long ulong_member
;
1000 double double_member
;
1001 #ifdef HAVE_LONG_LONG
1002 PY_LONG_LONG longlong_member
;
1003 unsigned PY_LONG_LONG ulonglong_member
;
1005 } all_structmembers
;
1009 all_structmembers structmembers
;
1010 } test_structmembers
;
1012 static struct PyMemberDef test_members
[] = {
1013 {"T_BOOL", T_BOOL
, offsetof(test_structmembers
, structmembers
.bool_member
), 0, NULL
},
1014 {"T_BYTE", T_BYTE
, offsetof(test_structmembers
, structmembers
.byte_member
), 0, NULL
},
1015 {"T_UBYTE", T_UBYTE
, offsetof(test_structmembers
, structmembers
.ubyte_member
), 0, NULL
},
1016 {"T_SHORT", T_SHORT
, offsetof(test_structmembers
, structmembers
.short_member
), 0, NULL
},
1017 {"T_USHORT", T_USHORT
, offsetof(test_structmembers
, structmembers
.ushort_member
), 0, NULL
},
1018 {"T_INT", T_INT
, offsetof(test_structmembers
, structmembers
.int_member
), 0, NULL
},
1019 {"T_UINT", T_UINT
, offsetof(test_structmembers
, structmembers
.uint_member
), 0, NULL
},
1020 {"T_LONG", T_LONG
, offsetof(test_structmembers
, structmembers
.long_member
), 0, NULL
},
1021 {"T_ULONG", T_ULONG
, offsetof(test_structmembers
, structmembers
.ulong_member
), 0, NULL
},
1022 {"T_FLOAT", T_FLOAT
, offsetof(test_structmembers
, structmembers
.float_member
), 0, NULL
},
1023 {"T_DOUBLE", T_DOUBLE
, offsetof(test_structmembers
, structmembers
.double_member
), 0, NULL
},
1024 #ifdef HAVE_LONG_LONG
1025 {"T_LONGLONG", T_LONGLONG
, offsetof(test_structmembers
, structmembers
.longlong_member
), 0, NULL
},
1026 {"T_ULONGLONG", T_ULONGLONG
, offsetof(test_structmembers
, structmembers
.ulonglong_member
), 0, NULL
},
1033 test_structmembers_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwargs
)
1035 static char *keywords
[] = {
1036 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
1037 "T_INT", "T_UINT", "T_LONG", "T_ULONG",
1038 "T_FLOAT", "T_DOUBLE",
1039 #ifdef HAVE_LONG_LONG
1040 "T_LONGLONG", "T_ULONGLONG",
1043 static char *fmt
= "|bbBhHiIlkfd"
1044 #ifdef HAVE_LONG_LONG
1048 test_structmembers
*ob
;
1049 ob
= PyObject_New(test_structmembers
, type
);
1052 memset(&ob
->structmembers
, 0, sizeof(all_structmembers
));
1053 if (!PyArg_ParseTupleAndKeywords(args
, kwargs
, fmt
, keywords
,
1054 &ob
->structmembers
.bool_member
,
1055 &ob
->structmembers
.byte_member
,
1056 &ob
->structmembers
.ubyte_member
,
1057 &ob
->structmembers
.short_member
,
1058 &ob
->structmembers
.ushort_member
,
1059 &ob
->structmembers
.int_member
,
1060 &ob
->structmembers
.uint_member
,
1061 &ob
->structmembers
.long_member
,
1062 &ob
->structmembers
.ulong_member
,
1063 &ob
->structmembers
.float_member
,
1064 &ob
->structmembers
.double_member
1065 #ifdef HAVE_LONG_LONG
1066 , &ob
->structmembers
.longlong_member
,
1067 &ob
->structmembers
.ulonglong_member
1073 return (PyObject
*)ob
;
1077 test_structmembers_free(PyObject
*ob
)
1082 static PyTypeObject test_structmembersType
= {
1083 PyVarObject_HEAD_INIT(NULL
, 0)
1084 "test_structmembersType",
1085 sizeof(test_structmembers
), /* tp_basicsize */
1086 0, /* tp_itemsize */
1087 test_structmembers_free
, /* destructor tp_dealloc */
1093 0, /* tp_as_number */
1094 0, /* tp_as_sequence */
1095 0, /* tp_as_mapping */
1099 PyObject_GenericGetAttr
, /* tp_getattro */
1100 PyObject_GenericSetAttr
, /* tp_setattro */
1101 0, /* tp_as_buffer */
1103 "Type containing all structmember types",
1104 0, /* traverseproc tp_traverse */
1106 0, /* tp_richcompare */
1107 0, /* tp_weaklistoffset */
1109 0, /* tp_iternext */
1111 test_members
, /* tp_members */
1120 test_structmembers_new
, /* tp_new */
1129 m
= Py_InitModule("_testcapi", TestMethods
);
1133 Py_TYPE(&_HashInheritanceTester_Type
)=&PyType_Type
;
1135 Py_TYPE(&test_structmembersType
)=&PyType_Type
;
1136 Py_INCREF(&test_structmembersType
);
1137 PyModule_AddObject(m
, "test_structmembersType", (PyObject
*)&test_structmembersType
);
1139 PyModule_AddObject(m
, "CHAR_MAX", PyInt_FromLong(CHAR_MAX
));
1140 PyModule_AddObject(m
, "CHAR_MIN", PyInt_FromLong(CHAR_MIN
));
1141 PyModule_AddObject(m
, "UCHAR_MAX", PyInt_FromLong(UCHAR_MAX
));
1142 PyModule_AddObject(m
, "SHRT_MAX", PyInt_FromLong(SHRT_MAX
));
1143 PyModule_AddObject(m
, "SHRT_MIN", PyInt_FromLong(SHRT_MIN
));
1144 PyModule_AddObject(m
, "USHRT_MAX", PyInt_FromLong(USHRT_MAX
));
1145 PyModule_AddObject(m
, "INT_MAX", PyLong_FromLong(INT_MAX
));
1146 PyModule_AddObject(m
, "INT_MIN", PyLong_FromLong(INT_MIN
));
1147 PyModule_AddObject(m
, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX
));
1148 PyModule_AddObject(m
, "LONG_MAX", PyInt_FromLong(LONG_MAX
));
1149 PyModule_AddObject(m
, "LONG_MIN", PyInt_FromLong(LONG_MIN
));
1150 PyModule_AddObject(m
, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX
));
1151 PyModule_AddObject(m
, "FLT_MAX", PyFloat_FromDouble(FLT_MAX
));
1152 PyModule_AddObject(m
, "FLT_MIN", PyFloat_FromDouble(FLT_MIN
));
1153 PyModule_AddObject(m
, "DBL_MAX", PyFloat_FromDouble(DBL_MAX
));
1154 PyModule_AddObject(m
, "DBL_MIN", PyFloat_FromDouble(DBL_MIN
));
1155 PyModule_AddObject(m
, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX
));
1156 PyModule_AddObject(m
, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN
));
1157 PyModule_AddObject(m
, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX
));
1158 PyModule_AddObject(m
, "PY_SSIZE_T_MAX", PyInt_FromSsize_t(PY_SSIZE_T_MAX
));
1159 PyModule_AddObject(m
, "PY_SSIZE_T_MIN", PyInt_FromSsize_t(PY_SSIZE_T_MIN
));
1160 PyModule_AddObject(m
, "SIZEOF_PYGC_HEAD", PyInt_FromSsize_t(sizeof(PyGC_Head
)));
1162 TestError
= PyErr_NewException("_testcapi.error", NULL
, NULL
);
1163 Py_INCREF(TestError
);
1164 PyModule_AddObject(m
, "error", TestError
);