_testcapimodule.c 31 KB
Newer Older
1 2 3 4 5 6 7
/*
 * 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.
 */

8 9
#define PY_SSIZE_T_CLEAN

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

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

19 20 21 22 23 24 25 26 27 28
/* 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 {
29
		PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
30 31 32 33 34
		PyErr_SetString(TestError, buf);
	}
	return NULL;
}

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

   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*
42
sizeof_error(const char* fatname, const char* typname,
43 44 45
        int expected, int got)
{
	char buf[1024];
46
	PyOS_snprintf(buf, sizeof(buf),
47
		"%.200s #define == %d but sizeof(%.200s) == %d",
48
		fatname, expected, typname, got);
49 50 51 52 53
	PyErr_SetString(TestError, buf);
	return (PyObject*)NULL;
}

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

60
	CHECK_SIZEOF(SIZEOF_SHORT, short);
61 62 63 64 65
	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
66
	CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
67 68 69 70 71 72 73 74
#endif

#undef CHECK_SIZEOF

	Py_INCREF(Py_None);
	return Py_None;
}

75
static PyObject*
76
test_list_api(PyObject *self)
77 78 79 80 81 82 83 84 85 86 87
{
	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) {
88
		PyObject* anint = PyLong_FromLong(i);
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
		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);
104
		if (PyLong_AS_LONG(anint) != NLIST-1-i) {
105 106 107 108 109 110 111 112 113 114 115 116 117
			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;
}

118 119 120
static int
test_dict_inner(int count)
{
Martin v. Löwis's avatar
Martin v. Löwis committed
121 122
	Py_ssize_t pos = 0, iterations = 0;
	int i;
123 124 125 126 127 128 129
	PyObject *dict = PyDict_New();
	PyObject *v, *k;

	if (dict == NULL)
		return -1;

	for (i = 0; i < count; i++) {
130
		v = PyLong_FromLong(i);
131 132 133 134 135 136 137 138
		PyDict_SetItem(dict, v, v);
		Py_DECREF(v);
	}

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

139 140
		i = PyLong_AS_LONG(v) + 1;
		o = PyLong_FromLong(i);
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
		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*
163
test_dict_iteration(PyObject* self)
164 165 166 167 168 169 170 171 172 173 174 175 176
{
	int i;

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

	Py_INCREF(Py_None);
	return Py_None;
}

177

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

   Note that the meat of the test is contained in testcapi_long.h.
   This is revolting, but delicate code duplication is worse:  "almost
183
   exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
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 209 210
   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 *
211
test_long_api(PyObject* self)
212
{
213
	return TESTNAME(raise_test_long_error);
214 215 216 217 218 219 220 221 222 223
}

#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
224

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

231
#define TESTNAME	test_longlong_api_inner
232
#define TYPENAME	PY_LONG_LONG
233 234 235 236 237 238
#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
239

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

246 247 248 249 250 251
#undef TESTNAME
#undef TYPENAME
#undef F_S_TO_PY
#undef F_PY_TO_S
#undef F_U_TO_PY
#undef F_PY_TO_U
252

253
/* Test the L code for PyArg_ParseTuple.  This should deliver a PY_LONG_LONG
254 255 256 257
   for both long and int arguments.  The test may leak a little memory if
   it fails.
*/
static PyObject *
258
test_L_code(PyObject *self)
259 260
{
	PyObject *tuple, *num;
261
	PY_LONG_LONG value;
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280

        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);
281
        num = PyLong_FromLong(42);
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
        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;
}

299
#endif	/* ifdef HAVE_LONG_LONG */
300

