_testcapimodule.c 24.6 KB
Newer Older
1 2 3 4 5 6 7 8
/*
 * C Extension module to test Python interpreter C APIs.
 *
 * The 'test_*' functions exported by this module are run as part of the
 * standard Python regression test, via Lib/test/test_capi.py.
 */

#include "Python.h"
9
#include <float.h>
10
#include "structmember.h"
11

12 13 14
#ifdef WITH_THREAD
#include "pythread.h"
#endif /* WITH_THREAD */
15 16
static PyObject *TestError;	/* set to exception object in init */

17 18 19 20 21 22 23 24 25 26
/* Raise TestError with test_name + ": " + msg, and return NULL. */

static PyObject *
raiseTestError(const char* test_name, const char* msg)
{
	char buf[2048];

	if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
		PyErr_SetString(TestError, "internal error msg too large");
	else {
27
		PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
28 29 30 31 32
		PyErr_SetString(TestError, buf);
	}
	return NULL;
}

33
/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
34 35 36 37 38 39

   The ones derived from autoconf on the UNIX-like OSes can be relied
   upon (in the absence of sloppy cross-compiling), but the Windows
   platforms have these hardcoded.  Better safe than sorry.
*/
static PyObject*
40
sizeof_error(const char* fatname, const char* typname,
41 42 43
        int expected, int got)
{
	char buf[1024];
44
	PyOS_snprintf(buf, sizeof(buf),
45
		"%.200s #define == %d but sizeof(%.200s) == %d",
46
		fatname, expected, typname, got);
47 48 49 50 51
	PyErr_SetString(TestError, buf);
	return (PyObject*)NULL;
}

static PyObject*
52
test_config(PyObject *self)
53 54 55 56 57
{
#define CHECK_SIZEOF(FATNAME, TYPE) \
	    if (FATNAME != sizeof(TYPE)) \
    	    	return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))

58
	CHECK_SIZEOF(SIZEOF_SHORT, short);
59 60 61 62 63
	CHECK_SIZEOF(SIZEOF_INT, int);
	CHECK_SIZEOF(SIZEOF_LONG, long);
	CHECK_SIZEOF(SIZEOF_VOID_P, void*);
	CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
#ifdef HAVE_LONG_LONG
64
	CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
65 66 67 68 69 70 71 72
#endif

#undef CHECK_SIZEOF

	Py_INCREF(Py_None);
	return Py_None;
}

73
static PyObject*
74
test_list_api(PyObject *self)
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
{
	PyObject* list;
	int i;

	/* SF bug 132008:  PyList_Reverse segfaults */
#define NLIST 30
	list = PyList_New(NLIST);
	if (list == (PyObject*)NULL)
		return (PyObject*)NULL;
	/* list = range(NLIST) */
	for (i = 0; i < NLIST; ++i) {
		PyObject* anint = PyInt_FromLong(i);
		if (anint == (PyObject*)NULL) {
			Py_DECREF(list);
			return (PyObject*)NULL;
		}
		PyList_SET_ITEM(list, i, anint);
	}
	/* list.reverse(), via PyList_Reverse() */
	i = PyList_Reverse(list);   /* should not blow up! */
	if (i != 0) {
		Py_DECREF(list);
		return (PyObject*)NULL;
	}
	/* Check that list == range(29, -1, -1) now */
	for (i = 0; i < NLIST; ++i) {
		PyObject* anint = PyList_GET_ITEM(list, i);
		if (PyInt_AS_LONG(anint) != NLIST-1-i) {
			PyErr_SetString(TestError,
			                "test_list_api: reverse screwed up");
			Py_DECREF(list);
			return (PyObject*)NULL;
		}
	}
	Py_DECREF(list);
#undef NLIST

	Py_INCREF(Py_None);
	return Py_None;
}

