blob: b3da3983551bf56bb69f08d6a607003078ca91e7 [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
8#include "Python.h"
9
10static PyObject *TestError; /* set to exception object in init */
11
Tim Peters91621db2001-06-12 20:10:01 +000012/* Raise TestError with test_name + ": " + msg, and return NULL. */
13
14static PyObject *
15raiseTestError(const char* test_name, const char* msg)
16{
17 char buf[2048];
18
19 if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
20 PyErr_SetString(TestError, "internal error msg too large");
21 else {
Tim Peters885d4572001-11-28 20:27:42 +000022 PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
Tim Peters91621db2001-06-12 20:10:01 +000023 PyErr_SetString(TestError, buf);
24 }
25 return NULL;
26}
27
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000028/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000029
30 The ones derived from autoconf on the UNIX-like OSes can be relied
31 upon (in the absence of sloppy cross-compiling), but the Windows
32 platforms have these hardcoded. Better safe than sorry.
33*/
34static PyObject*
35sizeof_error(const char* fatname, const char* typename,
36 int expected, int got)
37{
38 char buf[1024];
Tim Petersbaefd9e2003-01-28 20:37:45 +000039 PyOS_snprintf(buf, sizeof(buf),
Tim Peters885d4572001-11-28 20:27:42 +000040 "%.200s #define == %d but sizeof(%.200s) == %d",
Tim Peters9ea17ac2001-02-02 05:57:15 +000041 fatname, expected, typename, got);
42 PyErr_SetString(TestError, buf);
43 return (PyObject*)NULL;
44}
45
46static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000047test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000048{
Tim Peters9ea17ac2001-02-02 05:57:15 +000049#define CHECK_SIZEOF(FATNAME, TYPE) \
50 if (FATNAME != sizeof(TYPE)) \
51 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
52
Tim Peters208efe52001-06-26 22:40:47 +000053 CHECK_SIZEOF(SIZEOF_SHORT, short);
Tim Peters9ea17ac2001-02-02 05:57:15 +000054 CHECK_SIZEOF(SIZEOF_INT, int);
55 CHECK_SIZEOF(SIZEOF_LONG, long);
56 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
57 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
58#ifdef HAVE_LONG_LONG
Martin v. Löwisb9a0f912003-03-29 10:06:18 +000059 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000060#endif
61
62#undef CHECK_SIZEOF
63
64 Py_INCREF(Py_None);
65 return Py_None;
66}
67
Tim Peters5c4d5bf2001-02-12 22:13:26 +000068static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000069test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000070{
71 PyObject* list;
72 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000073
74 /* SF bug 132008: PyList_Reverse segfaults */
75#define NLIST 30
76 list = PyList_New(NLIST);
77 if (list == (PyObject*)NULL)
78 return (PyObject*)NULL;
79 /* list = range(NLIST) */
80 for (i = 0; i < NLIST; ++i) {
81 PyObject* anint = PyInt_FromLong(i);
82 if (anint == (PyObject*)NULL) {
83 Py_DECREF(list);
84 return (PyObject*)NULL;
85 }
86 PyList_SET_ITEM(list, i, anint);
87 }
88 /* list.reverse(), via PyList_Reverse() */
89 i = PyList_Reverse(list); /* should not blow up! */
90 if (i != 0) {
91 Py_DECREF(list);
92 return (PyObject*)NULL;
93 }
94 /* Check that list == range(29, -1, -1) now */
95 for (i = 0; i < NLIST; ++i) {
96 PyObject* anint = PyList_GET_ITEM(list, i);
97 if (PyInt_AS_LONG(anint) != NLIST-1-i) {
98 PyErr_SetString(TestError,
99 "test_list_api: reverse screwed up");
100 Py_DECREF(list);
101 return (PyObject*)NULL;
102 }
103 }
104 Py_DECREF(list);
105#undef NLIST
106
107 Py_INCREF(Py_None);
108 return Py_None;
109}
110
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000111static int
112test_dict_inner(int count)
113{
114 int pos = 0, iterations = 0, i;
115 PyObject *dict = PyDict_New();
116 PyObject *v, *k;
117
118 if (dict == NULL)
119 return -1;
120
121 for (i = 0; i < count; i++) {
122 v = PyInt_FromLong(i);
123 PyDict_SetItem(dict, v, v);
124 Py_DECREF(v);
125 }
126
127 while (PyDict_Next(dict, &pos, &k, &v)) {
128 PyObject *o;
129 iterations++;
130
131 i = PyInt_AS_LONG(v) + 1;
132 o = PyInt_FromLong(i);
133 if (o == NULL)
134 return -1;
135 if (PyDict_SetItem(dict, k, o) < 0) {
136 Py_DECREF(o);
137 return -1;
138 }
139 Py_DECREF(o);
140 }
141
142 Py_DECREF(dict);
143
144 if (iterations != count) {
145 PyErr_SetString(
146 TestError,
147 "test_dict_iteration: dict iteration went wrong ");
148 return -1;
149 } else {
150 return 0;
151 }
152}
153
154static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000155test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000156{
157 int i;
158
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000159 for (i = 0; i < 200; i++) {
160 if (test_dict_inner(i) < 0) {
161 return NULL;
162 }
163 }
164
165 Py_INCREF(Py_None);
166 return Py_None;
167}
168
Tim Peters91621db2001-06-12 20:10:01 +0000169
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000170/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000171 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000172
173 Note that the meat of the test is contained in testcapi_long.h.
174 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000175 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000176 dependence on type names makes it impossible to use a parameterized
177 function. A giant macro would be even worse than this. A C++ template
178 would be perfect.
179
180 The "report an error" functions are deliberately not part of the #include
181 file: if the test fails, you can set a breakpoint in the appropriate
182 error function directly, and crawl back from there in the debugger.
183*/
184
185#define UNBIND(X) Py_DECREF(X); (X) = NULL
186
187static PyObject *
188raise_test_long_error(const char* msg)
189{
190 return raiseTestError("test_long_api", msg);
191}
192
193#define TESTNAME test_long_api_inner
194#define TYPENAME long
195#define F_S_TO_PY PyLong_FromLong
196#define F_PY_TO_S PyLong_AsLong
197#define F_U_TO_PY PyLong_FromUnsignedLong
198#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000199
200#include "testcapi_long.h"
201
202static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000203test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000204{
Tim Peters83c9edc2001-06-16 08:10:13 +0000205 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000206}
207
208#undef TESTNAME
209#undef TYPENAME
210#undef F_S_TO_PY
211#undef F_PY_TO_S
212#undef F_U_TO_PY
213#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000214
215#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000216
217static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000218raise_test_longlong_error(const char* msg)
219{
220 return raiseTestError("test_longlong_api", msg);
221}
222
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000223#define TESTNAME test_longlong_api_inner
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000224#define TYPENAME PY_LONG_LONG
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000225#define F_S_TO_PY PyLong_FromLongLong
226#define F_PY_TO_S PyLong_AsLongLong
227#define F_U_TO_PY PyLong_FromUnsignedLongLong
228#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000229
230#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000231
232static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000233test_longlong_api(PyObject* self)
Tim Peters91621db2001-06-12 20:10:01 +0000234{
Tim Peters83c9edc2001-06-16 08:10:13 +0000235 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000236}
237
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000238#undef TESTNAME
239#undef TYPENAME
240#undef F_S_TO_PY
241#undef F_PY_TO_S
242#undef F_U_TO_PY
243#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000244
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000245/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000246 for both long and int arguments. The test may leak a little memory if
247 it fails.
248*/
249static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000250test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000251{
252 PyObject *tuple, *num;
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000253 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000254
Tim Petersd38b1c72001-09-30 05:09:37 +0000255 tuple = PyTuple_New(1);
256 if (tuple == NULL)
257 return NULL;
258
259 num = PyLong_FromLong(42);
260 if (num == NULL)
261 return NULL;
262
263 PyTuple_SET_ITEM(tuple, 0, num);
264
265 value = -1;
266 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
267 return NULL;
268 if (value != 42)
269 return raiseTestError("test_L_code",
270 "L code returned wrong value for long 42");
271
272 Py_DECREF(num);
273 num = PyInt_FromLong(42);
274 if (num == NULL)
275 return NULL;
276
277 PyTuple_SET_ITEM(tuple, 0, num);
278
279 value = -1;
280 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
281 return NULL;
282 if (value != 42)
283 return raiseTestError("test_L_code",
284 "L code returned wrong value for int 42");
285
286 Py_DECREF(tuple);
287 Py_INCREF(Py_None);
288 return Py_None;
289}
290
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000291#endif /* ifdef HAVE_LONG_LONG */
292
Thomas Hellera4ea6032003-04-17 18:55:45 +0000293/* Call PyArg_ParseTuple, and return the result as unsigned long */
294static PyObject *
295getargs_ul(PyObject *self, PyObject *args)
296{
297 PyObject *ob, *result = NULL, *argtuple;
298 char *fmt;
299 unsigned long value = 0;
300
301 if (!PyArg_ParseTuple(args, "sO", &fmt, &ob))
302 return NULL;
303 argtuple = PyTuple_New(1);
304 Py_INCREF(ob);
305 PyTuple_SET_ITEM(argtuple, 0, ob);
306 if (PyArg_ParseTuple(argtuple, fmt, &value))
307 result = PyLong_FromUnsignedLong(value);
308 Py_DECREF(argtuple);
309 return result;
310}
311
312/* Call PyArg_ParseTuple, and return the result as signed long */
313static PyObject *
314getargs_l(PyObject *self, PyObject *args)
315{
316 PyObject *ob, *result = NULL, *argtuple;
317 char *fmt;
318 long value = 0;
319
320 if (!PyArg_ParseTuple(args, "sO", &fmt, &ob))
321 return NULL;
322 argtuple = PyTuple_New(1);
323 Py_INCREF(ob);
324 PyTuple_SET_ITEM(argtuple, 0, ob);
325 if (PyArg_ParseTuple(argtuple, fmt, &value))
326 result = PyLong_FromLong(value);
327 Py_DECREF(argtuple);
328 return result;
329}
330
331#ifdef HAVE_LONG_LONG
332/* Call PyArg_ParseTuple, and return the result as signed long long */
333static PyObject *
334getargs_ll(PyObject *self, PyObject *args)
335{
336 PyObject *ob, *result = NULL, *argtuple;
337 char *fmt;
338 PY_LONG_LONG value = 0;
339
340 if (!PyArg_ParseTuple(args, "sO", &fmt, &ob))
341 return NULL;
342 argtuple = PyTuple_New(1);
343 Py_INCREF(ob);
344 PyTuple_SET_ITEM(argtuple, 0, ob);
345 if (PyArg_ParseTuple(argtuple, fmt, &value))
346 result = PyLong_FromLongLong(value);
347 Py_DECREF(argtuple);
348 return result;
349}
350
351/* Call PyArg_ParseTuple, and return the result as unsigned long long */
352static PyObject *
353getargs_ull(PyObject *self, PyObject *args)
354{
355 PyObject *ob, *result = NULL, *argtuple;
356 char *fmt;
357 unsigned PY_LONG_LONG value = 0;
358
359 if (!PyArg_ParseTuple(args, "sO", &fmt, &ob))
360 return NULL;
361 argtuple = PyTuple_New(1);
362 Py_INCREF(ob);
363 PyTuple_SET_ITEM(argtuple, 0, ob);
364 if (PyArg_ParseTuple(argtuple, fmt, &value))
365 result = PyLong_FromUnsignedLongLong(value);
366 Py_DECREF(argtuple);
367 return result;
368}
369#endif
370
371/* This function not only tests the 'k' getargs code, but also the
372 PyInt_AsUnsignedLongMask() and PyInt_AsUnsignedLongMask() functions. */
373static PyObject *
374test_k_code(PyObject *self)
375{
376 PyObject *tuple, *num;
377 unsigned long value;
378
379 tuple = PyTuple_New(1);
380 if (tuple == NULL)
381 return NULL;
382
383 /* a number larger than UINT_MAX even on 64-bit platforms */
384 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
385 if (num == NULL)
386 return NULL;
387
388 value = PyInt_AsUnsignedLongMask(num);
389 if (value != UINT_MAX)
390 return raiseTestError("test_k_code",
391 "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
392
393 PyTuple_SET_ITEM(tuple, 0, num);
394
395 value = -1;
396 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
397 return NULL;
398 if (value != UINT_MAX)
399 return raiseTestError("test_k_code",
400 "k code returned wrong value for long 0xFFF...FFF");
401
402 Py_DECREF(num);
403 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
404 if (num == NULL)
405 return NULL;
406
407 value = PyInt_AsUnsignedLongMask(num);
408 if (value != (unsigned long)-0x42)
409 return raiseTestError("test_k_code",
410 "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
411
412 PyTuple_SET_ITEM(tuple, 0, num);
413
414 value = -1;
415 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
416 return NULL;
417 if (value != (unsigned long)-0x42)
418 return raiseTestError("test_k_code",
419 "k code returned wrong value for long -0xFFF..000042");
420
421 Py_DECREF(tuple);
422 Py_INCREF(Py_None);
423 return Py_None;
424}
425
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000426#ifdef Py_USING_UNICODE
427
428/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
429 of an error.
430*/
431static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000432test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000433{
434 PyObject *tuple, *obj;
435 Py_UNICODE *value;
436 int len;
437
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000438 tuple = PyTuple_New(1);
439 if (tuple == NULL)
440 return NULL;
441
442 obj = PyUnicode_Decode("test", strlen("test"),
443 "ascii", NULL);
444 if (obj == NULL)
445 return NULL;
446
447 PyTuple_SET_ITEM(tuple, 0, obj);
448
449 value = 0;
450 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
451 return NULL;
452 if (value != PyUnicode_AS_UNICODE(obj))
453 return raiseTestError("test_u_code",
454 "u code returned wrong value for u'test'");
455 value = 0;
456 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
457 return NULL;
458 if (value != PyUnicode_AS_UNICODE(obj) ||
459 len != PyUnicode_GET_SIZE(obj))
460 return raiseTestError("test_u_code",
461 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +0000462
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000463 Py_DECREF(tuple);
464 Py_INCREF(Py_None);
465 return Py_None;
466}
467
468#endif
469
Tim Peters5b8132f2003-01-31 15:52:05 +0000470/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +0000471static PyObject *
472test_long_numbits(PyObject *self)
473{
Tim Peters5b8132f2003-01-31 15:52:05 +0000474 struct triple {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000475 long input;
Tim Peters5b8132f2003-01-31 15:52:05 +0000476 size_t nbits;
477 int sign;
478 } testcases[] = {{0, 0, 0},
479 {1L, 1, 1},
480 {-1L, 1, -1},
481 {2L, 2, 1},
482 {-2L, 2, -1},
483 {3L, 2, 1},
484 {-3L, 2, -1},
485 {4L, 3, 1},
486 {-4L, 3, -1},
487 {0x7fffL, 15, 1}, /* one Python long digit */
488 {-0x7fffL, 15, -1},
489 {0xffffL, 16, 1},
490 {-0xffffL, 16, -1},
491 {0xfffffffL, 28, 1},
492 {-0xfffffffL, 28, -1}};
Tim Petersbaefd9e2003-01-28 20:37:45 +0000493 int i;
494
Tim Peters5b8132f2003-01-31 15:52:05 +0000495 for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
496 PyObject *plong = PyLong_FromLong(testcases[i].input);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000497 size_t nbits = _PyLong_NumBits(plong);
Tim Peters5b8132f2003-01-31 15:52:05 +0000498 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000499
500 Py_DECREF(plong);
Tim Peters5b8132f2003-01-31 15:52:05 +0000501 if (nbits != testcases[i].nbits)
Tim Petersbaefd9e2003-01-28 20:37:45 +0000502 return raiseTestError("test_long_numbits",
Tim Peters5b8132f2003-01-31 15:52:05 +0000503 "wrong result for _PyLong_NumBits");
504 if (sign != testcases[i].sign)
505 return raiseTestError("test_long_numbits",
506 "wrong result for _PyLong_Sign");
Tim Petersbaefd9e2003-01-28 20:37:45 +0000507 }
508 Py_INCREF(Py_None);
509 return Py_None;
510}
511
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000512static PyObject *
513raise_exception(PyObject *self, PyObject *args)
514{
515 PyObject *exc;
516 PyObject *exc_args, *v;
517 int num_args, i;
518
519 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
520 &exc, &num_args))
521 return NULL;
522
523 exc_args = PyTuple_New(num_args);
524 if (exc_args == NULL)
525 return NULL;
526 for (i = 0; i < num_args; ++i) {
527 v = PyInt_FromLong(i);
528 if (v == NULL) {
529 Py_DECREF(exc_args);
530 return NULL;
531 }
532 PyTuple_SET_ITEM(exc_args, i, v);
533 }
534 PyErr_SetObject(exc, exc_args);
535 return NULL;
536}
Tim Peters91621db2001-06-12 20:10:01 +0000537
Tim Peters9ea17ac2001-02-02 05:57:15 +0000538static PyMethodDef TestMethods[] = {
Fred Drakeacee69f2002-04-01 14:28:58 +0000539 {"raise_exception", raise_exception, METH_VARARGS},
540 {"test_config", (PyCFunction)test_config, METH_NOARGS},
541 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
542 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
543 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Tim Petersbaefd9e2003-01-28 20:37:45 +0000544 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
Thomas Hellera4ea6032003-04-17 18:55:45 +0000545 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
546 {"getargs_ul", (PyCFunction)getargs_ul, METH_VARARGS},
547 {"getargs_l", (PyCFunction)getargs_l, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +0000548#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000549 {"getargs_ll", (PyCFunction)getargs_ll, METH_VARARGS},
550 {"getargs_ull", (PyCFunction)getargs_ull, METH_VARARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +0000551 {"test_longlong_api", (PyCFunction)test_longlong_api, METH_NOARGS},
552 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Tim Peters91621db2001-06-12 20:10:01 +0000553#endif
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000554#ifdef Py_USING_UNICODE
Fred Drakeacee69f2002-04-01 14:28:58 +0000555 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +0000556#endif
Tim Peters9ea17ac2001-02-02 05:57:15 +0000557 {NULL, NULL} /* sentinel */
558};
559
Thomas Hellera4ea6032003-04-17 18:55:45 +0000560#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
561
Mark Hammond62b1ab12002-07-23 06:31:15 +0000562PyMODINIT_FUNC
Tim Petersd66595f2001-02-04 03:09:53 +0000563init_testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +0000564{
Fred Drakeacee69f2002-04-01 14:28:58 +0000565 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +0000566
Tim Petersd66595f2001-02-04 03:09:53 +0000567 m = Py_InitModule("_testcapi", TestMethods);
Tim Peters9ea17ac2001-02-02 05:57:15 +0000568
Thomas Hellera4ea6032003-04-17 18:55:45 +0000569 PyModule_AddObject(m, "UCHAR_MAX", PyInt_FromLong(UCHAR_MAX));
570 PyModule_AddObject(m, "USHRT_MAX", PyInt_FromLong(USHRT_MAX));
571 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
572 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
573 PyModule_AddObject(m, "INT_MIN", PyInt_FromLong(INT_MIN));
574 PyModule_AddObject(m, "LONG_MIN", PyInt_FromLong(LONG_MIN));
575 PyModule_AddObject(m, "INT_MAX", PyInt_FromLong(INT_MAX));
576 PyModule_AddObject(m, "LONG_MAX", PyInt_FromLong(LONG_MAX));
577
Tim Petersd66595f2001-02-04 03:09:53 +0000578 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
Fred Drakeacee69f2002-04-01 14:28:58 +0000579 Py_INCREF(TestError);
580 PyModule_AddObject(m, "error", TestError);
Tim Peters9ea17ac2001-02-02 05:57:15 +0000581}