]> granicus.if.org Git - python/commitdiff
Issue #15467: Merge 3.2
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 29 Jul 2012 14:38:45 +0000 (16:38 +0200)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 29 Jul 2012 14:38:45 +0000 (16:38 +0200)
1  2 
Lib/test/support.py
Lib/test/test_struct.py
Lib/test/test_sys.py
Lib/test/test_xml_etree_c.py
Misc/NEWS

index 2d7f70df07fbbde3c8e7da2e3f3dfe512c8b38cc,162805d398259e527b8c28a5260b489191ae11ac..f5f574ec97802fa20fbcf0cf42001224390734f0
@@@ -1079,9 -984,34 +1080,36 @@@ def python_is_optimized()
      for opt in cflags.split():
          if opt.startswith('-O'):
              final_opt = opt
 -    return final_opt and final_opt != '-O0'
 +    return final_opt != '' and final_opt != '-O0'
  
  
 -_header = '2P'
++_header = 'nP'
++_align = '0n'
+ if hasattr(sys, "gettotalrefcount"):
+     _header = '2P' + _header
 -_vheader = _header + 'P'
++    _align = '0P'
++_vheader = _header + 'n'
+ def calcobjsize(fmt):
 -    return struct.calcsize(_header + fmt + '0P')
++    return struct.calcsize(_header + fmt + _align)
+ def calcvobjsize(fmt):
 -    return struct.calcsize(_vheader + fmt + '0P')
++    return struct.calcsize(_vheader + fmt + _align)
+ _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.
index 919cd6373d15cf455060f0ce7ab3141eb56e7a70,dcc73ab8983201d02c36d22c778f88312408e2b0..22374d244d2aceb617c5458a9628d4abe2df4f1f
@@@ -40,33 -30,7 +40,6 @@@ def bigendian_to_native(value)
          return string_reverse(value)
  
  class StructTest(unittest.TestCase):
-     def setUp(self):
-         # due to missing size_t information from struct, it is assumed that
-         # sizeof(Py_ssize_t) = sizeof(void*)
-         self.header = 'PP'
-         if hasattr(sys, "gettotalrefcount"):
-             self.header += '2P'
-     def check_sizeof(self, format_str, number_of_codes):
-         def size(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')
-         struct_obj = struct.Struct(format_str)
-         # The size of 'PyStructObject'
-         totalsize = size(self.header + '5P')
-         # The size taken up by the 'formatcode' dynamic array
-         totalsize += size('3P') * (number_of_codes + 1)
-         result = sys.getsizeof(struct_obj)
-         msg = 'wrong size for %s: got %d, expected %d' \
-               % (type(struct_obj), result, totalsize)
-         self.assertEqual(result, totalsize, msg)
--
      def test_isbigendian(self):
          self.assertEqual((struct.pack('=i', 1)[0] == 0), ISBIGENDIAN)
  
          s = struct.Struct('i')
          s.__init__('ii')
  
-     @cpython_only
+     def check_sizeof(self, format_str, number_of_codes):
+         # The size of 'PyStructObject'
 -        totalsize = support.calcobjsize('5P')
++        totalsize = support.calcobjsize('2n3P')
+         # The size taken up by the 'formatcode' dynamic array
 -        totalsize += struct.calcsize('3P') * (number_of_codes + 1)
++        totalsize += struct.calcsize('P2n0P') * (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)
index b04df144bdecda031f2750e5db33bebbe05c7ce5,b055fccbcbd106fa94ae4ef7bf86f669771fbfb8..d540ef7ed601f0ee5a527bfdd557c07b9fc5747b
@@@ -658,21 -585,17 +627,17 @@@ class SizeofTest(unittest.TestCase)
  
      def test_gc_head_size(self):
          # Check that the gc header size is added to objects tracked by the gc.
-         h = self.header
-         vh = self.vheader
-         size = self.calcsize
+         vsize = test.support.calcvobjsize
          gc_header_size = self.gc_headsize
          # bool objects are not gc tracked
-         self.assertEqual(sys.getsizeof(True), size(vh) + self.longdigit)
+         self.assertEqual(sys.getsizeof(True), vsize('') + self.longdigit)
          # but lists are
-         self.assertEqual(sys.getsizeof([]), size(vh + 'PP') + gc_header_size)
 -        self.assertEqual(sys.getsizeof([]), vsize('PP') + gc_header_size)
++        self.assertEqual(sys.getsizeof([]), vsize('Pn') + gc_header_size)
  
      def test_default(self):
-         h = self.header
-         vh = self.vheader
-         size = self.calcsize
-         self.assertEqual(sys.getsizeof(True), size(vh) + self.longdigit)
-         self.assertEqual(sys.getsizeof(True, -1), size(vh) + self.longdigit)
 -        vsize = test.support.calcvobjsize
 -        self.assertEqual(sys.getsizeof(True), vsize('') + self.longdigit)
 -        self.assertEqual(sys.getsizeof(True, -1), vsize('') + self.longdigit)
++        size = test.support.calcvobjsize
++        self.assertEqual(sys.getsizeof(True), size('') + self.longdigit)
++        self.assertEqual(sys.getsizeof(True, -1), size('') + self.longdigit)
  
      def test_objecttypes(self):
          # check all types defined in Objects/
          samples = [b'', b'u'*100000]
          for sample in samples:
              x = bytearray(sample)
-             check(x, size(vh + 'iPP') + x.__alloc__() * self.c)
 -            check(x, vsize('iPP') + x.__alloc__())
++            check(x, vsize('inP') + x.__alloc__())
          # bytearray_iterator
-         check(iter(bytearray()), size(h + 'PP'))
 -        check(iter(bytearray()), size('PP'))
++        check(iter(bytearray()), size('nP'))
          # cell
          def get_cell():
              x = 42
              def inner():
                  return x
              return inner
-         check(get_cell().__closure__[0], size(h + 'P'))
+         check(get_cell().__closure__[0], size('P'))
          # code
-         check(get_cell().__code__, size(h + '5i9Pi3P'))
-         check(get_cell.__code__, size(h + '5i9Pi3P'))
 -        check(get_cell().__code__, size('5i8Pi3P'))
++        check(get_cell().__code__, size('5i9Pi3P'))
++        check(get_cell.__code__, size('5i9Pi3P'))
 +        def get_cell2(x):
 +            def inner():
 +                return x
 +            return inner
-         check(get_cell2.__code__, size(h + '5i9Pi3P') + 1)
++        check(get_cell2.__code__, size('5i9Pi3P') + 1)
          # complex
-         check(complex(0,1), size(h + '2d'))
+         check(complex(0,1), size('2d'))
          # method_descriptor (descriptor object)
-         check(str.lower, size(h + '3PP'))
 -        check(str.lower, size('2PP'))
++        check(str.lower, size('3PP'))
          # classmethod_descriptor (descriptor object)
          # XXX
          # member_descriptor (descriptor object)
          import datetime
-         check(datetime.timedelta.days, size(h + '3PP'))
 -        check(datetime.timedelta.days, size('2PP'))
++        check(datetime.timedelta.days, size('3PP'))
          # getset_descriptor (descriptor object)
          import collections
-         check(collections.defaultdict.default_factory, size(h + '3PP'))
 -        check(collections.defaultdict.default_factory, size('2PP'))
++        check(collections.defaultdict.default_factory, size('3PP'))
          # wrapper_descriptor (descriptor object)
-         check(int.__add__, size(h + '3P2P'))
 -        check(int.__add__, size('2P2P'))
++        check(int.__add__, size('3P2P'))
          # method-wrapper (descriptor object)
-         check({}.__iter__, size(h + '2P'))
+         check({}.__iter__, size('2P'))
          # dict
-         check({}, size(h + '3P' + '4P' + 8*'P2P'))
 -        check({}, size('3P2P' + 8*'P2P'))
++        check({}, size('n2P' + '2nPn' + 8*'n2P'))
          longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8}