301 302 303 304 305 306 307 308 309 310
/* 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);
}

Christian Heimes's avatar
Christian Heimes committed
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
/* test PyArg_ParseTupleAndKeywords */
static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
{
	static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
	static char *fmt="(ii)i|(i(ii))(iii)i";
	int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

	if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
		&int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
		&int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
		return NULL;
	return Py_BuildValue("iiiiiiiiii",
		int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
		int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
}

327 328 329
/* Functions to call PyArg_ParseTuple with integer format codes,
   and return the result.
*/
330
static PyObject *
331
getargs_b(PyObject *self, PyObject *args)
332
{
333 334 335 336 337
	unsigned char value;
	if (!PyArg_ParseTuple(args, "b", &value))
		return NULL;
	return PyLong_FromUnsignedLong((unsigned long)value);
}
338

339 340 341 342 343
static PyObject *
getargs_B(PyObject *self, PyObject *args)
{
	unsigned char value;
	if (!PyArg_ParseTuple(args, "B", &value))
344
		return NULL;
345
	return PyLong_FromUnsignedLong((unsigned long)value);
346 347 348
}

static PyObject *
349
getargs_H(PyObject *self, PyObject *args)
350
{
351 352 353 354 355
	unsigned short value;
	if (!PyArg_ParseTuple(args, "H", &value))
		return NULL;
	return PyLong_FromUnsignedLong((unsigned long)value);
}
356

357 358 359 360 361
static PyObject *
getargs_I(PyObject *self, PyObject *args)
{
	unsigned int value;
	if (!PyArg_ParseTuple(args, "I", &value))
362
		return NULL;
363 364 365 366 367 368 369 370 371 372
	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);
373 374 375
}

static PyObject *
376
getargs_i(PyObject *self, PyObject *args)
377
{
378 379 380 381 382
	int value;
	if (!PyArg_ParseTuple(args, "i", &value))
		return NULL;
	return PyLong_FromLong((long)value);
}
383

384 385 386 387 388
static PyObject *
getargs_l(PyObject *self, PyObject *args)
{
	long value;
	if (!PyArg_ParseTuple(args, "l", &value))
389
		return NULL;
390
	return PyLong_FromLong(value);
391 392
}

393 394 395 396 397
static PyObject *
getargs_n(PyObject *self, PyObject *args)
{
	Py_ssize_t value;
	if (!PyArg_ParseTuple(args, "n", &value))
398 399
		return NULL;
	return PyLong_FromSsize_t(value);
400 401
}

402
#ifdef HAVE_LONG_LONG
403
static PyObject *
404
getargs_L(PyObject *self, PyObject *args)
405
{
406 407 408 409 410
	PY_LONG_LONG value;
	if (!PyArg_ParseTuple(args, "L", &value))
		return NULL;
	return PyLong_FromLongLong(value);
}
411

412 413 414 415 416
static PyObject *
getargs_K(PyObject *self, PyObject *args)
{
	unsigned PY_LONG_LONG value;
	if (!PyArg_ParseTuple(args, "K", &value))
417
		return NULL;
418
	return PyLong_FromUnsignedLongLong(value);
419 420 421 422
}
#endif

/* This function not only tests the 'k' getargs code, but also the
423
   PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
424 425 426 427 428 429 430 431 432 433
static PyObject *
test_k_code(PyObject *self)
{
	PyObject *tuple, *num;
	unsigned long value;

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

434
	/* a number larger than ULONG_MAX even on 64-bit platforms */
435 436 437 438
        num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
        if (num == NULL)
        	return NULL;

439
	value = PyLong_AsUnsignedLongMask(num);
440
	if (value != ULONG_MAX)
441
        	return raiseTestError("test_k_code",
442
	    "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
443 444 445

        PyTuple_SET_ITEM(tuple, 0, num);

446
        value = 0;
447 448
        if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
        	return NULL;
449
        if (value != ULONG_MAX)
450 451 452 453 454 455 456 457
        	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;

458
	value = PyLong_AsUnsignedLongMask(num);
459 460
	if (value != (unsigned long)-0x42)
        	return raiseTestError("test_k_code",
461
	    "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
462 463 464

        PyTuple_SET_ITEM(tuple, 0, num);

465
	value = 0;
466 467 468 469 470 471 472 473 474 475 476
        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;
}

477

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
/* Test the s and z codes for PyArg_ParseTuple.
*/
static PyObject *
test_s_code(PyObject *self)
{
    /* Unicode strings should be accepted */
    PyObject *tuple, *obj;
    char *value;

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

    obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
			   "latin-1", NULL);
    if (obj == NULL)
	return NULL;

    PyTuple_SET_ITEM(tuple, 0, obj);

    /* These two blocks used to raise a TypeError:
     * "argument must be string without null bytes, not str" 
     */
    if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
    	return NULL;

    if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
    	return NULL;

507
    Py_DECREF(tuple);
508 509 510
    Py_RETURN_NONE;
}

511 512 513 514
/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
   of an error.