116 117 118
static int
test_dict_inner(int count)
{
Martin v. Löwis's avatar
Martin v. Löwis committed
119 120
	Py_ssize_t pos = 0, iterations = 0;
	int i;
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
	PyObject *dict = PyDict_New();
	PyObject *v, *k;

	if (dict == NULL)
		return -1;

	for (i = 0; i < count; i++) {
		v = PyInt_FromLong(i);
		PyDict_SetItem(dict, v, v);
		Py_DECREF(v);
	}

	while (PyDict_Next(dict, &pos, &k, &v)) {
		PyObject *o;
		iterations++;

		i = PyInt_AS_LONG(v) + 1;
		o = PyInt_FromLong(i);
		if (o == NULL)
			return -1;
		if (PyDict_SetItem(dict, k, o) < 0) {
			Py_DECREF(o);
			return -1;
		}
		Py_DECREF(o);
	}

	Py_DECREF(dict);

	if (iterations != count) {
		PyErr_SetString(
			TestError,
			"test_dict_iteration: dict iteration went wrong ");
		return -1;
	} else {
		return 0;
	}
}

static PyObject*
161
test_dict_iteration(PyObject* self)
162 163 164 165 166 167 168 169 170 171 172 173 174
{
	int i;

	for (i = 0; i < 200; i++) {
		if (test_dict_inner(i) < 0) {
			return NULL;
		}
	}

	Py_INCREF(Py_None);
	return Py_None;
}

175

176
/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Peters's avatar
Tim Peters committed
177
   PyLong_{As, From}{Unsigned,}LongLong().
178 179 180

   Note that the meat of the test is contained in testcapi_long.h.
   This is revolting, but delicate code duplication is worse:  "almost
181
   exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
   dependence on type names makes it impossible to use a parameterized
   function.  A giant macro would be even worse than this.  A C++ template
   would be perfect.

   The "report an error" functions are deliberately not part of the #include
   file:  if the test fails, you can set a breakpoint in the appropriate
   error function directly, and crawl back from there in the debugger.
*/

#define UNBIND(X)  Py_DECREF(X); (X) = NULL

static PyObject *
raise_test_long_error(const char* msg)
{
	return raiseTestError("test_long_api", msg);
}

#define TESTNAME	test_long_api_inner
#define TYPENAME	long
#define F_S_TO_PY	PyLong_FromLong
#define F_PY_TO_S	PyLong_AsLong
#define F_U_TO_PY	PyLong_FromUnsignedLong
#define F_PY_TO_U	PyLong_AsUnsignedLong

#include "testcapi_long.h"

static PyObject *
209
test_long_api(PyObject* self)
210
{
211
	return TESTNAME(raise_test_long_error);
212 213 214 215 216 217 218 219 220 221
}

#undef TESTNAME
#undef TYPENAME
#undef F_S_TO_PY
#undef F_PY_TO_S
#undef F_U_TO_PY
#undef F_PY_TO_U

#ifdef HAVE_LONG_LONG
222

Tim Peters's avatar
Tim Peters committed
223 224 225 226 227 228
static PyObject *
raise_test_longlong_error(const char* msg)
{
	return raiseTestError("test_longlong_api", msg);
}

229
#define TESTNAME	test_longlong_api_inner
230
#define TYPENAME	PY_LONG_LONG
231 232 233 234 235 236
#define F_S_TO_PY	PyLong_FromLongLong
#define F_PY_TO_S	PyLong_AsLongLong
#define F_U_TO_PY	PyLong_FromUnsignedLongLong
#define F_PY_TO_U	PyLong_AsUnsignedLongLong

#include "testcapi_long.h"
Tim Peters's avatar
Tim Peters committed
237

238
static PyObject *
239
test_longlong_api(PyObject* self, PyObject *args)
240
{
241
	return TESTNAME(raise_test_longlong_error);
242
}
Tim Peters's avatar
Tim Peters committed
243

244 245 246 247 248 249
#undef TESTNAME
#undef TYPENAME
#undef F_S_TO_PY
#undef F_PY_TO_S
#undef F_U_TO_PY
#undef F_PY_TO_U
250

