Index: Objects/longobject.c =================================================================== --- Objects/longobject.c (revision 66563) +++ Objects/longobject.c (working copy) @@ -3646,6 +3646,14 @@ { Py_ssize_t res; + if (v == NULL) + return NULL; + if (ABS(Py_SIZE(v)) <= 1) { + int ival = MEDIUM_VALUE(v); + if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { + return PyLong_FromSsize_t(sizeof(PyLongObject)); + } + } res = sizeof(PyVarObject) + abs(Py_SIZE(v))*sizeof(digit); return PyLong_FromSsize_t(res); } Index: Lib/test/test_sys.py =================================================================== --- Lib/test/test_sys.py (revision 66563) +++ Lib/test/test_sys.py (working copy) @@ -414,7 +414,7 @@ size = self.calcsize gc_header_size = self.gc_headsize # bool objects are not gc tracked - self.assertEqual(sys.getsizeof(True), size(vh) + self.H) + self.assertEqual(sys.getsizeof(True), size(vh + 'H')) # but lists are self.assertEqual(sys.getsizeof([]), size(vh + 'PP') + gc_header_size) @@ -422,8 +422,8 @@ h = self.header vh = self.vheader size = self.calcsize - self.assertEqual(sys.getsizeof(True), size(vh) + self.H) - self.assertEqual(sys.getsizeof(True, -1), size(vh) + self.H) + self.assertEqual(sys.getsizeof(True), size(vh + 'H')) + self.assertEqual(sys.getsizeof(True, -1), size(vh + 'H')) def test_objecttypes(self): # check all types defined in Objects/ @@ -432,7 +432,8 @@ size = self.calcsize check = self.check_sizeof # bool - check(True, size(vh) + self.H) + check(True, size(vh + 'H')) + check(False, size(vh + 'H')) # buffer # XXX # builtin_function_or_method @@ -548,10 +549,12 @@ check(iter([]), size(h + 'lP')) # listreverseiterator (list) check(reversed([]), size(h + 'lP')) - # long - check(0, size(vh)) - check(1, size(vh) + self.H) - check(-1, size(vh) + self.H) + # long; note that small_ints allocate a different amount of memory + check(0, size(vh + 'H')) + check(1, size(vh + 'H')) + check(-1, size(vh + 'H')) + check(1000, size(vh) + self.H) + check(-1000, size(vh) + self.H) check(32768, size(vh) + 2*self.H) check(32768*32768-1, size(vh) + 2*self.H) check(32768*32768, size(vh) + 3*self.H)