*/
static PyObject *
515
test_u_code(PyObject *self)
516 517 518
{
	PyObject *tuple, *obj;
	Py_UNICODE *value;
519
	Py_ssize_t len;
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544

        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'");
545

546 547 548 549 550
	Py_DECREF(tuple);
	Py_INCREF(Py_None);
	return Py_None;
}

551 552 553 554 555 556
/* Test Z and Z# codes for PyArg_ParseTuple */
static PyObject *
test_Z_code(PyObject *self)
{
	PyObject *tuple, *obj;
	Py_UNICODE *value1, *value2;
557
	Py_ssize_t len1, len2;
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603

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

	obj = PyUnicode_FromString("test");
	PyTuple_SET_ITEM(tuple, 0, obj);
	Py_INCREF(Py_None);
	PyTuple_SET_ITEM(tuple, 1, Py_None);

	/* swap values on purpose */
        value1 = NULL;
	value2 = PyUnicode_AS_UNICODE(obj);

	/* Test Z for both values */
        if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
		return NULL;
        if (value1 != PyUnicode_AS_UNICODE(obj))
        	return raiseTestError("test_Z_code",
			"Z code returned wrong value for 'test'");
        if (value2 != NULL)
        	return raiseTestError("test_Z_code",
			"Z code returned wrong value for None");

        value1 = NULL;
	value2 = PyUnicode_AS_UNICODE(obj);
	len1 = -1;
	len2 = -1;

	/* Test Z# for both values */
        if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1, 
			     &value2, &len2) < 0)
        	return NULL;
        if (value1 != PyUnicode_AS_UNICODE(obj) ||
	    len1 != PyUnicode_GET_SIZE(obj))
        	return raiseTestError("test_Z_code",
			"Z# code returned wrong values for 'test'");
        if (value2 != NULL ||
	    len2 != 0)
        	return raiseTestError("test_Z_code",
			"Z# code returned wrong values for None'");

	Py_DECREF(tuple);
	Py_RETURN_NONE;
}

604 605
static PyObject *
codec_incrementalencoder(PyObject *self, PyObject *args)
606 607 608 609 610 611 612 613
{
	const char *encoding, *errors = NULL;
	if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
			      &encoding, &errors))
		return NULL;
	return PyCodec_IncrementalEncoder(encoding, errors);
}

614 615
static PyObject *
codec_incrementaldecoder(PyObject *self, PyObject *args)
616 617 618 619 620 621 622 623
{
	const char *encoding, *errors = NULL;
	if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
			      &encoding, &errors))
		return NULL;
	return PyCodec_IncrementalDecoder(encoding, errors);
}

624

625
/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
626 627 628
static PyObject *
test_long_numbits(PyObject *self)
{
629
	struct triple {
630
		long input;
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
		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}};
648 649
	int i;

650 651
	for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
		PyObject *plong = PyLong_FromLong(testcases[i].input);
652
		size_t nbits = _PyLong_NumBits(plong);
653
		int sign = _PyLong_Sign(plong);
654 655

		Py_DECREF(plong);
656
		if (nbits != testcases[i].nbits)
657
			return raiseTestError("test_long_numbits",
658 659 660 661
					"wrong result for _PyLong_NumBits");
		if (sign != testcases[i].sign)
			return raiseTestError("test_long_numbits",
					"wrong result for _PyLong_Sign");
662 663 664 665 666
	}
	Py_INCREF(Py_None);
	return Py_None;
}

667
/* Example passing NULLs to PyObject_Str(NULL). */
668 669 670 671

static PyObject *
test_null_strings(PyObject *self)
{
672
	PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
673 674 675 676 677 678
	PyObject *tuple = PyTuple_Pack(2, o1, o2);
	Py_XDECREF(o1);
	Py_XDECREF(o2);
	return tuple;
}

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
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) {
694
		v = PyLong_FromLong(i);
695 696 697 698 699 700 701
		if (v == NULL) {
			Py_DECREF(exc_args);
			return NULL;
		}
		PyTuple_SET_ITEM(exc_args, i, v);
	}
	PyErr_SetObject(exc, exc_args);
702
	Py_DECREF(exc_args);
703 704
	return NULL;
}
705

706 707
#ifdef WITH_THREAD