-         check(longdict, size(h + '3P' + '4P') + 16*size('P2P'))
 -        check(longdict, size('3P2P' + 8*'P2P') + 16*struct.calcsize('P2P'))
++        check(longdict, size('n2P' + '2nPn') + 16*struct.calcsize('n2P'))
          # dictionary-keyiterator
-         check({}.keys(), size(h + 'P'))
+         check({}.keys(), size('P'))
          # dictionary-valueiterator
-         check({}.values(), size(h + 'P'))
+         check({}.values(), size('P'))
          # dictionary-itemiterator
-         check({}.items(), size(h + 'P'))
+         check({}.items(), size('P'))
+         # dictionary iterator
 -        check(iter({}), size('P2PPP'))
++        check(iter({}), size('P2nPn'))
          # dictproxy
          class C(object): pass
-         check(C.__dict__, size(h + 'P'))
+         check(C.__dict__, size('P'))
          # BaseException
-         check(BaseException(), size(h + '5Pi'))
 -        check(BaseException(), size('5P'))
++        check(BaseException(), size('5Pi'))
          # UnicodeEncodeError
-         check(UnicodeEncodeError("", "", 0, 0, ""), size(h + '5Pi 2P2PP'))
 -        check(UnicodeEncodeError("", "", 0, 0, ""), size('5P 2P2PP'))
++        check(UnicodeEncodeError("", "", 0, 0, ""), size('5Pi 2P2nP'))
          # UnicodeDecodeError
-         # XXX
- #        check(UnicodeDecodeError("", "", 0, 0, ""), size(h + '5P2PP'))
 -        check(UnicodeDecodeError("", b"", 0, 0, ""), size('5P 2P2PP'))
++        check(UnicodeDecodeError("", b"", 0, 0, ""), size('5Pi 2P2nP'))
          # UnicodeTranslateError
-         check(UnicodeTranslateError("", 0, 1, ""), size(h + '5Pi 2P2PP'))
 -        check(UnicodeTranslateError("", 0, 1, ""), size('5P 2P2PP'))
++        check(UnicodeTranslateError("", 0, 1, ""), size('5Pi 2P2nP'))
          # ellipses
-         check(Ellipsis, size(h + ''))
+         check(Ellipsis, size(''))
          # EncodingMap
          import codecs, encodings.iso8859_3
          x = codecs.charmap_build(encodings.iso8859_3.decoding_table)
-         check(x, size(h + '32B2iB'))
+         check(x, size('32B2iB'))
          # enumerate
-         check(enumerate([]), size(h + 'l3P'))
 -        check(enumerate([]), size('l3P'))
++        check(enumerate([]), size('n3P'))
          # reverse
-         check(reversed(''), size(h + 'PP'))
 -        check(reversed(''), size('PP'))
++        check(reversed(''), size('nP'))
          # float
-         check(float(0), size(h + 'd'))
+         check(float(0), size('d'))
          # sys.floatinfo
-         check(sys.float_info, size(vh) + self.P * len(sys.float_info))
+         check(sys.float_info, vsize('') + self.P * len(sys.float_info))
          # frame
          import inspect
          CO_MAXBLOCKS = 20
          nfrees = len(x.f_code.co_freevars)
          extras = x.f_code.co_stacksize + x.f_code.co_nlocals +\
                    ncells + nfrees - 1