251
/* Test the L code for PyArg_ParseTuple.  This should deliver a PY_LONG_LONG
252 253 254 255
   for both long and int arguments.  The test may leak a little memory if
   it fails.
*/
static PyObject *
256
test_L_code(PyObject *self)
257 258
{
	PyObject *tuple, *num;
259
	PY_LONG_LONG value;
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296

        tuple = PyTuple_New(1);
        if (tuple == NULL)
        	return NULL;

        num = PyLong_FromLong(42);
        if (num == NULL)
        	return NULL;

        PyTuple_SET_ITEM(tuple, 0, num);

        value = -1;
        if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
        	return NULL;
        if (value != 42)
        	return raiseTestError("test_L_code",
			"L code returned wrong value for long 42");

	Py_DECREF(num);
        num = PyInt_FromLong(42);
        if (num == NULL)
        	return NULL;

        PyTuple_SET_ITEM(tuple, 0, num);

	value = -1;
        if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
        	return NULL;
        if (value != 42)
        	return raiseTestError("test_L_code",
			"L code returned wrong value for int 42");

	Py_DECREF(tuple);
	Py_INCREF(Py_None);
	return Py_None;
}

297
#endif	/* ifdef HAVE_LONG_LONG */
298

299 300 301 302 303 304 305 306 307 308
/* Test tuple argument processing */
static PyObject *
getargs_tuple(PyObject *self, PyObject *args)
{
	int a, b, c;
	if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
		return NULL;
	return Py_BuildValue("iii", a, b, c);
}

309 310 311
/* Functions to call PyArg_ParseTuple with integer format codes,
   and return the result.
*/
312
static PyObject *
313
getargs_b(PyObject *self, PyObject *args)
314
{
315 316 317 318 319
	unsigned char value;
	if (!PyArg_ParseTuple(args, "b", &value))
		return NULL;
	return PyLong_FromUnsignedLong((unsigned long)value);
}
320

321 322 323 324 325
static PyObject *
getargs_B(PyObject *self, PyObject *args)
{
	unsigned char value;
	if (!PyArg_ParseTuple(args, "B", &value))
326
		return NULL;
327
	return PyLong_FromUnsignedLong((unsigned long)value);
328 329 330
}

static PyObject *
331
getargs_H(PyObject *self, PyObject *args)
332
{
333 334 335 336 337
	unsigned short value;
	if (!PyArg_ParseTuple(args, "H", &value))
		return NULL;
	return PyLong_FromUnsignedLong((unsigned long)value);
}
338

339 340 341 342 343
static PyObject *
getargs_I(PyObject *self, PyObject *args)
{
	unsigned int value;
	if (!PyArg_ParseTuple(args, "I", &value))
344
		return NULL;
345 346 347 348 349 350 351 352 353 354
	return PyLong_FromUnsignedLong((unsigned long)value);
}

static PyObject *
getargs_k(PyObject *self, PyObject *args)
{
	unsigned long value;
	if (!PyArg_ParseTuple(args, "k", &value))
		return NULL;
	return PyLong_FromUnsignedLong(value);
355 356 357
}

static PyObject *
358
getargs_i(PyObject *self, PyObject *args)
359
{
360 361 362 363 364
	int value;
	if (!PyArg_ParseTuple(args, "i", &value))
		return NULL;
	return PyLong_FromLong((long)value);
}
365

366 367 368 369 370
static PyObject *
getargs_l(PyObject *self, PyObject *args)
{
	long value;
	if (!PyArg_ParseTuple(args, "l", &value))
371
		return NULL;
372
	return PyLong_FromLong(value);
373 374
}

375 376 377 378 379 380 381 382 383
static PyObject *
getargs_n(PyObject *self, PyObject *args)
{
	Py_ssize_t value;
	if (!PyArg_ParseTuple(args, "n", &value))
	return NULL;
	return PyInt_FromSsize_t(value);
}

384
#ifdef HAVE_LONG_LONG
385
static PyObject *
386
getargs_L(PyObject *self, PyObject *args)
387
{
388 389 390 391 392
	PY_LONG_LONG value;
	if (!PyArg_ParseTuple(args, "L", &value))
		return NULL;
	return PyLong_FromLongLong(value);
}
393