708 709 710 711 712 713 714 715 716 717 718
/* 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)
719 720 721
{
	PyObject *rc;
	PyGILState_STATE s = PyGILState_Ensure();
722
	rc = PyObject_CallFunction((PyObject *)callable, "");
723 724 725 726
	Py_XDECREF(rc);
	PyGILState_Release(s);
}

727 728 729 730 731 732 733 734 735 736
/* 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);
}

737 738 739 740
static PyObject *
test_thread_state(PyObject *self, PyObject *args)
{
	PyObject *fn;
741

742 743
	if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
		return NULL;
744 745

	/* Ensure Python is set up for threading */
746
	PyEval_InitThreads();
747 748 749 750 751 752 753
	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);
754 755 756 757 758
	/* 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);
759
	PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
760
	Py_END_ALLOW_THREADS
761

762
	/* And once more with and without a thread
763 764
	   XXX - should use a lock and work out exactly what we are trying
	   to test <wink>
765 766
	*/
	Py_BEGIN_ALLOW_THREADS
767
	PyThread_start_new_thread(_make_call_from_thread, fn);
768
	_make_call(fn);
769
	PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
770
	Py_END_ALLOW_THREADS
771

772 773 774
	/* Release lock we acquired above.  This is required on HP-UX. */
	PyThread_release_lock(thread_done);

775 776
	PyThread_free_lock(thread_done);
	Py_RETURN_NONE;
777 778 779
}
#endif

