Index: Lib/test/test_structmembers.py =================================================================== --- Lib/test/test_structmembers.py (revision 78901) +++ Lib/test/test_structmembers.py (working copy) @@ -3,13 +3,25 @@ SHRT_MAX, SHRT_MIN, USHRT_MAX, \ INT_MAX, INT_MIN, UINT_MAX, \ LONG_MAX, LONG_MIN, ULONG_MAX, \ - LLONG_MAX, LLONG_MIN, ULLONG_MAX + LLONG_MAX, LLONG_MIN, ULLONG_MAX, \ + PY_SSIZE_T_MAX, PY_SSIZE_T_MIN import warnings, unittest, sys from test import support -ts=test_structmembersType(False, 1, 2, 3, 4, 5, 6, 7, 8, - 9.99999, 10.1010101010) +ts=test_structmembersType(False, # T_BOOL + 1, # T_BYTE + 2, # T_UBYTE + 3, # T_SHORT + 4, # T_USHORT + 5, # T_INT + 6, # T_UINT + 7, # T_LONG + 8, # T_ULONG + 23, # T_PYSSIZET + 9.99999,# T_FLOAT + 10.1010101010 # T_DOUBLE + ) class ReadWriteTests(unittest.TestCase): def test_types(self): @@ -47,6 +59,11 @@ ts.T_ULONG = ULONG_MAX self.assertEquals(ts.T_ULONG, ULONG_MAX) + ts.T_PYSSIZET = PY_SSIZE_T_MAX + self.assertEquals(ts.T_PYSSIZET, PY_SSIZE_T_MAX) + ts.T_PYSSIZET = PY_SSIZE_T_MIN + self.assertEquals(ts.T_PYSSIZET, PY_SSIZE_T_MIN) + ## T_LONGLONG and T_ULONGLONG may not be present on some platforms if hasattr(ts, 'T_LONGLONG'): ts.T_LONGLONG = LLONG_MAX @@ -63,7 +80,26 @@ ts.T_ULONGLONG = 4 self.assertEquals(ts.T_ULONGLONG, 4) + def test_bad_assignments(self): + integer_attributes = [ + 'T_BOOL', + 'T_BYTE', 'T_UBYTE', + 'T_SHORT', 'T_USHORT', + 'T_INT', 'T_UINT', + 'T_LONG', 'T_ULONG', + 'T_PYSSIZET' + ] + if hasattr(ts, 'T_LONGLONG'): + integer_attributes.extend(['T_LONGLONG', 'T_ULONGLONG']) + + # issue8014: this produced 'bad argument to internal function' + # internal error + for nonint in None, 3.2j, "full of eels", {}, []: + for attr in integer_attributes: + self.assertRaises(TypeError, setattr, ts, attr, nonint) + + class TestWarnings(unittest.TestCase): def has_warned(self, w): self.assertEqual(w.category, RuntimeWarning) Index: Modules/_testcapimodule.c =================================================================== --- Modules/_testcapimodule.c (revision 78901) +++ Modules/_testcapimodule.c (working copy) @@ -2084,6 +2084,7 @@ unsigned int uint_member; long long_member; unsigned long ulong_member; + Py_ssize_t pyssizet_member; float float_member; double double_member; #ifdef HAVE_LONG_LONG @@ -2107,6 +2108,7 @@ {"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_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_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}, #ifdef HAVE_LONG_LONG @@ -2122,13 +2124,13 @@ { static char *keywords[] = { "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT", - "T_INT", "T_UINT", "T_LONG", "T_ULONG", + "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET", "T_FLOAT", "T_DOUBLE", -#ifdef HAVE_LONG_LONG +#ifdef HAVE_LONG_LONG "T_LONGLONG", "T_ULONGLONG", #endif NULL}; - static char *fmt = "|bbBhHiIlkfd" + static char *fmt = "|bbBhHiIlknfd" #ifdef HAVE_LONG_LONG "LK" #endif @@ -2145,9 +2147,10 @@ &ob->structmembers.short_member, &ob->structmembers.ushort_member, &ob->structmembers.int_member, - &ob->structmembers.uint_member, + &ob->structmembers.uint_member, &ob->structmembers.long_member, &ob->structmembers.ulong_member, + &ob->structmembers.pyssizet_member, &ob->structmembers.float_member, &ob->structmembers.double_member #ifdef HAVE_LONG_LONG