394 395 396 397 398
static PyObject *
getargs_K(PyObject *self, PyObject *args)
{
	unsigned PY_LONG_LONG value;
	if (!PyArg_ParseTuple(args, "K", &value))
399
		return NULL;
400
	return PyLong_FromUnsignedLongLong(value);
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
}
#endif

/* This function not only tests the 'k' getargs code, but also the
   PyInt_AsUnsignedLongMask() and PyInt_AsUnsignedLongMask() functions. */
static PyObject *
test_k_code(PyObject *self)
{
	PyObject *tuple, *num;
	unsigned long value;

        tuple = PyTuple_New(1);
        if (tuple == NULL)
        	return NULL;

416
	/* a number larger than ULONG_MAX even on 64-bit platforms */
417 418 419 420 421
        num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
        if (num == NULL)
        	return NULL;

	value = PyInt_AsUnsignedLongMask(num);
422
	if (value != ULONG_MAX)
423 424 425 426 427
        	return raiseTestError("test_k_code",
	    "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");

        PyTuple_SET_ITEM(tuple, 0, num);

428
        value = 0;
429 430
        if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
        	return NULL;
431
        if (value != ULONG_MAX)
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
        	return raiseTestError("test_k_code",
			"k code returned wrong value for long 0xFFF...FFF");

	Py_DECREF(num);
        num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
        if (num == NULL)
        	return NULL;

	value = PyInt_AsUnsignedLongMask(num);
	if (value != (unsigned long)-0x42)
        	return raiseTestError("test_k_code",
	    "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");

        PyTuple_SET_ITEM(tuple, 0, num);

447
	value = 0;
448 449 450 451 452 453 454 455 456 457 458
        if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
        	return NULL;
        if (value != (unsigned long)-0x42)
        	return raiseTestError("test_k_code",
			"k code returned wrong value for long -0xFFF..000042");

	Py_DECREF(tuple);
	Py_INCREF(Py_None);
	return Py_None;
}

459 460 461 462 463 464
#ifdef Py_USING_UNICODE

/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
   of an error.
*/
static PyObject *
465
test_u_code(PyObject *self)
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
{
	PyObject *tuple, *obj;
	Py_UNICODE *value;
	int len;

        tuple = PyTuple_New(1);
        if (tuple == NULL)
        	return NULL;

        obj = PyUnicode_Decode("test", strlen("test"),
			       "ascii", NULL);
        if (obj == NULL)
        	return NULL;

        PyTuple_SET_ITEM(tuple, 0, obj);

        value = 0;
        if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
        	return NULL;
        if (value != PyUnicode_AS_UNICODE(obj))
        	return raiseTestError("test_u_code",
			"u code returned wrong value for u'test'");
        value = 0;
        if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
        	return NULL;
        if (value != PyUnicode_AS_UNICODE(obj) ||
	    len != PyUnicode_GET_SIZE(obj))
        	return raiseTestError("test_u_code",
			"u# code returned wrong values for u'test'");
495

496 497 498 499 500
	Py_DECREF(tuple);
	Py_INCREF(Py_None);
	return Py_None;
}

501 502
static PyObject *
codec_incrementalencoder(PyObject *self, PyObject *args)
503 504
{
	const char *encoding, *errors = NULL;
505
	if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
506 507 508 509 510
			      &encoding, &errors))
		return NULL;
	return PyCodec_IncrementalEncoder(encoding, errors);
}

511 512
static PyObject *
codec_incrementaldecoder(PyObject *self, PyObject *args)
513 514
{
	const char *encoding, *errors = NULL;
515
	if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
516 517 518 519 520
			      &encoding, &errors))
		return NULL;
	return PyCodec_IncrementalDecoder(encoding, errors);
}

521 522
#endif