Neal Norwitz's avatar
Neal Norwitz committed
780
/* Some tests of PyUnicode_FromFormat().  This needs more tests. */
781 782 783 784 785 786 787
static PyObject *
test_string_from_format(PyObject *self, PyObject *args)
{
	PyObject *result;
	char *msg;

#define CHECK_1_FORMAT(FORMAT, TYPE) 			\
Neal Norwitz's avatar
Neal Norwitz committed
788
	result = PyUnicode_FromFormat(FORMAT, (TYPE)1);	\
789 790
	if (result == NULL)				\
		return NULL;				\
Neal Norwitz's avatar
Neal Norwitz committed
791
	if (strcmp(PyUnicode_AsString(result), "1")) {	\
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
		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
}

816 817 818 819 820 821 822
/* This is here to provide a docstring for test_descr. */
static PyObject *
test_with_docstring(PyObject *self)
{
	Py_RETURN_NONE;
}

823 824 825 826 827 828 829 830 831 832
#ifdef HAVE_GETTIMEOFDAY
/* Profiling of integer performance */
void print_delta(int test, struct timeval *s, struct timeval *e)
{
	e->tv_sec -= s->tv_sec;
	e->tv_usec -= s->tv_usec;
	if (e->tv_usec < 0) {
		e->tv_sec -=1;
		e->tv_usec += 1000000;
	}
833
	printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
834 835 836 837 838 839 840 841 842 843 844 845 846 847
}

static PyObject *
profile_int(PyObject *self, PyObject* args)
{
	int i, k;
	struct timeval start, stop;
	PyObject *single, **multiple, *op1, *result;

	/* Test 1: Allocate and immediately deallocate
	   many small integers */
	gettimeofday(&start, NULL);
	for(k=0; k < 20000; k++)
		for(i=0; i < 1000; i++) {
848
			single = PyLong_FromLong(i);
849 850 851 852 853 854 855 856 857 858
			Py_DECREF(single);
		}
	gettimeofday(&stop, NULL);
	print_delta(1, &start, &stop);

	/* Test 2: Allocate and immediately deallocate
	   many large integers */
	gettimeofday(&start, NULL);
	for(k=0; k < 20000; k++)
		for(i=0; i < 1000; i++) {
859
			single = PyLong_FromLong(i+1000000);
860 861 862 863 864 865 866 867 868 869 870
			Py_DECREF(single);
		}
	gettimeofday(&stop, NULL);
	print_delta(2, &start, &stop);

	/* Test 3: Allocate a few integers, then release
	   them all simultaneously. */
	multiple = malloc(sizeof(PyObject*) * 1000);
	gettimeofday(&start, NULL);
	for(k=0; k < 20000; k++) {
		for(i=0; i < 1000; i++) {
871
			multiple[i] = PyLong_FromLong(i+1000000);
872 873 874 875 876 877 878 879 880 881 882 883 884 885
		}
		for(i=0; i < 1000; i++) {
			Py_DECREF(multiple[i]);
		}
	}
	gettimeofday(&stop, NULL);
	print_delta(3, &start, &stop);

	/* Test 4: Allocate many integers, then release
	   them all simultaneously. */
	multiple = malloc(sizeof(PyObject*) * 1000000);
	gettimeofday(&start, NULL);
	for(k=0; k < 20; k++) {
		for(i=0; i < 1000000; i++) {
886
			multiple[i] = PyLong_FromLong(i+1000000);
887 888 889 890 891 892 893 894 895 896 897 898 899
		}
		for(i=0; i < 1000000; i++) {
			Py_DECREF(multiple[i]);
		}
	}
	gettimeofday(&stop, NULL);
	print_delta(4, &start, &stop);

	/* Test 5: Allocate many integers < 32000 */
	multiple = malloc(sizeof(PyObject*) * 1000000);
	gettimeofday(&start, NULL);
	for(k=0; k < 10; k++) {
		for(i=0; i < 1000000; i++) {
900
			multiple[i] = PyLong_FromLong(i+1000);
901 902 903 904 905 906 907 908 909
		}
		for(i=0; i < 1000000; i++) {
			Py_DECREF(multiple[i]);
		}
	}
	gettimeofday(&stop, NULL);
	print_delta(5, &start, &stop);

	/* Test 6: Perform small int addition */
910
	op1 = PyLong_FromLong(1);
911 912 913 914 915 916 917 918 919 920
	gettimeofday(&start, NULL);
	for(i=0; i < 10000000; i++) {
		result = PyNumber_Add(op1, op1);
		Py_DECREF(result);
	}
	gettimeofday(&stop, NULL);
	Py_DECREF(op1);
	print_delta(6, &start, &stop);

	/* Test 7: Perform medium int addition */
921
	op1 = PyLong_FromLong(1000);
922 923 924 925 926 927 928 929 930 931 932 933 934 935
	gettimeofday(&start, NULL);
	for(i=0; i < 10000000; i++) {
		result = PyNumber_Add(op1, op1);
		Py_DECREF(result);
	}
	gettimeofday(&stop, NULL);
	Py_DECREF(op1);
	print_delta(7, &start, &stop);

	Py_INCREF(Py_None);
	return Py_None;
}
#endif

Christian Heimes's avatar
Christian Heimes committed
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
/* To test the format of tracebacks as printed out. */
static PyObject *
traceback_print(PyObject *self, PyObject *args)
{
	PyObject *file;
	PyObject *traceback;
	int result;
	
	if (!PyArg_ParseTuple(args, "OO:traceback_print",
				&traceback, &file))
		return NULL;
		
	result = PyTraceBack_Print(traceback, file);
	if (result < 0)
		return NULL;
	Py_RETURN_NONE;
}

954
static PyMethodDef TestMethods[] = {
955 956 957 958 959
	{"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},
960
	{"test_long_numbits",	(PyCFunction)test_long_numbits,	 METH_NOARGS},
961
	{"test_k_code",		(PyCFunction)test_k_code,	 METH_NOARGS},
962
	{"test_null_strings",	(PyCFunction)test_null_strings,	 METH_NOARGS},
963
	{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
964 965
	{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
	 PyDoc_STR("This is a pretty normal docstring.")},
966

967
	{"getargs_tuple",	getargs_tuple,			 METH_VARARGS},
Christian Heimes's avatar
Christian Heimes committed
968 969
	{"getargs_keywords", (PyCFunction)getargs_keywords, 
	  METH_VARARGS|METH_KEYWORDS},
970 971 972 973 974 975 976 977
	{"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},
978
#ifdef HAVE_LONG_LONG
979 980 981
	{"getargs_L",		getargs_L,			 METH_VARARGS},
	{"getargs_K",		getargs_K,			 METH_VARARGS},
	{"test_longlong_api",	test_longlong_api,		 METH_NOARGS},
982
	{"test_L_code",		(PyCFunction)test_L_code,	 METH_NOARGS},
983 984 985 986
	{"codec_incrementalencoder",
	 (PyCFunction)codec_incrementalencoder,	 METH_VARARGS},
	{"codec_incrementaldecoder",
	 (PyCFunction)codec_incrementaldecoder,	 METH_VARARGS},
987
#endif
988
	{"test_s_code",		(PyCFunction)test_s_code,	 METH_NOARGS},
989
	{"test_u_code",		(PyCFunction)test_u_code,	 METH_NOARGS},
990
	{"test_Z_code",		(PyCFunction)test_Z_code,	 METH_NOARGS},
991
#ifdef WITH_THREAD
992
	{"_test_thread_state",  test_thread_state, 		 METH_VARARGS},
993 994 995
#endif
#ifdef HAVE_GETTIMEOFDAY
	{"profile_int",		profile_int,			METH_NOARGS},
996
#endif
Christian Heimes's avatar
Christian Heimes committed
997
	{"traceback_print", traceback_print, 	         METH_VARARGS},
998 999 1000
	{NULL, NULL} /* sentinel */
};

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

1003
typedef struct {
1004
	char bool_member;
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
	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;
1015 1016 1017 1018
#ifdef HAVE_LONG_LONG
	PY_LONG_LONG longlong_member;
	unsigned PY_LONG_LONG ulonglong_member;
#endif
1019 1020 1021 1022 1023 1024 1025 1026
} all_structmembers;

typedef struct {
    PyObject_HEAD
	all_structmembers structmembers;
} test_structmembers;

static struct PyMemberDef test_members[] = {
1027
	{"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
	{"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},
1038 1039 1040 1041
#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
1042 1043 1044 1045
	{NULL}
};


1046 1047 1048 1049 1050 1051 1052 1053
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	
1054
		"T_LONGLONG", "T_ULONGLONG",
1055
#endif
1056
		NULL};
1057 1058
	static char *fmt = "|bbBhHiIlkfd"
#ifdef HAVE_LONG_LONG
1059
		"LK"
1060
#endif
1061
		;
1062 1063 1064
	test_structmembers *ob;
	ob = PyObject_New(test_structmembers, type);
	if (ob == NULL)
1065 1066
		return NULL;
	memset(&ob->structmembers, 0, sizeof(all_structmembers));
1067
	if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
					 &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
		)) {
1084 1085
		Py_DECREF(ob);
		return NULL;
1086
	}
1087 1088 1089
	return (PyObject *)ob;
}

1090 1091 1092
static void
test_structmembers_free(PyObject *ob)
{
1093 1094 1095 1096
	PyObject_FREE(ob);
}

static PyTypeObject test_structmembersType = {
1097
    PyVarObject_HEAD_INIT(NULL, 0)
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
	"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 */
1113 1114
	PyObject_GenericGetAttr,	/* tp_getattro */
	PyObject_GenericSetAttr,	/* tp_setattro */
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
	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 */
1125
	test_members,			/* tp_members */
1126 1127 1128 1129 1130 1131 1132 1133
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
1134
	test_structmembers_new,	       	/* tp_new */
1135 1136 1137
};


1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150

static struct PyModuleDef _testcapimodule = {
	PyModuleDef_HEAD_INIT,
	"_testcapi",
	NULL,
	-1,
	TestMethods,
	NULL,
	NULL,
	NULL,
	NULL
};

1151
PyMODINIT_FUNC
1152
PyInit__testcapi(void)
1153
{
1154
	PyObject *m;
1155

1156
	m = PyModule_Create(&_testcapimodule);
1157
	if (m == NULL)
1158
		return NULL;
1159

1160
	Py_TYPE(&test_structmembersType)=&PyType_Type;
1161 1162 1163
	Py_INCREF(&test_structmembersType);
	PyModule_AddObject(m, "test_structmembersType", (PyObject *)&test_structmembersType);

1164 1165 1166 1167 1168 1169
	PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
	PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
	PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
	PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
	PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
	PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
1170 1171
	PyModule_AddObject(m, "INT_MAX",  PyLong_FromLong(INT_MAX));
	PyModule_AddObject(m, "INT_MIN",  PyLong_FromLong(INT_MIN));
1172
	PyModule_AddObject(m, "UINT_MAX",  PyLong_FromUnsignedLong(UINT_MAX));
1173 1174
	PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
	PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
1175 1176 1177 1178 1179
	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));
1180 1181 1182
	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));
1183 1184
	PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
	PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
1185

1186
	TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
1187 1188
	Py_INCREF(TestError);
	PyModule_AddObject(m, "error", TestError);
1189
	return m;
1190
}