-         check(x, size(vh + '12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
+         check(x, vsize('12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
          # function
          def func(): pass
-         check(func, size(h + '12P'))
 -        check(func, size('11P'))
++        check(func, size('12P'))
          class c():
              @staticmethod
              def foo():
              def bar(cls):
                  pass
              # staticmethod
-             check(foo, size(h + 'PP'))
 -            check(foo, size('P'))
++            check(foo, size('PP'))
              # classmethod
-             check(bar, size(h + 'PP'))
 -            check(bar, size('P'))
++            check(bar, size('PP'))
          # generator
          def get_gen(): yield 1
-         check(get_gen(), size(h + 'Pi2P'))
 -        check(get_gen(), size('Pi2P'))
++        check(get_gen(), size('Pb2P'))
          # iterator
-         check(iter('abc'), size(h + 'lP'))
+         check(iter('abc'), size('lP'))
          # callable-iterator
          import re
-         check(re.finditer('',''), size(h + '2P'))
+         check(re.finditer('',''), size('2P'))
          # list
          samples = [[], [1,2,3], ['1', '2', '3']]
          for sample in samples:
-             check(sample, size(vh + 'PP') + len(sample)*self.P)
 -            check(sample, vsize('PP') + len(sample)*self.P)
++            check(sample, vsize('Pn') + len(sample)*self.P)
          # sortwrapper (list)
          # XXX
          # cmpwrapper (list)
          # XXX
          # listiterator (list)
-         check(iter([]), size(h + 'lP'))
+         check(iter([]), size('lP'))
          # listreverseiterator (list)
-         check(reversed([]), size(h + 'lP'))
 -        check(reversed([]), size('lP'))
++        check(reversed([]), size('nP'))
          # long
-         check(0, size(vh))
-         check(1, size(vh) + self.longdigit)
-         check(-1, size(vh) + self.longdigit)
+         check(0, vsize(''))
+         check(1, vsize('') + self.longdigit)
+         check(-1, vsize('') + self.longdigit)
          PyLong_BASE = 2**sys.int_info.bits_per_digit
-         check(int(PyLong_BASE), size(vh) + 2*self.longdigit)
-         check(int(PyLong_BASE**2-1), size(vh) + 2*self.longdigit)
-         check(int(PyLong_BASE**2), size(vh) + 3*self.longdigit)
+         check(int(PyLong_BASE), vsize('') + 2*self.longdigit)
+         check(int(PyLong_BASE**2-1), vsize('') + 2*self.longdigit)
+         check(int(PyLong_BASE**2), vsize('') + 3*self.longdigit)
          # memoryview
-         check(memoryview(b''), size(h + 'PPiP4P2i5P3c2P'))
 -        check(memoryview(b''), size('PP2P2i7P'))
++        check(memoryview(b''), size('Pnin 2P2n2i5P 3cPn'))
          # module
-         check(unittest, size(h + '3P'))
 -        check(unittest, size('3P'))
++        check(unittest, size('PnP'))
          # None
-         check(None, size(h + ''))
+         check(None, size(''))
          # NotImplementedType
-         check(NotImplemented, size(h))
+         check(NotImplemented, size(''))
          # object
-         check(object(), size(h + ''))
+         check(object(), size(''))
          # property (descriptor object)
          class C(object):
              def getx(self): return self.__x
          # PyCapsule
          # XXX
          # rangeiterator
-         check(iter(range(1)), size(h + '4l'))
+         check(iter(range(1)), size('4l'))
          # reverse
-         check(reversed(''), size(h + 'PP'))
 -        check(reversed(''), size('PP'))
++        check(reversed(''), size('nP'))
          # range
-         check(range(1), size(h + '4P'))
-         check(range(66000), size(h + '4P'))
+         check(range(1), size('4P'))
+         check(range(66000), size('4P'))
          # set
          # frozenset
          PySet_MINSIZE = 8
          samples = [[], range(10), range(50)]
-         s = size(h + '3P2P' + PySet_MINSIZE*'lP' + 'lP')
 -        s = size('3P2P' + PySet_MINSIZE*'PP' + 'PP')
++        s = size('3n2P' + PySet_MINSIZE*'nP' + 'nP')
          for sample in samples:
              minused = len(sample)
              if minused == 0: tmp = 1
                  check(set(sample), s)
                  check(frozenset(sample), s)
              else:
--                check(set(sample), s + newsize*struct.calcsize('lP'))
--                check(frozenset(sample), s + newsize*struct.calcsize('lP'))
++                check(set(sample), s + newsize*struct.calcsize('nP'))
++                check(frozenset(sample), s + newsize*struct.calcsize('nP'))
          # setiterator
-         check(iter(set()), size(h + 'P3P'))
 -        check(iter(set()), size('P3P'))
++        check(iter(set()), size('P3n'))
          # slice
-         check(slice(0), size(h + '3P'))
+         check(slice(0), size('3P'))
          # super
-         check(super(int), size(h + '3P'))
+         check(super(int), size('3P'))
          # tuple
-         check((), size(vh))
-         check((1,2,3), size(vh) + 3*self.P)
+         check((), vsize(''))
+         check((1,2,3), vsize('') + 3*self.P)
          # type
 -        # (PyTypeObject + PyNumberMethods + PyMappingMethods +
 -        #  PySequenceMethods + PyBufferProcs)
 -        s = vsize('P2P15Pl4PP9PP11PI') + struct.calcsize('16Pi17P 3P 10P 2P 2P')
 +        # static type: PyTypeObject
-         s = size(vh + 'P2P15Pl4PP9PP11PI')
++        s = vsize('P2n15Pl4Pn9Pn11PI')
          check(int, s)
-         s = size(vh + 'P2P15Pl4PP9PP11PI') + size('34P 3P 10P 2P 4P')
 +        # (PyTypeObject + PyNumberMethods + PyMappingMethods +
 +        #  PySequenceMethods + PyBufferProcs + 4P)
-         s += size("PPPP") + 4*size("PPP")
++        s = vsize('P2n15Pl4Pn9Pn11PI') + struct.calcsize('34P 3P 10P 2P 4P')
 +        # Separate block for PyDictKeysObject with 4 entries
++        s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
          # class
          class newstyleclass(object): pass
          check(newstyleclass, s)
-         check(newstyleclass().__dict__, size(h+"PPP4P"))
 +        # dict with shared keys
++        check(newstyleclass().__dict__, size('n2P' + '2nPn'))
          # unicode
 -        usize = len('\0'.encode('unicode-internal'))
 -        samples = ['', '1'*100]
 -        # we need to test for both sizes, because we don't know if the string
 -        # has been cached
 +        # each tuple contains a string and its expected character size
 +        # don't put any static strings here, as they may contain
 +        # wchar_t or UTF-8 representations
 +        samples = ['1'*100, '\xff'*50,
 +                   '\u0100'*40, '\uffff'*100,
 +                   '\U00010000'*30, '\U0010ffff'*100]
-         asciifields = h + "PPiP"
-         compactfields = asciifields + "PPP"
++        asciifields = "nniP"
++        compactfields = asciifields + "nPn"
 +        unicodefields = compactfields + "P"
          for s in samples:
 -            basicsize =  size('PPPiP') + usize * (len(s) + 1)
 -            check(s, basicsize)
 +            maxchar = ord(max(s))
 +            if maxchar < 128:
 +                L = size(asciifields) + len(s) + 1
 +            elif maxchar < 256:
 +                L = size(compactfields) + len(s) + 1
 +            elif maxchar < 65536:
 +                L = size(compactfields) + 2*(len(s) + 1)
 +            else:
 +                L = size(compactfields) + 4*(len(s) + 1)
 +            check(s, L)
 +        # verify that the UTF-8 size is accounted for
 +        s = chr(0x4000)   # 4 bytes canonical representation
 +        check(s, size(compactfields) + 4)
 +        # compile() will trigger the generation of the UTF-8
 +        # representation as a side effect
 +        compile(s, "<stdin>", "eval")
 +        check(s, size(compactfields) + 4 + 4)
 +        # TODO: add check that forces the presence of wchar_t representation
 +        # TODO: add check that forces layout of unicodefields
          # weakref
          import weakref
-         check(weakref.ref(int), size(h + '2Pl2P'))
 -        check(weakref.ref(int), size('2Pl2P'))
++        check(weakref.ref(int), size('2Pn2P'))
          # weakproxy
          # XXX
          # weakcallableproxy
-         check(weakref.proxy(int), size(h + '2Pl2P'))
 -        check(weakref.proxy(int), size('2Pl2P'))
++        check(weakref.proxy(int), size('2Pn2P'))
  
      def test_pythontypes(self):
          # check all types defined in Python/
          check = self.check_sizeof
          # _ast.AST
          import _ast
-         check(_ast.AST(), size(h + 'P'))
 -        check(_ast.AST(), size(''))
 -        # imp.NullImporter
 -        import imp
 -        check(imp.NullImporter(self.file.name), size(''))
++        check(_ast.AST(), size('P'))
          try:
              raise TypeError
          except TypeError:
index eaeeb56083e342d6eba3bad47d1bc20651de50a1,2ff118fae88226a25608d7aa4c7d817afc353340..e44c6ca28485e51fcb7a00929b42c5e7e8cb243f
@@@ -22,58 -47,6 +22,50 @@@ class MiscTests(unittest.TestCase)
              data = None
  
  
-         import _testcapi
-         gc_headsize = _testcapi.SIZEOF_PYGC_HEAD
-         # object header
-         header = 'PP'
-         if hasattr(sys, "gettotalrefcount"):
-             # debug header
-             header = 'PP' + header
-         # fields
-         element = header + '5P'
-         self.elementsize = gc_headsize + struct.calcsize(element)
 +@unittest.skipUnless(cET, 'requires _elementtree')
 +class TestAliasWorking(unittest.TestCase):
 +    # Test that the cET alias module is alive
 +    def test_alias_working(self):
 +        e = cET_alias.Element('foo')
 +        self.assertEqual(e.tag, 'foo')
 +
 +
 +@unittest.skipUnless(cET, 'requires _elementtree')
 +class TestAcceleratorImported(unittest.TestCase):
 +    # Test that the C accelerator was imported, as expected
 +    def test_correct_import_cET(self):
 +        self.assertEqual(cET.SubElement.__module__, '_elementtree')
 +
 +    def test_correct_import_cET_alias(self):
 +        self.assertEqual(cET_alias.SubElement.__module__, '_elementtree')
 +
 +
 +@unittest.skipUnless(cET, 'requires _elementtree')
++@support.cpython_only
 +class SizeofTest(unittest.TestCase):
 +    def setUp(self):
-         self.assertEqual(sys.getsizeof(e), self.elementsize)
++        self.elementsize = support.calcobjsize('5P')
 +        # extra
 +        self.extra = struct.calcsize('PiiP4P')
 +
++    check_sizeof = support.check_sizeof
++
 +    def test_element(self):
 +        e = cET.Element('a')
-         self.assertEqual(sys.getsizeof(e),
-                          self.elementsize + self.extra)
++        self.check_sizeof(e, self.elementsize)
 +
 +    def test_element_with_attrib(self):
 +        e = cET.Element('a', href='about:')
-         self.assertEqual(sys.getsizeof(e),
-                          self.elementsize + self.extra +
-                          struct.calcsize('8P'))
++        self.check_sizeof(e, self.elementsize + self.extra)
 +
 +    def test_element_with_children(self):
 +        e = cET.Element('a')
 +        for i in range(5):
 +            cET.SubElement(e, 'span')
 +        # should have space for 8 children now
++        self.check_sizeof(e, self.elementsize + self.extra +
++                             struct.calcsize('8P'))
 +
  def test_main():
      from test import test_xml_etree, test_xml_etree_c
  
diff --cc Misc/NEWS
index b47f7424f672e2b64af605807bb5f9aa2aa19924,4d3a4dae5ef79bccbd2507be97d248ae1427bfe3..185892f14b4ce96fa6a440b6a0089cd16d251614
+++ b/Misc/NEWS
@@@ -175,377 -142,258 +175,380 @@@ Librar
    created and renamed over the old file when flush() is called on an
    mbox, MMDF or Babyl mailbox.
  
 -- Issue #14653: email.utils.mktime_tz() no longer relies on system
 -  mktime() when timezone offest is supplied.
 +- Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic
 +  purpose.
  
 -- Fix GzipFile's handling of filenames given as bytes objects.
 +- Issue #15184: Ensure consistent results of OS X configuration
 +  tailoring for universal builds by factoring out common OS X-specific
 +  customizations from sysconfig, distutils.sysconfig, distutils.util,
 +  and distutils.unixccompiler into a new module _osx_support.
  
 -- Issue #15101: Make pool finalizer avoid joining current thread.
 +C API
 +-----
  
 -- Issue #15036: Mailbox no longer throws an error if a flush is done
 -  between operations when removing or changing multiple items in mbox,
 -  MMDF, or Babyl mailboxes.
 +- Issues #15169, #14599: Strip out the C implementation of
 +  imp.source_from_cache() used by PyImport_ExecCodeModuleWithPathnames() and
 +  used the Python code instead. Leads to PyImport_ExecCodeModuleObject() to not
 +  try to infer the source path from the bytecode path as
 +  PyImport_ExecCodeModuleWithPathnames() does.
  
 -- Issue #10133: Make multiprocessing deallocate buffer if socket read
 -  fails.  Patch by Hallvard B Furuseth.
 +Extension Modules
 +-----------------
  
 -- Issue #13854: Make multiprocessing properly handle non-integer
 -  non-string argument to SystemExit.
 +- Issue #6493: An issue in ctypes on Windows that caused structure bitfields
 +  of type ctypes.c_uint32 and width 32 to incorrectly be set has been fixed.
  
 -- Issue #12157: Make pool.map() empty iterables correctly.  Initial
 -  patch by mouad.
 +- Issue #15194: Update libffi to the 3.0.11 release.
  
 -- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
 -  when the path existed and had the S_ISGID mode bit set when it was
 -  not explicitly asked for.  This is no longer an exception as mkdir
 -  cannot control if the OS sets that bit for it or not.
 +Tools/Demos
 +-----------
  
 -- Issue #14962: Update text coloring in IDLE shell window after changing
 -  options.  Patch by Roger Serwy.
 +- Issue #15458: python-config gets a new option --configdir to print the
 +  $LIBPL value.
  
 -- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.
 +- Move importlib.test.benchmark to Tools/importbench.
  
 -- Issue #14443: Tell rpmbuild to use the correct version of Python in
 -  bdist_rpm. Initial patch by Ross Lagerwall.
 +- Issue #12605: The gdb hooks for debugging CPython (within Tools/gdb) have
 +  been enhanced to show information on more C frames relevant to CPython within
 +  the "py-bt" and "py-bt-full" commands:
 +    * C frames that are waiting on the GIL
 +    * C frames that are garbage-collecting
 +    * C frames that are due to the invocation of a PyCFunction
  
 -- Issue #14929: Stop Idle 3.x from closing on Unicode decode errors when
 -  grepping. Patch by Roger Serwy.
 +Documentation
 +-------------
  
 -- Issue #12510: Attempting to get invalid tooltip no longer closes Idle.
 -  Other tooltipss have been corrected or improved and the number of tests
 -  has been tripled. Original patch by Roger Serwy.
 +- Issue #15230: Clearly document some of the limitations of the runpy
 +  module and nudge readers towards importlib when appropriate.
  
 -- Issue #10365: File open dialog now works instead of crashing even when
 -  the parent window is closed before the dialog. Patch by Roger Serwy.
 +- Issue #15053: Copy Python 3.3 import lock change notice to all relevant
 +  functions in imp instead of just at the top of the relevant section.
  
 -- Issue #14876: Use user-selected font for highlight configuration.
 +- Issue #15288: Link to the term "loader" in notes in pkgutil about how things
 +  won't work as expected in Python 3.3 and mark the requisite functions as
 +  "changed" since they will no longer work with modules directly imported by
 +  import itself.
  
 -- Issue #14920: Fix the help(urllib.parse) failure on locale C on terminals.
 -  Have ascii characters in help.
 +- Issue #13557: Clarify effect of giving two different namespaces to exec or
 +  execfile().
  
 -- Issue #14863: Update the documentation of os.fdopen() to reflect the
 -  fact that it's only a thin wrapper around open() anymore.
 +- Issue #15250: Document that filecmp.dircmp compares files shallowly. Patch
 +  contributed by Chris Jerdonek.
  
 -- Issue #14036: Add an additional check to validate that port in urlparse does
 -  not go in illegal range and returns None.
 +Tests
 +-----
  
 -- Issue #14875: Use float('inf') instead of float('1e66666') in the json module.
++- Issue #15467: Move helpers for __sizeof__ tests into test_support.
++  Patch by Serhiy Storchaka.
 -- Issue #14426: Correct the Date format in Expires attribute of Set-Cookie
 -  Header in Cookie.py.
 +- Issue #15320: Make iterating the list of tests thread-safe when running
 +  tests in multiprocess mode. Patch by Chris Jerdonek.
  
 -- Issue #14721: Send the correct 'Content-length: 0' header when the body is an
 -  empty string ''. Initial Patch contributed by Arve Knudsen.
 +- Issue #15168: Move importlib.test to test.test_importlib.
  
 -- Issue #14072: Fix parsing of 'tel' URIs in urlparse by making the check for
 -  ports stricter.
 +- Issue #15091: Reactivate a test on UNIX which was failing thanks to a
 +  forgotten importlib.invalidate_caches() call.
  
 -- Issue #9374: Generic parsing of query and fragment portions of url for any
 -  scheme. Supported both by RFC3986 and RFC2396.
 +- Issue #15230: Adopted a more systematic approach in the runpy tests.
  
 -- Issue #14798: Fix the functions in pyclbr to raise an ImportError
 -  when the first part of a dotted name is not a package. Patch by
 -  Xavier de Gaye.
 +- Issue #15300: Ensure the temporary test working directories are in the same
 +  parent folder when running tests in multiprocess mode from a Python build.
 +  Patch by Chris Jerdonek.
  
 -- Issue #14829: Fix bisect and range() indexing with large indices
 -  (>= 2 ** 32) under 64-bit Windows.
 +- Issue #15284: Skip {send,recv}msg tests in test_socket when IPv6 is not
 +  enabled. Patch by Brian Brazil.
  
 -- Issue #14777: tkinter may return undecoded UTF-8 bytes as a string when
 -  accessing the Tk clipboard.  Modify clipboad_get() to first request type
 -  UTF8_STRING when no specific type is requested in an X11 windowing
 -  environment, falling back to the current default type STRING if that fails.
 -  Original patch by Thomas Kluyver.
 +- Issue #15277: Fix a resource leak in support.py when IPv6 is disabled.
 +  Patch by Brian Brazil.
  
 -- Issue #12541: Be lenient with quotes around Realm field of HTTP Basic
 -  Authentation in urllib2.
 +Build
 +-----
  
 -- Issue #14662: Prevent shutil failures on OS X when destination does not
 -  support chflag operations.  Patch by Hynek Schlawack.
 +- Issue #15431: Add _freeze_importlib project to regenerate importlib.h
 +  on Windows. Patch by Kristján Valur Jónsson.
  
 -- Issue #14157: Fix time.strptime failing without a year on February 29th.
 -  Patch by Hynek Schlawack.
 +- Issue #14197: For OS X framework builds, ensure links to the shared
 +  library are created with the proper ABI suffix.
  
 -- Issue #14768: os.path.expanduser('~/a') doesn't works correctly when HOME is '/'.
 +- Issue #14330: For cross builds, don't use host python, use host search paths
 +  for host compiler.
  
 -- Issue #14741: Fix missing support for Ellipsis ('...') in parser module.
 +- Issue #15235: Allow Berkley DB versions up to 5.3 to build the dbm module.
  
 -- Issue #14697: Fix missing support for set displays and set comprehensions in
 -  parser module.
 +- Issue #15268: Search curses.h in /usr/include/ncursesw.
  
 -- Issue #14701: Fix missing support for 'raise ... from' in parser module.
  
 -- Issue #13183: Fix pdb skipping frames after hitting a breakpoint and running
 -  step.  Patch by Xavier de Gaye.
 +What's New in Python 3.3.0 Beta 1?
 +==================================
  
 -- Issue #14696: Fix parser module to understand 'nonlocal' declarations.
 +*Release date: 27-Jun-2012*
  
 -- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
 -  the DST transition.  Patch by Joe Peterson.
 +Core and Builtins
 +-----------------
  
 -- Issue #9154: Fix parser module to understand function annotations.
 +- Fix a (most likely) very rare memory leak when calling main() and not being
 +  able to decode a command-line argument.
  
 -- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
 -  test class that doesn't inherit from TestCase (i.e. a mixin).
 +- Issue #14815: Use Py_ssize_t instead of long for the object hash, to
 +  preserve all 64 bits of hash on Win64.
  
 -- Issue #14160: TarFile.extractfile() failed to resolve symbolic links when
 -  the links were not located in an archive subdirectory.
 +- Issue #12268: File readline, readlines and read() or readall() methods
 +  no longer lose data when an underlying read system call is interrupted.
 +  IOError is no longer raised due to a read system call returning EINTR
 +  from within these methods.
  
 -- Issue #14638: pydoc now treats non-string __name__ values as if they
 -  were missing, instead of raising an error.
 +- Issue #11626: Add _SizeT functions to stable ABI.
  
 -- Issue #13684: Fix httplib tunnel issue of infinite loops for certain sites
 -  which send EOF without trailing \r\n.
 +- Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
  
 -- Issue #14629: Raise SyntaxError in tokenizer.detect_encoding if the
 -  first two lines have non-UTF-8 characters without an encoding declaration.
 +- Issue #15142: Fix reference leak when deallocating instances of types
 +  created using PyType_FromSpec().
  
 -- Issue #14308: Fix an exception when a "dummy" thread is in the threading
 -  module's active list after a fork().
 +- Issue #15042: Add PyState_AddModule and PyState_RemoveModule. Add version
 +  guard for Py_LIMITED_API additions. Patch by Robin Schreiber.
  
 -- Issue #14538: HTMLParser can now parse correctly start tags that contain
 -  a bare '/'.
 +- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
 +  the work by Hirokazu Yamamoto.
  
 -- Issue #14452: SysLogHandler no longer inserts a UTF-8 BOM into the message.
 +- Issue #15096: Removed support for ur'' as the raw notation isn't
 +  compatible with Python 2.x's raw unicode strings.
  
 -- Issue #13496: Fix potential overflow in bisect.bisect algorithm when applied
 -  to a collection of size > sys.maxsize / 2.
 +- Issue #13783: Generator objects now use the identifier APIs internally
  
 -- Issue #14399: zipfile now recognizes that the archive has been modified even
 -  if only the comment is changed.  In addition, the TypeError that results from
 -  trying to set a non-binary value as a comment is now now raised at the time
 -  the comment is set rather than at the time the zipfile is written.
 +- Issue #14874: Restore charmap decoding speed to pre-PEP 393 levels.
 +  Patch by Serhiy Storchaka.
  
 -- Issue #7978: socketserver now restarts the select() call when EINTR is
 -  returned.  This avoids crashing the server loop when a signal is received.
 -  Patch by Jerzy Kozera.
 +- Issue #15026: utf-16 encoding is now significantly faster (up to 10x).
 +  Patch by Serhiy Storchaka.
  
 -- Issue #14496: Fix wrong name in idlelib/tabbedpages.py.
 -  Patch by Popa Claudiu.
 +- Issue #11022: open() and io.TextIOWrapper are now calling
 +  locale.getpreferredencoding(False) instead of locale.getpreferredencoding()
 +  in text mode if the encoding is not specified. Don't change temporary the
 +  locale encoding using locale.setlocale(), use the current locale encoding
 +  instead of the user preferred encoding.
  
 -- Issue #14482: Raise a ValueError, not a NameError, when trying to create
 -  a multiprocessing Client or Listener with an AF_UNIX type address under
 -  Windows.  Patch by Popa Claudiu.
 +- Issue #14673: Add Eric Snow's sys.implementation implementation.
  
 -- Issue #14151: Raise a ValueError, not a NameError, when trying to create
 -  a multiprocessing Client or Listener with an AF_PIPE type address under
 -  non-Windows platforms.  Patch by Popa Claudiu.
 +- Issue #15038: Optimize python Locks on Windows.
  
 -- Issue #13872: socket.detach() now marks the socket closed (as mirrored
 -  in the socket repr()).  Patch by Matt Joiner.
 +Library
 +-------
  
 -- Issue #14406: Fix a race condition when using ``concurrent.futures.wait(
 -  return_when=ALL_COMPLETED)``.  Patch by Matt Joiner.
 +- Issue #15187: Bugfix: remove temporary directories test_shutil was leaving
 +  behind.
  
 -- Issue #14409: IDLE now properly executes commands in the Shell window
 -  when it cannot read the normal config files on startup and
 -  has to use the built-in default key bindings.
 -  There was previously a bug in one of the defaults.
 +- Issue #15177: Added dir_fd parameter to os.fwalk().
  
 -- Issue #10340: asyncore - properly handle EINVAL in dispatcher constructor on
 -  OSX; avoid to call handle_connect in case of a disconnected socket which
 -  was not meant to connect.
 +- Issue #15176: Clarified behavior, documentation, and implementation
 +  of os.listdir().
  
 -- Issue #12757: Fix the skipping of doctests when python is run with -OO so
 -  that it works in unittest's verbose mode as well as non-verbose mode.
 +- Issue #15061: Re-implemented hmac.compare_digest() in C to prevent further
 +  timing analysis and to support all buffer protocol aware objects as well as
 +  ASCII only str instances safely.
  
 -- Issue #3573: IDLE hangs when passing invalid command line args
 -  (directory(ies) instead of file(s)) (Patch by Guilherme Polo)
 +- Issue #15164: Change return value of platform.uname() from a
 +  plain tuple to a collections.namedtuple.
  
 -- Issue #13694: asynchronous connect in asyncore.dispatcher does not set addr
 -  attribute.
 +- Support Mageia Linux in the platform module.
  
 -- Issue #11686: Added missing entries to email package __all__ lists
 -  (mostly the new Bytes classes).
 +- Issue #11678: Support Arch linux in the platform module.
  
 -- Issue #10484: Fix the CGIHTTPServer's PATH_INFO handling problem.
 +- Issue #15118: Change return value of os.uname() and os.times() from
 +  plain tuples to immutable iterable objects with named attributes
 +  (structseq objects).
  
 -- Issue #11199: Fix the with urllib which hangs on particular ftp urls.
 +- Speed up _decimal by another 10-15% by caching the thread local context
 +  that was last accessed. In the pi benchmark (64-bit platform, prec=9),
 +  _decimal is now only 1.5x slower than float.
  
 -- Issue #14062: Header objects now correctly respect the 'linesep' setting
 -  when processed by BytesParser (which smtplib.SMTP.send_message uses).
 +- Remove the packaging module, which is not ready for prime time.
  
 -- Issue #14291: Email now defaults to utf-8 for non-ASCII unicode headers
 -  instead of raising an error.  This fixes a regression relative to 2.7.
 +- Issue #15154: Add "dir_fd" parameter to os.rmdir, remove "rmdir"
 +  parameter from os.remove / os.unlink.
  
 -- Issue #5219: Prevent event handler cascade in IDLE.
 +- Issue #4489: Add a shutil.rmtree that isn't susceptible to symlink attacks.
 +  It is used automatically on platforms supporting the necessary os.openat()
 +  and os.unlinkat() functions. Main code by Martin von Löwis.
  
 -- Issue #14184: Increase the default stack size for secondary threads on
 -  Mac OS X to avoid interpreter crashes when using threads on 10.7.
 +- Issue #15156: HTMLParser now uses the new "html.entities.html5" dictionary.
  
 -- Issue #10543: Fix unittest test discovery with Jython bytecode files.
 +- Issue #11113: add a new "html5" dictionary containing the named character
 +  references defined by the HTML5 standard and the equivalent Unicode
 +  character(s) to the html.entities module.
  
 -- Issue #14252: Fix subprocess.Popen.terminate() to not raise an error under
 -  Windows when the child process has already exited.
 +- Issue #15114: the strict mode of HTMLParser and the HTMLParseError exception
 +  are deprecated now that the parser is able to parse invalid markup.
  
 -- Issue #14195: An issue that caused weakref.WeakSet instances to incorrectly
 -  return True for a WeakSet instance 'a' in both 'a < a' and 'a > a' has been
 -  fixed.
 +- Issue #3665: \u and \U escapes are now supported in unicode regular
 +  expressions.  Patch by Serhiy Storchaka.
  
 -- Issue #14177: marshal.loads() now raises TypeError when given an unicode
 -  string.  Patch by Guilherme Gonçalves.
 +- Issue #15153: Added inspect.getgeneratorlocals to simplify white box
 +  testing of generator state updates
  
 -- Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary,
 -  WeakValueDictionary) to return a better approximation when some objects
 -  are dead or dying.  Moreover, the implementation is now O(1) rather than
 -  O(n).
 +- Issue #13062: Added inspect.getclosurevars to simplify testing stateful
 +  closures
  
 -- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode.
 -  Patch by Mikhail Novikov.
 +- Issue #11024: Fixes and additional tests for Time2Internaldate.
  
 -- Issue #13447: Add a test file to host regression tests for bugs in the
 -  scripts found in the Tools directory.
 +- Issue #14626: Large refactoring of functions / parameters in the os module.
 +  Many functions now support "dir_fd" and "follow_symlinks" parameters;
 +  some also support accepting an open file descriptor in place of of a path
 +  string.  Added os.support_* collections as LBYL helpers.  Removed many
 +  functions only previously seen in 3.3 alpha releases (often starting with
 +  "f" or "l", or ending with "at").  Originally suggested by Serhiy Storchaka;
 +  implemented by Larry Hastings.
  
 -- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions
 -  on 32-bit architectures. Initial patch by Philippe Devalkeneer.
 +- Issue #15008: Implement PEP 362 "Signature Objects".
 +  Patch by Yury Selivanov.
  
 -Extension Modules
 ------------------
 +- Issue: #15138: base64.urlsafe_{en,de}code() are now 3-4x faster.
  
 -- Issue #6493: An issue in ctypes on Windows that caused structure bitfields
 -  of type ctypes.c_uint32 and width 32 to incorrectly be set has been fixed.
 +- Issue #444582: Add shutil.which, for finding programs on the system path.
 +  Original patch by Erik Demaine, with later iterations by Jan Killian
 +  and Brian Curtin.
  
 -- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.
 +- Issue #14837: SSL errors now have ``library`` and ``reason`` attributes
 +  describing precisely what happened and in which OpenSSL submodule.  The
 +  str() of a SSLError is also enhanced accordingly.
  
 -- Issue #9041: An issue in ctypes.c_longdouble, ctypes.c_double, and
 -  ctypes.c_float that caused an incorrect exception to be returned in the
 -  case of overflow has been fixed.
 +- Issue #9527: datetime.astimezone() method will now supply a class
 +  timezone instance corresponding to the system local timezone when
 +  called with no arguments.
  
 -- Issue #14212: The re module didn't retain a reference to buffers it was
 -  scanning, resulting in segfaults.
 +- Issue #14653: email.utils.mktime_tz() no longer relies on system
 +  mktime() when timezone offest is supplied.
  
 -Tests
 ------
 +- Issue #14684: zlib.compressobj() and zlib.decompressobj() now support the use
 +  of predefined compression dictionaries. Original patch by Sam Rushing.
  
 -- Issue #15467: Move helpers for __sizeof__ tests into test_support.
 +- Fix GzipFile's handling of filenames given as bytes objects.
 +
 +- Issue #14772: Return destination values from some shutil functions.
 +
 +- Issue #15064: Implement context manager protocol for multiprocessing types
 +
 +- Issue #15101: Make pool finalizer avoid joining current thread.
 +
 +- Issue #14657: The frozen instance of importlib used for bootstrap is now
 +  also the module imported as importlib._bootstrap.
 +
 +- Issue #14055: Add __sizeof__ support to _elementtree.
 +
 +- Issue #15054: A bug in tokenize.tokenize that caused string literals
 +  with 'b' prefixes to be incorrectly tokenized has been fixed.
    Patch by Serhiy Storchaka.
  
 -- Issue #15320: Make iterating the list of tests thread-safe when running
 -  tests in multiprocess mode. Patch by Chris Jerdonek.
 +- Issue #15006: Allow equality comparison between naive and aware
 +  time or datetime objects.
  
 -- Issue #15230: Adopted a more systematic approach in the runpy tests
 +- Issue #14982: Document that pkgutil's iteration functions require the
 +  non-standard iter_modules() method to be defined by an importer (something
 +  the importlib importers do not define).
  
 -- Issue #15300: Ensure the temporary test working directories are in the same
 -  parent folder when running tests in multiprocess mode from a Python build.
 -  Patch by Chris Jerdonek.
 +- Issue #15036: Mailbox no longer throws an error if a flush is done
 +  between operations when removing or changing multiple items in mbox,
 +  MMDF, or Babyl mailboxes.
 +
 +- Issue #14059: Implement multiprocessing.Barrier.
 +
 +- Issue #15061: The inappropriately named hmac.secure_compare has been
 +  renamed to hmac.compare_digest, restricted to operating on bytes inputs
 +  only and had its documentation updated to more accurately reflect both its
 +  intent and its limitations
 +
 +- Issue #13841: Make child processes exit using sys.exit() on Windows.
 +
 +- Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
 +  Patch by Robin Schreiber.
 +
 +- Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
 +  in struct tm, time.struct_time objects returned by time.gmtime(),
 +  time.localtime() and time.strptime() functions now have tm_zone and
 +  tm_gmtoff attributes.  Original patch by Paul Boddie.
 +
 +- Rename adjusted attribute to adjustable in time.get_clock_info() result.
 +
 +- Issue #3518: Remove references to non-existent BaseManager.from_address()
 +  method.
 +
 +- Issue #13857: Added textwrap.indent() function (initial patch by Ezra
 +  Berch)
 +
 +- Issue #2736: Added datetime.timestamp() method.
 +
 +- Issue #13854: Make multiprocessing properly handle non-integer
 +  non-string argument to SystemExit.
 +
 +- Issue #12157: Make pool.map() empty iterables correctly.  Initial
 +  patch by mouad.
 +
 +- Issue #11823: disassembly now shows argument counts on calls with keyword args.
 +
 +- Issue #14711: os.stat_float_times() has been deprecated.
 +
 +- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".
 +
 +- The bz2 and lzma modules now each contain an open() function, allowing
 +  compressed files to readily be opened in text mode as well as binary mode.
 +
 +- BZ2File.__init__() and LZMAFile.__init__() now accept a file object as their
 +  first argument, rather than requiring a separate "fileobj" argument.
 +
 +- gzip.open() now accepts file objects as well as filenames.
 +
 +- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
 +  when the path existed and had the S_ISGID mode bit set when it was
 +  not explicitly asked for.  This is no longer an exception as mkdir
 +  cannot control if the OS sets that bit for it or not.
 +
 +- Issue #14989: Make the CGI enable option to http.server available via command
 +  line.
 +
 +- Issue #14987: Add a missing import statement to inspect.
 +
 +- Issue #1079: email.header.decode_header now correctly parses all the examples
 +  in RFC2047.  There is a necessary visible behavior change: the leading and/or
 +  trailing whitespace on ASCII parts is now preserved.
 +
 +- Issue #14969: Better handling of exception chaining in contextlib.ExitStack
 +
 +- Issue #14962: Update text coloring in IDLE shell window after changing
 +  options.  Patch by Roger Serwy.
 +
 +- Issue #14963: Convert contextlib.ExitStack.__exit__ to use an iterative
 +  algorithm (Patch by Alon Horev)
 +
 +- Issue #14785: Add sys._debugmallocstats() to help debug low-level memory
 +  allocation issues
 +
 +- Issue #14443: Ensure that .py files are byte-compiled with the correct Python
 +  executable within bdist_rpm even on older versions of RPM
 +
 +C-API
 +-----
 +
 +- Issue #13783: Inadvertent additions to the public C API in the PEP 380
 +  implementation have either been removed or marked as private interfaces.
 +
 +Extension Modules
 +-----------------
 +
 +- Issue #15000: Support the "unique" x32 architecture in _posixsubprocess.c.
 +
 +Documentation
 +-------------
 +
 +- Issue #15081: Document PyState_FindModule.
 +  Patch by Robin Schreiber.
 +
 +- Issue #14814: Added first draft of ipaddress module API reference
 +
 +Tests
 +-----
 +
 +- Issue #14769: test_capi now has SkipitemTest, which cleverly checks
 +  for "parity" between PyArg_ParseTuple() and the Python/getargs.c static
 +  function skipitem() for all possible "format units".
  
  - test_nntplib now tolerates being run from behind NNTP gateways that add
    "X-Antivirus" headers to articles