523
/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
524 525 526
static PyObject *
test_long_numbits(PyObject *self)
{
527
	struct triple {
528
		long input;
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
		size_t nbits;
		int sign;
	} testcases[] = {{0, 0, 0},
			 {1L, 1, 1},
			 {-1L, 1, -1},
			 {2L, 2, 1},
			 {-2L, 2, -1},
			 {3L, 2, 1},
			 {-3L, 2, -1},
			 {4L, 3, 1},
			 {-4L, 3, -1},
			 {0x7fffL, 15, 1},	/* one Python long digit */
			 {-0x7fffL, 15, -1},
			 {0xffffL, 16, 1},
			 {-0xffffL, 16, -1},
			 {0xfffffffL, 28, 1},
			 {-0xfffffffL, 28, -1}};
546 547
	int i;

548 549
	for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
		PyObject *plong = PyLong_FromLong(testcases[i].input);
550
		size_t nbits = _PyLong_NumBits(plong);
551
		int sign = _PyLong_Sign(plong);
552 553

		Py_DECREF(plong);
554
		if (nbits != testcases[i].nbits)
555
			return raiseTestError("test_long_numbits",
556 557 558 559
					"wrong result for _PyLong_NumBits");
		if (sign != testcases[i].sign)
			return raiseTestError("test_long_numbits",
					"wrong result for _PyLong_Sign");
560 561 562 563 564
	}
	Py_INCREF(Py_None);
	return Py_None;
}

565 566 567 568 569 570 571 572 573 574 575 576
/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */

static PyObject *
test_null_strings(PyObject *self)
{
	PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL);
	PyObject *tuple = PyTuple_Pack(2, o1, o2);
	Py_XDECREF(o1);
	Py_XDECREF(o2);
	return tuple;
}

577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
static PyObject *
raise_exception(PyObject *self, PyObject *args)
{
	PyObject *exc;
	PyObject *exc_args, *v;
	int num_args, i;

	if (!PyArg_ParseTuple(args, "Oi:raise_exception",
			      &exc, &num_args))
		return NULL;

	exc_args = PyTuple_New(num_args);
	if (exc_args == NULL)
		return NULL;
	for (i = 0; i < num_args; ++i) {
		v = PyInt_FromLong(i);
		if (v == NULL) {
			Py_DECREF(exc_args);
			return NULL;
		}
		PyTuple_SET_ITEM(exc_args, i, v);
	}
	PyErr_SetObject(exc, exc_args);
600
	Py_DECREF(exc_args);
601 602
	return NULL;
}
603

604 605
#ifdef WITH_THREAD

606 607 608 609 610 611 612 613 614 615 616
/* test_thread_state spawns a thread of its own, and that thread releases
 * `thread_done` when it's finished.  The driver code has to know when the
 * thread finishes, because the thread uses a PyObject (the callable) that
 * may go away when the driver finishes.  The former lack of this explicit
 * synchronization caused rare segfaults, so rare that they were seen only
 * on a Mac buildbot (although they were possible on any box).
 */
static PyThread_type_lock thread_done = NULL;

static void
_make_call(void *callable)
617 618 619
{
	PyObject *rc;
	PyGILState_STATE s = PyGILState_Ensure();
620
	rc = PyObject_CallFunction((PyObject *)callable, "");
621 622 623 624
	Py_XDECREF(rc);
	PyGILState_Release(s);
}

625 626 627 628 629 630 631 632 633 634
/* Same thing, but releases `thread_done` when it returns.  This variant
 * should be called only from threads spawned by test_thread_state().
 */
static void
_make_call_from_thread(void *callable)
{
	_make_call(callable);
	PyThread_release_lock(thread_done);
}

