diff options
Diffstat (limited to 'examples/python2.7/patches/revert-sizeof-methods.diff')
-rw-r--r-- | examples/python2.7/patches/revert-sizeof-methods.diff | 1062 |
1 files changed, 1062 insertions, 0 deletions
diff --git a/examples/python2.7/patches/revert-sizeof-methods.diff b/examples/python2.7/patches/revert-sizeof-methods.diff new file mode 100644 index 0000000..c0b3735 --- /dev/null +++ b/examples/python2.7/patches/revert-sizeof-methods.diff @@ -0,0 +1,1062 @@ +diff -urN a/Include/node.h b/Include/node.h +--- a/Include/node.h 2012-12-25 13:41:08.431405725 +0100 ++++ b/Include/node.h 2012-12-25 13:48:19.839405366 +0100 +@@ -20,9 +20,6 @@ + PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); + PyAPI_FUNC(void) PyNode_Free(node *n); +-#ifndef Py_LIMITED_API +-Py_ssize_t _PyNode_SizeOf(node *n); +-#endif + + /* Node access functions */ + #define NCH(n) ((n)->n_nchildren) +diff -urN a/Lib/test/test_array.py b/Lib/test/test_array.py +--- a/Lib/test/test_array.py 2012-12-25 13:41:08.471405725 +0100 ++++ b/Lib/test/test_array.py 2012-12-25 13:48:09.671405378 +0100 +@@ -985,19 +985,6 @@ + upper = long(pow(2, a.itemsize * 8)) - 1L + self.check_overflow(lower, upper) + +- @test_support.cpython_only +- def test_sizeof_with_buffer(self): +- a = array.array(self.typecode, self.example) +- basesize = test_support.calcvobjsize('4P') +- buffer_size = a.buffer_info()[1] * a.itemsize +- test_support.check_sizeof(self, a, basesize + buffer_size) +- +- @test_support.cpython_only +- def test_sizeof_without_buffer(self): +- a = array.array(self.typecode) +- basesize = test_support.calcvobjsize('4P') +- test_support.check_sizeof(self, a, basesize) +- + + class ByteTest(SignedNumberTest): + typecode = 'b' +diff -urN a/Lib/test/test_deque.py b/Lib/test/test_deque.py +--- a/Lib/test/test_deque.py 2012-12-25 13:41:08.471405725 +0100 ++++ b/Lib/test/test_deque.py 2012-12-25 13:48:19.843405367 +0100 +@@ -6,7 +6,6 @@ + import copy + import cPickle as pickle + import random +-import struct + + BIG = 100000 + +@@ -518,21 +517,6 @@ + gc.collect() + self.assertTrue(ref() is None, "Cycle was not collected") + +- check_sizeof = test_support.check_sizeof +- +- @test_support.cpython_only +- def test_sizeof(self): +- BLOCKLEN = 62 +- basesize = test_support.calcobjsize('2P4PlP') +- blocksize = struct.calcsize('2P%dP' % BLOCKLEN) +- self.assertEqual(object.__sizeof__(deque()), basesize) +- check = self.check_sizeof +- check(deque(), basesize + blocksize) +- check(deque('a'), basesize + blocksize) +- check(deque('a' * (BLOCKLEN // 2)), basesize + blocksize) +- check(deque('a' * (BLOCKLEN // 2 + 1)), basesize + 2 * blocksize) +- check(deque('a' * (42 * BLOCKLEN)), basesize + 43 * blocksize) +- + class TestVariousIteratorArgs(unittest.TestCase): + + def test_constructor(self): +diff -urN a/Lib/test/test_io.py b/Lib/test/test_io.py +--- a/Lib/test/test_io.py 2012-12-25 13:41:08.487405725 +0100 ++++ b/Lib/test/test_io.py 2012-12-25 13:48:30.887405360 +0100 +@@ -748,20 +748,6 @@ + buf.raw = x + + +-class SizeofTest: +- +- @support.cpython_only +- def test_sizeof(self): +- bufsize1 = 4096 +- bufsize2 = 8192 +- rawio = self.MockRawIO() +- bufio = self.tp(rawio, buffer_size=bufsize1) +- size = sys.getsizeof(bufio) - bufsize1 +- rawio = self.MockRawIO() +- bufio = self.tp(rawio, buffer_size=bufsize2) +- self.assertEqual(sys.getsizeof(bufio), size + bufsize2) +- +- + class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): + read_mode = "rb" + +@@ -945,7 +931,7 @@ + "failed for {}: {} != 0".format(n, rawio._extraneous_reads)) + + +-class CBufferedReaderTest(BufferedReaderTest, SizeofTest): ++class CBufferedReaderTest(BufferedReaderTest): + tp = io.BufferedReader + + def test_constructor(self): +@@ -1208,7 +1194,7 @@ + self.tp(self.MockRawIO(), 8, 12) + + +-class CBufferedWriterTest(BufferedWriterTest, SizeofTest): ++class CBufferedWriterTest(BufferedWriterTest): + tp = io.BufferedWriter + + def test_constructor(self): +@@ -1596,8 +1582,8 @@ + f.flush() + self.assertEqual(raw.getvalue(), b'1b\n2def\n3\n') + +-class CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest, +- BufferedRandomTest, SizeofTest): ++ ++class CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest, BufferedRandomTest): + tp = io.BufferedRandom + + def test_constructor(self): +diff -urN a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py +--- a/Lib/test/test_memoryio.py 2012-12-25 13:41:08.487405725 +0100 ++++ b/Lib/test/test_memoryio.py 2012-12-25 13:48:30.891405359 +0100 +@@ -638,17 +638,6 @@ + memio.close() + self.assertRaises(ValueError, memio.__setstate__, (b"closed", 0, None)) + +- check_sizeof = support.check_sizeof +- +- @support.cpython_only +- def test_sizeof(self): +- basesize = support.calcobjsize(b'P2PP2P') +- check = self.check_sizeof +- self.assertEqual(object.__sizeof__(io.BytesIO()), basesize) +- check(io.BytesIO(), basesize ) +- check(io.BytesIO(b'a'), basesize + 1 + 1 ) +- check(io.BytesIO(b'a' * 1000), basesize + 1000 + 1 ) +- + + class CStringIOTest(PyStringIOTest): + ioclass = io.StringIO +diff -urN a/Lib/test/test_parser.py b/Lib/test/test_parser.py +--- a/Lib/test/test_parser.py 2012-12-25 13:41:08.487405725 +0100 ++++ b/Lib/test/test_parser.py 2012-12-25 13:48:19.847405368 +0100 +@@ -1,8 +1,7 @@ + import parser + import unittest + import sys +-import struct +-from test import test_support as support ++from test import test_support + + # + # First, we test that we can generate trees from valid source fragments, +@@ -584,57 +583,12 @@ + print >>sys.stderr, "Expecting 's_push: parser stack overflow' in next line" + self.assertRaises(MemoryError, parser.expr, e) + +-class STObjectTestCase(unittest.TestCase): +- """Test operations on ST objects themselves""" +- +- check_sizeof = support.check_sizeof +- +- @support.cpython_only +- def test_sizeof(self): +- def XXXROUNDUP(n): +- if n <= 1: +- return n +- if n <= 128: +- return (n + 3) & ~3 +- return 1 << (n - 1).bit_length() +- +- basesize = support.calcobjsize('Pii') +- nodesize = struct.calcsize('hP3iP0h') +- def sizeofchildren(node): +- if node is None: +- return 0 +- res = 0 +- hasstr = len(node) > 1 and isinstance(node[-1], str) +- if hasstr: +- res += len(node[-1]) + 1 +- children = node[1:-1] if hasstr else node[1:] +- if children: +- res += XXXROUNDUP(len(children)) * nodesize +- for child in children: +- res += sizeofchildren(child) +- return res +- +- def check_st_sizeof(st): +- self.check_sizeof(st, basesize + nodesize + +- sizeofchildren(st.totuple())) +- +- check_st_sizeof(parser.expr('2 + 3')) +- check_st_sizeof(parser.expr('2 + 3 + 4')) +- check_st_sizeof(parser.suite('x = 2 + 3')) +- check_st_sizeof(parser.suite('')) +- check_st_sizeof(parser.suite('# -*- coding: utf-8 -*-')) +- check_st_sizeof(parser.expr('[' + '2,' * 1000 + ']')) +- +- +- # XXX tests for pickling and unpickling of ST objects should go here +- + def test_main(): +- support.run_unittest( ++ test_support.run_unittest( + RoundtripLegalSyntaxTestCase, + IllegalSyntaxTestCase, + CompileTestCase, + ParserStackLimitTestCase, +- STObjectTestCase, + ) + + +diff -urN a/Lib/test/test_struct.py b/Lib/test/test_struct.py +--- a/Lib/test/test_struct.py 2012-12-25 13:41:08.495405725 +0100 ++++ b/Lib/test/test_struct.py 2012-12-25 13:48:48.943405345 +0100 +@@ -3,8 +3,7 @@ + import unittest + import struct + import inspect +-from test import test_support as support +-from test.test_support import (check_warnings, check_py3k_warnings) ++from test.test_support import run_unittest, check_warnings, check_py3k_warnings + + import sys + ISBIGENDIAN = sys.byteorder == "big" +@@ -545,29 +544,8 @@ + hugecount2 = '{}b{}H'.format(sys.maxsize//2, sys.maxsize//2) + self.assertRaises(struct.error, struct.calcsize, hugecount2) + +- def check_sizeof(self, format_str, number_of_codes): +- # The size of 'PyStructObject' +- totalsize = support.calcobjsize('5P') +- # The size taken up by the 'formatcode' dynamic array +- totalsize += struct.calcsize('3P') * (number_of_codes + 1) +- support.check_sizeof(self, struct.Struct(format_str), totalsize) +- +- @support.cpython_only +- def test__sizeof__(self): +- for code in integer_codes: +- self.check_sizeof(code, 1) +- self.check_sizeof('BHILfdspP', 9) +- self.check_sizeof('B' * 1234, 1234) +- self.check_sizeof('fd', 2) +- self.check_sizeof('xxxxxxxxxxxxxx', 0) +- self.check_sizeof('100H', 100) +- self.check_sizeof('187s', 1) +- self.check_sizeof('20p', 1) +- self.check_sizeof('0s', 1) +- self.check_sizeof('0c', 0) +- + def test_main(): +- support.run_unittest(StructTest) ++ run_unittest(StructTest) + + if __name__ == '__main__': + test_main() +diff -urN a/Lib/test/test_support.py b/Lib/test/test_support.py +--- a/Lib/test/test_support.py 2012-12-25 13:41:08.495405725 +0100 ++++ b/Lib/test/test_support.py 2012-12-25 13:48:30.891405359 +0100 +@@ -18,8 +18,6 @@ + import UserDict + import re + import time +-import struct +-import _testcapi + try: + import thread + except ImportError: +@@ -927,32 +925,6 @@ + gc.collect() + + +-_header = '2P' +-if hasattr(sys, "gettotalrefcount"): +- _header = '2P' + _header +-_vheader = _header + 'P' +- +-def calcobjsize(fmt): +- return struct.calcsize(_header + fmt + '0P') +- +-def calcvobjsize(fmt): +- return struct.calcsize(_vheader + fmt + '0P') +- +- +-_TPFLAGS_HAVE_GC = 1<<14 +-_TPFLAGS_HEAPTYPE = 1<<9 +- +-def check_sizeof(test, o, size): +- result = sys.getsizeof(o) +- # add GC header size +- if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\ +- ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))): +- size += _testcapi.SIZEOF_PYGC_HEAD +- msg = 'wrong size for %s: got %d, expected %d' \ +- % (type(o), result, size) +- test.assertEqual(result, size, msg) +- +- + #======================================================================= + # Decorator for running a function in a different locale, correctly resetting + # it afterwards. +diff -urN a/Lib/test/test_sys.py b/Lib/test/test_sys.py +--- a/Lib/test/test_sys.py 2012-12-25 13:41:08.499405725 +0100 ++++ b/Lib/test/test_sys.py 2012-12-25 13:48:30.895405358 +0100 +@@ -490,8 +490,22 @@ + + class SizeofTest(unittest.TestCase): + ++ TPFLAGS_HAVE_GC = 1<<14 ++ TPFLAGS_HEAPTYPE = 1L<<9 ++ + def setUp(self): +- self.P = struct.calcsize('P') ++ self.c = len(struct.pack('c', ' ')) ++ self.H = len(struct.pack('H', 0)) ++ self.i = len(struct.pack('i', 0)) ++ self.l = len(struct.pack('l', 0)) ++ self.P = len(struct.pack('P', 0)) ++ # due to missing size_t information from struct, it is assumed that ++ # sizeof(Py_ssize_t) = sizeof(void*) ++ self.header = 'PP' ++ self.vheader = self.header + 'P' ++ if hasattr(sys, "gettotalrefcount"): ++ self.header += '2P' ++ self.vheader += '2P' + self.longdigit = sys.long_info.sizeof_digit + import _testcapi + self.gc_headsize = _testcapi.SIZEOF_PYGC_HEAD +@@ -501,109 +515,128 @@ + self.file.close() + test.test_support.unlink(test.test_support.TESTFN) + +- check_sizeof = test.test_support.check_sizeof ++ def check_sizeof(self, o, size): ++ result = sys.getsizeof(o) ++ if ((type(o) == type) and (o.__flags__ & self.TPFLAGS_HEAPTYPE) or\ ++ ((type(o) != type) and (type(o).__flags__ & self.TPFLAGS_HAVE_GC))): ++ size += self.gc_headsize ++ msg = 'wrong size for %s: got %d, expected %d' \ ++ % (type(o), result, size) ++ self.assertEqual(result, size, msg) ++ ++ def calcsize(self, fmt): ++ """Wrapper around struct.calcsize which enforces the alignment of the ++ end of a structure to the alignment requirement of pointer. ++ ++ Note: This wrapper should only be used if a pointer member is included ++ and no member with a size larger than a pointer exists. ++ """ ++ return struct.calcsize(fmt + '0P') + + def test_gc_head_size(self): + # Check that the gc header size is added to objects tracked by the gc. +- size = test.test_support.calcobjsize ++ h = self.header ++ size = self.calcsize + gc_header_size = self.gc_headsize + # bool objects are not gc tracked +- self.assertEqual(sys.getsizeof(True), size('l')) ++ self.assertEqual(sys.getsizeof(True), size(h + 'l')) + # but lists are +- self.assertEqual(sys.getsizeof([]), size('P PP') + gc_header_size) ++ self.assertEqual(sys.getsizeof([]), size(h + 'P PP') + gc_header_size) + + def test_default(self): +- size = test.test_support.calcobjsize +- self.assertEqual(sys.getsizeof(True, -1), size('l')) ++ h = self.header ++ size = self.calcsize ++ self.assertEqual(sys.getsizeof(True, -1), size(h + 'l')) + + def test_objecttypes(self): + # check all types defined in Objects/ +- size = test.test_support.calcobjsize +- vsize = test.test_support.calcvobjsize ++ h = self.header ++ vh = self.vheader ++ size = self.calcsize + check = self.check_sizeof + # bool +- check(True, size('l')) ++ check(True, size(h + 'l')) + # buffer + with test.test_support.check_py3k_warnings(): +- check(buffer(''), size('2P2Pil')) ++ check(buffer(''), size(h + '2P2Pil')) + # builtin_function_or_method +- check(len, size('3P')) ++ check(len, size(h + '3P')) + # bytearray + samples = ['', 'u'*100000] + for sample in samples: + x = bytearray(sample) +- check(x, vsize('iPP') + x.__alloc__()) ++ check(x, size(vh + 'iPP') + x.__alloc__() * self.c) + # bytearray_iterator +- check(iter(bytearray()), size('PP')) ++ check(iter(bytearray()), size(h + 'PP')) + # cell + def get_cell(): + x = 42 + def inner(): + return x + return inner +- check(get_cell().func_closure[0], size('P')) ++ check(get_cell().func_closure[0], size(h + 'P')) + # classobj (old-style class) + class class_oldstyle(): + def method(): + pass +- check(class_oldstyle, size('7P')) ++ check(class_oldstyle, size(h + '7P')) + # instance (old-style class) +- check(class_oldstyle(), size('3P')) ++ check(class_oldstyle(), size(h + '3P')) + # instancemethod (old-style class) +- check(class_oldstyle().method, size('4P')) ++ check(class_oldstyle().method, size(h + '4P')) + # complex +- check(complex(0,1), size('2d')) ++ check(complex(0,1), size(h + '2d')) + # code +- check(get_cell().func_code, size('4i8Pi3P')) ++ check(get_cell().func_code, size(h + '4i8Pi3P')) + # BaseException +- check(BaseException(), size('3P')) ++ check(BaseException(), size(h + '3P')) + # UnicodeEncodeError +- check(UnicodeEncodeError("", u"", 0, 0, ""), size('5P2PP')) ++ check(UnicodeEncodeError("", u"", 0, 0, ""), size(h + '5P2PP')) + # UnicodeDecodeError +- check(UnicodeDecodeError("", "", 0, 0, ""), size('5P2PP')) ++ check(UnicodeDecodeError("", "", 0, 0, ""), size(h + '5P2PP')) + # UnicodeTranslateError +- check(UnicodeTranslateError(u"", 0, 1, ""), size('5P2PP')) ++ check(UnicodeTranslateError(u"", 0, 1, ""), size(h + '5P2PP')) + # method_descriptor (descriptor object) +- check(str.lower, size('2PP')) ++ check(str.lower, size(h + '2PP')) + # classmethod_descriptor (descriptor object) + # XXX + # member_descriptor (descriptor object) + import datetime +- check(datetime.timedelta.days, size('2PP')) ++ check(datetime.timedelta.days, size(h + '2PP')) + # getset_descriptor (descriptor object) + import __builtin__ +- check(__builtin__.file.closed, size('2PP')) ++ check(__builtin__.file.closed, size(h + '2PP')) + # wrapper_descriptor (descriptor object) +- check(int.__add__, size('2P2P')) ++ check(int.__add__, size(h + '2P2P')) + # dictproxy + class C(object): pass +- check(C.__dict__, size('P')) ++ check(C.__dict__, size(h + 'P')) + # method-wrapper (descriptor object) +- check({}.__iter__, size('2P')) ++ check({}.__iter__, size(h + '2P')) + # dict +- check({}, size('3P2P' + 8*'P2P')) ++ check({}, size(h + '3P2P' + 8*'P2P')) + x = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} +- check(x, size('3P2P' + 8*'P2P') + 16*struct.calcsize('P2P')) ++ check(x, size(h + '3P2P' + 8*'P2P') + 16*size('P2P')) + # dictionary-keyiterator +- check({}.iterkeys(), size('P2PPP')) ++ check({}.iterkeys(), size(h + 'P2PPP')) + # dictionary-valueiterator +- check({}.itervalues(), size('P2PPP')) ++ check({}.itervalues(), size(h + 'P2PPP')) + # dictionary-itemiterator +- check({}.iteritems(), size('P2PPP')) ++ check({}.iteritems(), size(h + 'P2PPP')) + # ellipses +- check(Ellipsis, size('')) ++ check(Ellipsis, size(h + '')) + # EncodingMap + import codecs, encodings.iso8859_3 + x = codecs.charmap_build(encodings.iso8859_3.decoding_table) +- check(x, size('32B2iB')) ++ check(x, size(h + '32B2iB')) + # enumerate +- check(enumerate([]), size('l3P')) ++ check(enumerate([]), size(h + 'l3P')) + # file +- check(self.file, size('4P2i4P3i3P3i')) ++ check(self.file, size(h + '4P2i4P3i3P3i')) + # float +- check(float(0), size('d')) ++ check(float(0), size(h + 'd')) + # sys.floatinfo +- check(sys.float_info, vsize('') + self.P * len(sys.float_info)) ++ check(sys.float_info, size(vh) + self.P * len(sys.float_info)) + # frame + import inspect + CO_MAXBLOCKS = 20 +@@ -612,10 +645,10 @@ + nfrees = len(x.f_code.co_freevars) + extras = x.f_code.co_stacksize + x.f_code.co_nlocals +\ + ncells + nfrees - 1 +- check(x, vsize('12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P')) ++ check(x, size(vh + '12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P')) + # function + def func(): pass +- check(func, size('9P')) ++ check(func, size(h + '9P')) + class c(): + @staticmethod + def foo(): +@@ -624,65 +657,65 @@ + def bar(cls): + pass + # staticmethod +- check(foo, size('P')) ++ check(foo, size(h + 'P')) + # classmethod +- check(bar, size('P')) ++ check(bar, size(h + 'P')) + # generator + def get_gen(): yield 1 +- check(get_gen(), size('Pi2P')) ++ check(get_gen(), size(h + 'Pi2P')) + # integer +- check(1, size('l')) +- check(100, size('l')) ++ check(1, size(h + 'l')) ++ check(100, size(h + 'l')) + # iterator +- check(iter('abc'), size('lP')) ++ check(iter('abc'), size(h + 'lP')) + # callable-iterator + import re +- check(re.finditer('',''), size('2P')) ++ check(re.finditer('',''), size(h + '2P')) + # list + samples = [[], [1,2,3], ['1', '2', '3']] + for sample in samples: +- check(sample, vsize('PP') + len(sample)*self.P) ++ check(sample, size(vh + 'PP') + len(sample)*self.P) + # sortwrapper (list) + # XXX + # cmpwrapper (list) + # XXX + # listiterator (list) +- check(iter([]), size('lP')) ++ check(iter([]), size(h + 'lP')) + # listreverseiterator (list) +- check(reversed([]), size('lP')) ++ check(reversed([]), size(h + 'lP')) + # long +- check(0L, vsize('')) +- check(1L, vsize('') + self.longdigit) +- check(-1L, vsize('') + self.longdigit) ++ check(0L, size(vh)) ++ check(1L, size(vh) + self.longdigit) ++ check(-1L, size(vh) + self.longdigit) + PyLong_BASE = 2**sys.long_info.bits_per_digit +- check(long(PyLong_BASE), vsize('') + 2*self.longdigit) +- check(long(PyLong_BASE**2-1), vsize('') + 2*self.longdigit) +- check(long(PyLong_BASE**2), vsize('') + 3*self.longdigit) ++ check(long(PyLong_BASE), size(vh) + 2*self.longdigit) ++ check(long(PyLong_BASE**2-1), size(vh) + 2*self.longdigit) ++ check(long(PyLong_BASE**2), size(vh) + 3*self.longdigit) + # module +- check(unittest, size('P')) ++ check(unittest, size(h + 'P')) + # None +- check(None, size('')) ++ check(None, size(h + '')) + # object +- check(object(), size('')) ++ check(object(), size(h + '')) + # property (descriptor object) + class C(object): + def getx(self): return self.__x + def setx(self, value): self.__x = value + def delx(self): del self.__x + x = property(getx, setx, delx, "") +- check(x, size('4Pi')) ++ check(x, size(h + '4Pi')) + # PyCObject + # PyCapsule + # XXX + # rangeiterator +- check(iter(xrange(1)), size('4l')) ++ check(iter(xrange(1)), size(h + '4l')) + # reverse +- check(reversed(''), size('PP')) ++ check(reversed(''), size(h + 'PP')) + # set + # frozenset + PySet_MINSIZE = 8 + samples = [[], range(10), range(50)] +- s = size('3P2P' + PySet_MINSIZE*'lP' + 'lP') ++ s = size(h + '3P2P' + PySet_MINSIZE*'lP' + 'lP') + for sample in samples: + minused = len(sample) + if minused == 0: tmp = 1 +@@ -699,24 +732,23 @@ + check(set(sample), s + newsize*struct.calcsize('lP')) + check(frozenset(sample), s + newsize*struct.calcsize('lP')) + # setiterator +- check(iter(set()), size('P3P')) ++ check(iter(set()), size(h + 'P3P')) + # slice +- check(slice(1), size('3P')) ++ check(slice(1), size(h + '3P')) + # str +- vh = test.test_support._vheader +- check('', struct.calcsize(vh + 'lic')) +- check('abc', struct.calcsize(vh + 'lic') + 3) ++ check('', struct.calcsize(vh + 'li') + 1) ++ check('abc', struct.calcsize(vh + 'li') + 1 + 3*self.c) + # super +- check(super(int), size('3P')) ++ check(super(int), size(h + '3P')) + # tuple +- check((), vsize('')) +- check((1,2,3), vsize('') + 3*self.P) ++ check((), size(vh)) ++ check((1,2,3), size(vh) + 3*self.P) + # tupleiterator +- check(iter(()), size('lP')) ++ check(iter(()), size(h + 'lP')) + # type + # (PyTypeObject + PyNumberMethods + PyMappingMethods + + # PySequenceMethods + PyBufferProcs) +- s = vsize('P2P15Pl4PP9PP11PI') + struct.calcsize('41P 10P 3P 6P') ++ s = size(vh + 'P2P15Pl4PP9PP11PI') + size('41P 10P 3P 6P') + class newstyleclass(object): + pass + check(newstyleclass, s) +@@ -731,40 +763,41 @@ + # we need to test for both sizes, because we don't know if the string + # has been cached + for s in samples: +- check(s, size('PPlP') + usize * (len(s) + 1)) ++ check(s, size(h + 'PPlP') + usize * (len(s) + 1)) + # weakref + import weakref +- check(weakref.ref(int), size('2Pl2P')) ++ check(weakref.ref(int), size(h + '2Pl2P')) + # weakproxy + # XXX + # weakcallableproxy +- check(weakref.proxy(int), size('2Pl2P')) ++ check(weakref.proxy(int), size(h + '2Pl2P')) + # xrange +- check(xrange(1), size('3l')) +- check(xrange(66000), size('3l')) ++ check(xrange(1), size(h + '3l')) ++ check(xrange(66000), size(h + '3l')) + + def test_pythontypes(self): + # check all types defined in Python/ +- size = test.test_support.calcobjsize +- vsize = test.test_support.calcvobjsize ++ h = self.header ++ vh = self.vheader ++ size = self.calcsize + check = self.check_sizeof + # _ast.AST + import _ast +- check(_ast.AST(), size('')) ++ check(_ast.AST(), size(h + '')) + # imp.NullImporter + import imp +- check(imp.NullImporter(self.file.name), size('')) ++ check(imp.NullImporter(self.file.name), size(h + '')) + try: + raise TypeError + except TypeError: + tb = sys.exc_info()[2] + # traceback + if tb != None: +- check(tb, size('2P2i')) ++ check(tb, size(h + '2P2i')) + # symtable entry + # XXX + # sys.flags +- check(sys.flags, vsize('') + self.P * len(sys.flags)) ++ check(sys.flags, size(vh) + self.P * len(sys.flags)) + + + def test_main(): +diff -urN a/Misc/ACKS b/Misc/ACKS +--- a/Misc/ACKS 2012-12-25 13:41:08.507405725 +0100 ++++ b/Misc/ACKS 2012-12-25 13:48:09.675405378 +0100 +@@ -394,7 +394,6 @@ + Greg Humphreys + Eric Huss + Jeremy Hylton +-Ludwig Hähne + Gerhard Häring + Fredrik Håård + Catalin Iacob +diff -urN a/Misc/NEWS b/Misc/NEWS +--- a/Misc/NEWS 2012-12-25 13:41:08.511405725 +0100 ++++ b/Misc/NEWS 2012-12-25 13:48:48.947405345 +0100 +@@ -100,9 +100,6 @@ + + - Issue #15567: Fix NameError when running threading._test + +-- Issue #15424: Add a __sizeof__ implementation for array objects. +- Patch by Ludwig Hähne. +- + - Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog + ended with '\'. Patch by Roger Serwy. + +@@ -115,22 +112,6 @@ + - Issue #12288: Consider '0' and '0.0' as valid initialvalue + for tkinter SimpleDialog. + +-- Issue #15489: Add a __sizeof__ implementation for BytesIO objects. +- Patch by Serhiy Storchaka. +- +-- Issue #15469: Add a __sizeof__ implementation for deque objects. +- Patch by Serhiy Storchaka. +- +-- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects. +- Patch by Serhiy Storchaka. +- +-- Issue #15512: Add a __sizeof__ implementation for parser. +- Patch by Serhiy Storchaka. +- +-- Issue #15402: An issue in the struct module that caused sys.getsizeof to +- return incorrect results for struct.Struct instances has been fixed. +- Initial patch by Serhiy Storchaka. +- + - Issue #15232: when mangle_from is True, email.Generator now correctly mangles + lines that start with 'From ' that occur in a MIME preamble or epilog. + +@@ -934,9 +915,6 @@ + Tests + ----- + +-- Issue #15467: Move helpers for __sizeof__ tests into test_support. +- Patch by Serhiy Storchaka. +- + - Issue #11689: Fix a variable scoping error in an sqlite3 test. + Initial patch by Torsten Landschoff. + +diff -urN a/Modules/arraymodule.c b/Modules/arraymodule.c +--- a/Modules/arraymodule.c 2012-12-25 13:41:08.519405725 +0100 ++++ b/Modules/arraymodule.c 2012-12-25 13:48:09.683405376 +0100 +@@ -1533,19 +1533,6 @@ + PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); + + static PyObject * +-array_sizeof(arrayobject *self, PyObject *unused) +-{ +- Py_ssize_t res; +- res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize; +- return PyLong_FromSsize_t(res); +-} +- +-PyDoc_STRVAR(sizeof_doc, +-"__sizeof__() -> int\n\ +-\n\ +-Size of the array in memory, in bytes."); +- +-static PyObject * + array_get_typecode(arrayobject *a, void *closure) + { + char tc = a->ob_descr->typecode; +@@ -1619,8 +1606,6 @@ + #endif + {"write", (PyCFunction)array_tofile_as_write, METH_O, + tofile_doc}, +- {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS, +- sizeof_doc}, + {NULL, NULL} /* sentinel */ + }; + +diff -urN a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c +--- a/Modules/_collectionsmodule.c 2012-12-25 13:41:08.511405725 +0100 ++++ b/Modules/_collectionsmodule.c 2012-12-25 13:48:19.855405367 +0100 +@@ -991,23 +991,6 @@ + } + + static PyObject * +-deque_sizeof(dequeobject *deque, void *unused) +-{ +- Py_ssize_t res; +- Py_ssize_t blocks; +- +- res = sizeof(dequeobject); +- blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN; +- assert(deque->leftindex + deque->len - 1 == +- (blocks - 1) * BLOCKLEN + deque->rightindex); +- res += blocks * sizeof(block); +- return PyLong_FromSsize_t(res); +-} +- +-PyDoc_STRVAR(sizeof_doc, +-"D.__sizeof__() -- size of D in memory, in bytes"); +- +-static PyObject * + deque_get_maxlen(dequeobject *deque) + { + if (deque->maxlen == -1) +@@ -1070,9 +1053,7 @@ + {"reverse", (PyCFunction)deque_reverse, + METH_NOARGS, reverse_doc}, + {"rotate", (PyCFunction)deque_rotate, +- METH_VARARGS, rotate_doc}, +- {"__sizeof__", (PyCFunction)deque_sizeof, +- METH_NOARGS, sizeof_doc}, ++ METH_VARARGS, rotate_doc}, + {NULL, NULL} /* sentinel */ + }; + +diff -urN a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c +--- a/Modules/_io/bufferedio.c 2012-12-25 13:41:08.515405725 +0100 ++++ b/Modules/_io/bufferedio.c 2012-12-25 13:48:30.903405359 +0100 +@@ -386,17 +386,6 @@ + Py_TYPE(self)->tp_free((PyObject *)self); + } + +-static PyObject * +-buffered_sizeof(buffered *self, void *unused) +-{ +- Py_ssize_t res; +- +- res = sizeof(buffered); +- if (self->buffer) +- res += self->buffer_size; +- return PyLong_FromSsize_t(res); +-} +- + static int + buffered_traverse(buffered *self, visitproc visit, void *arg) + { +@@ -1571,7 +1560,6 @@ + {"seek", (PyCFunction)buffered_seek, METH_VARARGS}, + {"tell", (PyCFunction)buffered_tell, METH_NOARGS}, + {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS}, +- {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS}, + {NULL, NULL} + }; + +@@ -1964,7 +1952,6 @@ + {"flush", (PyCFunction)buffered_flush, METH_NOARGS}, + {"seek", (PyCFunction)buffered_seek, METH_VARARGS}, + {"tell", (PyCFunction)buffered_tell, METH_NOARGS}, +- {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS}, + {NULL, NULL} + }; + +@@ -2360,7 +2347,6 @@ + {"readline", (PyCFunction)buffered_readline, METH_VARARGS}, + {"peek", (PyCFunction)buffered_peek, METH_VARARGS}, + {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS}, +- {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS}, + {NULL, NULL} + }; + +diff -urN a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c +--- a/Modules/_io/bytesio.c 2012-12-25 13:41:08.515405725 +0100 ++++ b/Modules/_io/bytesio.c 2012-12-25 13:48:30.903405359 +0100 +@@ -794,17 +794,6 @@ + return 0; + } + +-static PyObject * +-bytesio_sizeof(bytesio *self, void *unused) +-{ +- Py_ssize_t res; +- +- res = sizeof(bytesio); +- if (self->buf) +- res += self->buf_size; +- return PyLong_FromSsize_t(res); +-} +- + static int + bytesio_traverse(bytesio *self, visitproc visit, void *arg) + { +@@ -846,7 +835,6 @@ + {"truncate", (PyCFunction)bytesio_truncate, METH_VARARGS, truncate_doc}, + {"__getstate__", (PyCFunction)bytesio_getstate, METH_NOARGS, NULL}, + {"__setstate__", (PyCFunction)bytesio_setstate, METH_O, NULL}, +- {"__sizeof__", (PyCFunction)bytesio_sizeof, METH_NOARGS, NULL}, + {NULL, NULL} /* sentinel */ + }; + +diff -urN a/Modules/parsermodule.c b/Modules/parsermodule.c +--- a/Modules/parsermodule.c 2012-12-25 13:41:08.523405725 +0100 ++++ b/Modules/parsermodule.c 2012-12-25 13:48:19.859405367 +0100 +@@ -169,33 +169,9 @@ + + + static void parser_free(PyST_Object *st); +-static PyObject* parser_sizeof(PyST_Object *, void *); + static int parser_compare(PyST_Object *left, PyST_Object *right); + static PyObject *parser_getattr(PyObject *self, char *name); +-static PyObject* parser_compilest(PyST_Object *, PyObject *, PyObject *); +-static PyObject* parser_isexpr(PyST_Object *, PyObject *, PyObject *); +-static PyObject* parser_issuite(PyST_Object *, PyObject *, PyObject *); +-static PyObject* parser_st2list(PyST_Object *, PyObject *, PyObject *); +-static PyObject* parser_st2tuple(PyST_Object *, PyObject *, PyObject *); + +-#define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) +- +-static PyMethodDef +-parser_methods[] = { +- {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, +- PyDoc_STR("Compile this ST object into a code object.")}, +- {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, +- PyDoc_STR("Determines if this ST object was created from an expression.")}, +- {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, +- PyDoc_STR("Determines if this ST object was created from a suite.")}, +- {"tolist", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, +- PyDoc_STR("Creates a list-tree representation of this ST.")}, +- {"totuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, +- PyDoc_STR("Creates a tuple-tree representation of this ST.")}, +- {"__sizeof__", (PyCFunction)parser_sizeof, METH_NOARGS, +- PyDoc_STR("Returns size in memory, in bytes.")}, +- {NULL, NULL, 0, NULL} +-}; + + static + PyTypeObject PyST_Type = { +@@ -224,14 +200,7 @@ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + + /* __doc__ */ +- "Intermediate representation of a Python parse tree.", +- 0, /* tp_traverse */ +- 0, /* tp_clear */ +- 0, /* tp_richcompare */ +- 0, /* tp_weaklistoffset */ +- 0, /* tp_iter */ +- 0, /* tp_iternext */ +- parser_methods, /* tp_methods */ ++ "Intermediate representation of a Python parse tree." + }; /* PyST_Type */ + + +@@ -525,6 +494,25 @@ + } + + ++#define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) ++ ++static PyMethodDef ++parser_methods[] = { ++ {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, ++ PyDoc_STR("Compile this ST object into a code object.")}, ++ {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, ++ PyDoc_STR("Determines if this ST object was created from an expression.")}, ++ {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, ++ PyDoc_STR("Determines if this ST object was created from a suite.")}, ++ {"tolist", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, ++ PyDoc_STR("Creates a list-tree representation of this ST.")}, ++ {"totuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, ++ PyDoc_STR("Creates a tuple-tree representation of this ST.")}, ++ ++ {NULL, NULL, 0, NULL} ++}; ++ ++ + static PyObject* + parser_getattr(PyObject *self, char *name) + { +@@ -707,15 +695,6 @@ + return parser_tuple2st(self, args, kw); + } + +-static PyObject * +-parser_sizeof(PyST_Object *st, void *unused) +-{ +- Py_ssize_t res; +- +- res = sizeof(PyST_Object) + _PyNode_SizeOf(st->st_node); +- return PyLong_FromSsize_t(res); +-} +- + + /* node* build_node_children() + * +diff -urN a/Modules/_struct.c b/Modules/_struct.c +--- a/Modules/_struct.c 2012-12-25 13:41:08.519405725 +0100 ++++ b/Modules/_struct.c 2012-12-25 13:48:48.951405344 +0100 +@@ -1693,18 +1693,6 @@ + return PyInt_FromSsize_t(self->s_size); + } + +-PyDoc_STRVAR(s_sizeof__doc__, +-"S.__sizeof__() -> size of S in memory, in bytes"); +- +-static PyObject * +-s_sizeof(PyStructObject *self, void *unused) +-{ +- Py_ssize_t size; +- +- size = sizeof(PyStructObject) + sizeof(formatcode) * (self->s_len + 1); +- return PyLong_FromSsize_t(size); +-} +- + /* List of functions */ + + static struct PyMethodDef s_methods[] = { +@@ -1713,7 +1701,6 @@ + {"unpack", s_unpack, METH_O, s_unpack__doc__}, + {"unpack_from", (PyCFunction)s_unpack_from, METH_VARARGS|METH_KEYWORDS, + s_unpack_from__doc__}, +- {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__}, + {NULL, NULL} /* sentinel */ + }; + +diff -urN a/Parser/node.c b/Parser/node.c +--- a/Parser/node.c 2012-12-25 13:41:08.551405725 +0100 ++++ b/Parser/node.c 2012-12-25 13:48:19.859405367 +0100 +@@ -114,7 +114,6 @@ + + /* Forward */ + static void freechildren(node *); +-static Py_ssize_t sizeofchildren(node *n); + + + void +@@ -126,16 +125,6 @@ + } + } + +-Py_ssize_t +-_PyNode_SizeOf(node *n) +-{ +- Py_ssize_t res = 0; +- +- if (n != NULL) +- res = sizeof(node) + sizeofchildren(n); +- return res; +-} +- + static void + freechildren(node *n) + { +@@ -147,18 +136,3 @@ + if (STR(n) != NULL) + PyObject_FREE(STR(n)); + } +- +-static Py_ssize_t +-sizeofchildren(node *n) +-{ +- Py_ssize_t res = 0; +- int i; +- for (i = NCH(n); --i >= 0; ) +- res += sizeofchildren(CHILD(n, i)); +- if (n->n_child != NULL) +- /* allocated size of n->n_child array */ +- res += XXXROUNDUP(NCH(n)) * sizeof(node); +- if (STR(n) != NULL) +- res += strlen(STR(n)) + 1; +- return res; +-} |