635 636 637 638
static PyObject *
test_thread_state(PyObject *self, PyObject *args)
{
	PyObject *fn;
639

640 641
	if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
		return NULL;
642 643

	/* Ensure Python is set up for threading */
644
	PyEval_InitThreads();
645 646 647 648 649 650 651
	thread_done = PyThread_allocate_lock();
	if (thread_done == NULL)
		return PyErr_NoMemory();
	PyThread_acquire_lock(thread_done, 1);

	/* Start a new thread with our callback. */
	PyThread_start_new_thread(_make_call_from_thread, fn);
652 653 654 655 656
	/* Make the callback with the thread lock held by this thread */
	_make_call(fn);
	/* Do it all again, but this time with the thread-lock released */
	Py_BEGIN_ALLOW_THREADS
	_make_call(fn);
657
	PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
658
	Py_END_ALLOW_THREADS
659

660
	/* And once more with and without a thread
661 662
	   XXX - should use a lock and work out exactly what we are trying
	   to test <wink>
663 664
	*/
	Py_BEGIN_ALLOW_THREADS
665
	PyThread_start_new_thread(_make_call_from_thread, fn);
666
	_make_call(fn);
667
	PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
668
	Py_END_ALLOW_THREADS
669

670 671 672
	/* Release lock we acquired above.  This is required on HP-UX. */
	PyThread_release_lock(thread_done);

673 674
	PyThread_free_lock(thread_done);
	Py_RETURN_NONE;
675 676 677
}
#endif

Tim Peters's avatar
Tim Peters committed
678
/* Some tests of PyString_FromFormat().  This needs more tests. */
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
static PyObject *
test_string_from_format(PyObject *self, PyObject *args)
{
	PyObject *result;
	char *msg;

#define CHECK_1_FORMAT(FORMAT, TYPE) 			\
	result = PyString_FromFormat(FORMAT, (TYPE)1);	\
	if (result == NULL)				\
		return NULL;				\
	if (strcmp(PyString_AsString(result), "1")) {	\
		msg = FORMAT " failed at 1";		\
		goto Fail;				\
	}						\
	Py_DECREF(result)

	CHECK_1_FORMAT("%d", int);
	CHECK_1_FORMAT("%ld", long);
	/* The z width modifier was added in Python 2.5. */
	CHECK_1_FORMAT("%zd", Py_ssize_t);

	/* The u type code was added in Python 2.5. */
	CHECK_1_FORMAT("%u", unsigned int);
	CHECK_1_FORMAT("%lu", unsigned long);
	CHECK_1_FORMAT("%zu", size_t);

	Py_RETURN_NONE;

 Fail:
 	Py_XDECREF(result);
	return raiseTestError("test_string_from_format", msg);

#undef CHECK_1_FORMAT
}

714 715 716 717 718 719 720
/* This is here to provide a docstring for test_descr. */
static PyObject *
test_with_docstring(PyObject *self)
{
	Py_RETURN_NONE;
}

721
static PyMethodDef TestMethods[] = {
722 723 724 725 726
	{"raise_exception",	raise_exception,		 METH_VARARGS},
	{"test_config",		(PyCFunction)test_config,	 METH_NOARGS},
	{"test_list_api",	(PyCFunction)test_list_api,	 METH_NOARGS},
	{"test_dict_iteration",	(PyCFunction)test_dict_iteration,METH_NOARGS},
	{"test_long_api",	(PyCFunction)test_long_api,	 METH_NOARGS},
727
	{"test_long_numbits",	(PyCFunction)test_long_numbits,	 METH_NOARGS},
728
	{"test_k_code",		(PyCFunction)test_k_code,	 METH_NOARGS},
729
	{"test_null_strings",	(PyCFunction)test_null_strings,	 METH_NOARGS},
730
	{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
731 732
	{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
	 PyDoc_STR("This is a pretty normal docstring.")},
733

734
	{"getargs_tuple",	getargs_tuple,			 METH_VARARGS},
735 736 737 738 739 740 741 742
	{"getargs_b",		getargs_b,			 METH_VARARGS},
	{"getargs_B",		getargs_B,			 METH_VARARGS},
	{"getargs_H",		getargs_H,			 METH_VARARGS},
	{"getargs_I",		getargs_I,			 METH_VARARGS},
	{"getargs_k",		getargs_k,			 METH_VARARGS},
	{"getargs_i",		getargs_i,			 METH_VARARGS},
	{"getargs_l",		getargs_l,			 METH_VARARGS},
	{"getargs_n",		getargs_n, 			 METH_VARARGS},
743
#ifdef HAVE_LONG_LONG
744 745 746
	{"getargs_L",		getargs_L,			 METH_VARARGS},
	{"getargs_K",		getargs_K,			 METH_VARARGS},
	{"test_longlong_api",	test_longlong_api,		 METH_NOARGS},
747
	{"test_L_code",		(PyCFunction)test_L_code,	 METH_NOARGS},
748 749 750 751
	{"codec_incrementalencoder",
	 (PyCFunction)codec_incrementalencoder,	 METH_VARARGS},
	{"codec_incrementaldecoder",
	 (PyCFunction)codec_incrementaldecoder,	 METH_VARARGS},
752 753
#endif
#ifdef Py_USING_UNICODE
754
	{"test_u_code",		(PyCFunction)test_u_code,	 METH_NOARGS},
755 756
#endif
#ifdef WITH_THREAD
757
	{"_test_thread_state",  test_thread_state, 		 METH_VARARGS},
758
#endif
759 760 761
	{NULL, NULL} /* sentinel */
};

762 763
#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}

764
typedef struct {
765
	char bool_member;
766 767 768 769 770 771 772 773 774 775
	char byte_member;
	unsigned char ubyte_member;
	short short_member;
	unsigned short ushort_member;
	int int_member;
	unsigned int uint_member;
	long long_member;
	unsigned long ulong_member;
	float float_member;
	double double_member;
776 777 778 779
#ifdef HAVE_LONG_LONG
	PY_LONG_LONG longlong_member;
	unsigned PY_LONG_LONG ulonglong_member;
#endif
780 781 782 783 784 785 786 787
} all_structmembers;

typedef struct {
    PyObject_HEAD
	all_structmembers structmembers;
} test_structmembers;

static struct PyMemberDef test_members[] = {
788
	{"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
789 790 791 792 793 794 795 796 797 798
	{"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
	{"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
	{"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
	{"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
	{"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
	{"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
	{"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
	{"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
	{"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
	{"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
799 800 801 802
#ifdef HAVE_LONG_LONG
	{"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
	{"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
#endif
803 804 805 806
	{NULL}
};


Georg Brandl's avatar
Georg Brandl committed
807 808 809 810 811 812 813 814
static PyObject *
test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
	static char *keywords[] = {
		"T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
		"T_INT", "T_UINT", "T_LONG", "T_ULONG",
		"T_FLOAT", "T_DOUBLE",
#ifdef HAVE_LONG_LONG	
815
		"T_LONGLONG", "T_ULONGLONG",
Georg Brandl's avatar
Georg Brandl committed
816
#endif
817
		NULL};
Georg Brandl's avatar
Georg Brandl committed
818 819
	static char *fmt = "|bbBhHiIlkfd"
#ifdef HAVE_LONG_LONG
820
		"LK"
Georg Brandl's avatar
Georg Brandl committed
821
#endif
822
		;
Georg Brandl's avatar
Georg Brandl committed
823 824 825
	test_structmembers *ob;
	ob = PyObject_New(test_structmembers, type);
	if (ob == NULL)
826 827
		return NULL;
	memset(&ob->structmembers, 0, sizeof(all_structmembers));
828
	if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
Georg Brandl's avatar
Georg Brandl committed
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
					 &ob->structmembers.bool_member,
					 &ob->structmembers.byte_member,
					 &ob->structmembers.ubyte_member,
					 &ob->structmembers.short_member,
					 &ob->structmembers.ushort_member,
					 &ob->structmembers.int_member,
					 &ob->structmembers.uint_member, 
					 &ob->structmembers.long_member,
					 &ob->structmembers.ulong_member,
					 &ob->structmembers.float_member,
					 &ob->structmembers.double_member
#ifdef HAVE_LONG_LONG
					 , &ob->structmembers.longlong_member,
					 &ob->structmembers.ulonglong_member
#endif
		)) {
845 846
		Py_DECREF(ob);
		return NULL;
Georg Brandl's avatar
Georg Brandl committed
847
	}
848 849 850
	return (PyObject *)ob;
}

Georg Brandl's avatar
Georg Brandl committed
851 852 853
static void
test_structmembers_free(PyObject *ob)
{
854 855 856 857
	PyObject_FREE(ob);
}

static PyTypeObject test_structmembersType = {
858
    PyVarObject_HEAD_INIT(NULL, 0)
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
	"test_structmembersType",
	sizeof(test_structmembers),	/* tp_basicsize */
	0,				/* tp_itemsize */
	test_structmembers_free,	/* destructor tp_dealloc */
	0,				/* tp_print */
	0,				/* tp_getattr */
	0,				/* tp_setattr */
	0,				/* tp_compare */
	0,				/* tp_repr */
	0,				/* tp_as_number */
	0,				/* tp_as_sequence */
	0,				/* tp_as_mapping */
	0,				/* tp_hash */
	0,				/* tp_call */
	0,				/* tp_str */
Georg Brandl's avatar
Georg Brandl committed
874 875
	PyObject_GenericGetAttr,	/* tp_getattro */
	PyObject_GenericSetAttr,	/* tp_setattro */
876 877 878 879 880 881 882 883 884 885
	0,				/* tp_as_buffer */
	0,				/* tp_flags */
	"Type containing all structmember types",
	0,				/* traverseproc tp_traverse */
	0,				/* tp_clear */
	0,				/* tp_richcompare */
	0,				/* tp_weaklistoffset */
	0,				/* tp_iter */
	0,				/* tp_iternext */
	0,				/* tp_methods */
Georg Brandl's avatar
Georg Brandl committed
886
	test_members,			/* tp_members */
887 888 889 890 891 892 893 894
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
Georg Brandl's avatar
Georg Brandl committed
895
	test_structmembers_new,	       	/* tp_new */
896 897 898
};


899
PyMODINIT_FUNC
900
init_testcapi(void)
901
{
902
	PyObject *m;
903

904
	m = Py_InitModule("_testcapi", TestMethods);
905 906
	if (m == NULL)
		return;
907

908
	Py_TYPE(&test_structmembersType)=&PyType_Type;
909 910 911 912 913
	Py_INCREF(&test_structmembersType);
	PyModule_AddObject(m, "test_structmembersType", (PyObject *)&test_structmembersType);

	PyModule_AddObject(m, "CHAR_MAX", PyInt_FromLong(CHAR_MAX));
	PyModule_AddObject(m, "CHAR_MIN", PyInt_FromLong(CHAR_MIN));
914
	PyModule_AddObject(m, "UCHAR_MAX", PyInt_FromLong(UCHAR_MAX));
915 916
	PyModule_AddObject(m, "SHRT_MAX", PyInt_FromLong(SHRT_MAX));
	PyModule_AddObject(m, "SHRT_MIN", PyInt_FromLong(SHRT_MIN));
917
	PyModule_AddObject(m, "USHRT_MAX", PyInt_FromLong(USHRT_MAX));
918 919
	PyModule_AddObject(m, "INT_MAX",  PyLong_FromLong(INT_MAX));
	PyModule_AddObject(m, "INT_MIN",  PyLong_FromLong(INT_MIN));
920 921
	PyModule_AddObject(m, "UINT_MAX",  PyLong_FromUnsignedLong(UINT_MAX));
	PyModule_AddObject(m, "LONG_MAX", PyInt_FromLong(LONG_MAX));
922 923 924 925 926 927
	PyModule_AddObject(m, "LONG_MIN", PyInt_FromLong(LONG_MIN));
	PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
	PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
	PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
	PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
	PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
928 929 930
	PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
	PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
	PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
931
	PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyInt_FromSsize_t(PY_SSIZE_T_MAX));
932
	PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyInt_FromSsize_t(PY_SSIZE_T_MIN));
933

934
	TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
935 936
	Py_INCREF(TestError);
	PyModule_AddObject(m, "error", TestError);
937
}