[pypy-commit] pypy py3.5-ssl: merge updates to py3.5

plan_rich pypy.commits at gmail.com
Mon Nov 14 08:29:15 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: py3.5-ssl
Changeset: r88374:2666380e3fad
Date: 2016-11-14 14:28 +0100
http://bitbucket.org/pypy/pypy/changeset/2666380e3fad/

Log:	merge updates to py3.5

diff too long, truncating to 2000 out of 17845 lines

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -33,3 +33,4 @@
 050d84dd78997f021acf0e133934275d63547cc0 release-pypy2.7-v5.4.1
 050d84dd78997f021acf0e133934275d63547cc0 release-pypy2.7-v5.4.1
 0e2d9a73f5a1818d0245d75daccdbe21b2d5c3ef release-pypy2.7-v5.4.1
+aff251e543859ce4508159dd9f1a82a2f553de00 release-pypy2.7-v5.6.0
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -44,15 +44,15 @@
   Matti Picus
   Alex Gaynor
   Philip Jenvey
+  Ronan Lamy
   Brian Kearns
-  Ronan Lamy
+  Richard Plangger
   Michael Hudson
   Manuel Jacob
   David Schneider
   Holger Krekel
   Christian Tismer
   Hakan Ardo
-  Richard Plangger
   Benjamin Peterson
   Anders Chrigstrom
   Eric van Riet Paap
@@ -68,8 +68,8 @@
   Niklaus Haldimann
   Camillo Bruni
   Laura Creighton
+  Romain Guillebert
   Toon Verwaest
-  Romain Guillebert
   Leonardo Santagada
   Seo Sanghyeon
   Ronny Pfannschmidt
@@ -89,7 +89,9 @@
   Ludovic Aubry
   Jacob Hallen
   Jason Creighton
+  Mark Young
   Alex Martelli
+  Spenser Bauman
   Michal Bendowski
   stian
   Jan de Mooij
@@ -100,20 +102,21 @@
   Stefan Schwarzer
   Valentino Volonghi
   Tomek Meka
+  Stefano Rivera
   Patrick Maupin
+  Devin Jeanpierre
   Bob Ippolito
   Bruno Gola
   David Malcolm
   Jean-Paul Calderone
-  Mark Young
   Timo Paulssen
+  Edd Barrett
   Squeaky
-  Devin Jeanpierre
   Marius Gedminas
   Alexandre Fayolle
   Simon Burton
-  Stefano Rivera
   Martin Matusiak
+  Nicolas Truessel
   Konstantin Lopuhin
   Wenzhu Man
   John Witulski
@@ -123,14 +126,12 @@
   Dario Bertini
   Mark Pearse
   Simon Cross
-  Edd Barrett
+  Jeremy Thurgood
   Andreas Stührk
   Tobias Pape
   Jean-Philippe St. Pierre
   Guido van Rossum
   Pavel Vinogradov
-  Spenser Bauman
-  Jeremy Thurgood
   Paweł Piotr Przeradowski
   Paul deGrandis
   Ilya Osadchiy
@@ -141,7 +142,6 @@
   tav
   Taavi Burns
   Georg Brandl
-  Nicolas Truessel
   Bert Freudenberg
   Stian Andreassen
   Wanja Saatkamp
@@ -156,19 +156,20 @@
   Preston Timmons
   David Ripton
   Jeff Terrace
+  Tim Felgentreff
   Dusty Phillips
   Lukas Renggli
   Guenter Jantzen
   William Leslie
   Ned Batchelder
-  Tim Felgentreff
   Anton Gulenko
   Amit Regmi
   Ben Young
-  Sergey Matyunin
+  Jasper Schulz
   Nicolas Chauvat
   Andrew Durdin
   Andrew Chambers
+  Sergey Matyunin
   Michael Schneider
   Nicholas Riley
   Jason Chu
@@ -184,16 +185,16 @@
   Jared Grubb
   Karl Bartel
   Wouter van Heyst
-  Sebastian Pawluś
   Brian Dorsey
   Victor Stinner
   Andrews Medina
+  Sebastian Pawluś
   Stuart Williams
-  Jasper Schulz
-  Christian Hudon
+  Daniel Patrick
+  Aaron Iles
   Toby Watson
   Antoine Pitrou
-  Aaron Iles
+  Christian Hudon
   Michael Cheng
   Justas Sadzevicius
   Gasper Zejn
@@ -201,8 +202,8 @@
   Stanislaw Halik
   Mikael Schönenberg
   Berkin Ilbeyi
+  Faye Zhao
   Elmo Mäntynen
-  Faye Zhao
   Jonathan David Riehl
   Anders Qvist
   Corbin Simpson
@@ -211,11 +212,12 @@
   Alex Perry
   Vaibhav Sood
   Alan McIntyre
+  Reuben Cummings
   Alexander Sedov
   p_zieschang at yahoo.de
   Attila Gobi
-  Jasper.Schulz
   Christopher Pope
+  Aaron Gallagher
   Florin Papa
   Christian Tismer 
   Marc Abramowitz
@@ -232,7 +234,6 @@
   Gabriel
   Lukas Vacek
   Kunal Grover
-  Aaron Gallagher
   Andrew Dalke
   Sylvain Thenault
   Jakub Stasiak
@@ -255,6 +256,7 @@
   Philipp Rustemeuer
   Henrik Vendelbo
   Richard Lancaster
+  Yasir Suhail
   Dan Buch
   Miguel de Val Borro
   Artur Lisiecki
@@ -267,6 +269,7 @@
   Catalin Gabriel Manciu
   Tomo Cocoa
   Kim Jin Su
+  rafalgalczynski at gmail.com
   Toni Mattis
   Amber Brown
   Lucas Stadler
@@ -294,9 +297,7 @@
   Michael Hudson-Doyle
   Anders Sigfridsson
   Nikolay Zinov
-  Yasir Suhail
   Jason Michalski
-  rafalgalczynski at gmail.com
   Floris Bruynooghe
   Laurens Van Houtven
   Akira Li
@@ -310,9 +311,10 @@
   James Lan
   Volodymyr Vladymyrov
   shoma hosaka
-  Daniel Neuhäuser
   Ben Mather
   Niclas Olofsson
+  Matthew Miller
+  Rodrigo Araújo
   halgari
   Boglarka Vezer
   Chris Pressey
@@ -322,8 +324,9 @@
   Dinu Gherman
   Chris Lambacher
   coolbutuseless at gmail.com
+  Daniil Yarancev
   Jim Baker
-  Rodrigo Araújo
+  Dan Crosta
   Nikolaos-Digenis Karagiannis
   James Robert
   Armin Ronacher
@@ -337,32 +340,31 @@
   Tomer Chachamu
   Christopher Groskopf
   Asmo Soinio
-  Stefan Marr
   jiaaro
   Mads Kiilerich
-  opassembler.py
   Antony Lee
   Jason Madden
+  Daniel Neuh�user
+  reubano at gmail.com
   Yaroslav Fedevych
   Jim Hunziker
   Markus Unterwaditzer
   Even Wiik Thomassen
   jbs
   squeaky
-  Zearin
   soareschen
   Jonas Pfannschmidt
   Kurt Griffiths
   Mike Bayer
-  Matthew Miller
+  Stefan Marr
   Flavio Percoco
   Kristoffer Kleine
-  yasirs
   Michael Chermside
   Anna Ravencroft
   pizi
+  remarkablerocket
   Andrey Churin
-  Dan Crosta
+  Zearin
   Eli Stevens
   Tobias Diaz
   Julien Phalip
diff --git a/lib-python/2.7/ctypes/test/test_bitfields.py b/lib-python/2.7/ctypes/test/test_bitfields.py
--- a/lib-python/2.7/ctypes/test/test_bitfields.py
+++ b/lib-python/2.7/ctypes/test/test_bitfields.py
@@ -2,6 +2,7 @@
 from ctypes.test import need_symbol, xfail
 import unittest
 import os
+import sys
 
 import ctypes
 import _ctypes_test
@@ -279,7 +280,6 @@
         x.c = 2
         self.assertEqual(b.tostring(), b'\xef\xcd\xab\x21')
 
-    @xfail
     @need_symbol('c_uint32')
     def test_uint32_swap_big_endian(self):
         # Issue #23319
@@ -295,5 +295,11 @@
         x.c = 2
         self.assertEqual(b.tostring(), b'\xab\xcd\xef\x12')
 
+    # see issue #1213, on big endian it fails for the little endian case
+    if sys.byteorder == 'little':
+        test_uint32_swap_big_endian = xfail(test_uint32_swap_big_endian)
+    elif sys.byteorder == 'big':
+        test_uint32_swap_little_endian = xfail(test_uint32_swap_little_endian)
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/lib-python/2.7/test/test_ssl.py b/lib-python/2.7/test/test_ssl.py
--- a/lib-python/2.7/test/test_ssl.py
+++ b/lib-python/2.7/test/test_ssl.py
@@ -26,6 +26,8 @@
 
 PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
 HOST = support.HOST
+IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
+IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
 
 def data_file(*name):
     return os.path.join(os.path.dirname(__file__), *name)
@@ -742,15 +744,15 @@
     def test_options(self):
         ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
         # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
-        self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
-                         ctx.options)
+        default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
+        if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0):
+            default |= ssl.OP_NO_COMPRESSION
+        self.assertEqual(default, ctx.options)
         ctx.options |= ssl.OP_NO_TLSv1
-        self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1,
-                         ctx.options)
+        self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options)
         if can_clear_options():
-            ctx.options = (ctx.options & ~ssl.OP_NO_SSLv2) | ssl.OP_NO_TLSv1
-            self.assertEqual(ssl.OP_ALL | ssl.OP_NO_TLSv1 | ssl.OP_NO_SSLv3,
-                             ctx.options)
+            ctx.options = (ctx.options & ~ssl.OP_NO_TLSv1)
+            self.assertEqual(default, ctx.options)
             ctx.options = 0
             self.assertEqual(0, ctx.options)
         else:
@@ -2918,18 +2920,27 @@
                 client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
                 client_context.load_cert_chain(CERTFILE)
                 client_context.set_alpn_protocols(client_protocols)
-                stats = server_params_test(client_context, server_context,
-                                           chatty=True, connectionchatty=True)
-
-                msg = "failed trying %s (s) and %s (c).\n" \
-                      "was expecting %s, but got %%s from the %%s" \
-                          % (str(server_protocols), str(client_protocols),
-                             str(expected))
-                client_result = stats['client_alpn_protocol']
-                self.assertEqual(client_result, expected, msg % (client_result, "client"))
-                server_result = stats['server_alpn_protocols'][-1] \
-                    if len(stats['server_alpn_protocols']) else 'nothing'
-                self.assertEqual(server_result, expected, msg % (server_result, "server"))
+                try:
+                    stats = server_params_test(client_context, server_context,
+                                               chatty=True, connectionchatty=True)
+                except ssl.SSLError as e:
+                    stats = e
+
+                if expected is None and IS_OPENSSL_1_1:
+                    # OpenSSL 1.1.0 raises handshake error
+                    self.assertIsInstance(stats, ssl.SSLError)
+                else:
+                    msg = "failed trying %s (s) and %s (c).\n" \
+                          "was expecting %s, but got %%s from the %%s" \
+                              % (str(server_protocols), str(client_protocols),
+                                 str(expected))
+                    client_result = stats['client_alpn_protocol']
+                    self.assertEqual(client_result, expected,
+                                     msg % (client_result, "client"))
+                    server_result = stats['server_alpn_protocols'][-1] \
+                        if len(stats['server_alpn_protocols']) else 'nothing'
+                    self.assertEqual(server_result, expected,
+                                     msg % (server_result, "server"))
 
         def test_selected_npn_protocol(self):
             # selected_npn_protocol() is None unless NPN is used
diff --git a/lib-python/3/ssl.py b/lib-python/3/ssl.py
--- a/lib-python/3/ssl.py
+++ b/lib-python/3/ssl.py
@@ -745,8 +745,7 @@
                         # non-blocking
                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
                     self.do_handshake()
-
-            except (OSError, ValueError):
+            except:
                 self.close()
                 raise
 
diff --git a/lib-python/3/test/test_bytes.py b/lib-python/3/test/test_bytes.py
--- a/lib-python/3/test/test_bytes.py
+++ b/lib-python/3/test/test_bytes.py
@@ -1006,9 +1006,13 @@
     def test_del_expand(self):
         # Reducing the size should not expand the buffer (issue #23985)
         b = bytearray(10)
-        size = sys.getsizeof(b)
-        del b[:1]
-        self.assertLessEqual(sys.getsizeof(b), size)
+        try:
+            size = sys.getsizeof(b)
+        except TypeError:
+            pass            # e.g. on pypy
+        else:
+            del b[:1]
+            self.assertLessEqual(sys.getsizeof(b), size)
 
     def test_extended_set_del_slice(self):
         indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
diff --git a/lib-python/3/test/test_collections.py b/lib-python/3/test/test_collections.py
--- a/lib-python/3/test/test_collections.py
+++ b/lib-python/3/test/test_collections.py
@@ -13,6 +13,7 @@
 import re
 import sys
 import types
+import gc
 from collections import UserDict, UserString, UserList
 from collections import ChainMap
 from collections import deque
@@ -1630,7 +1631,7 @@
 ################################################################################
 
 py_coll = import_fresh_module('collections', blocked=['_collections'])
-c_coll = import_fresh_module('collections', fresh=['_collections'])
+c_coll = import_fresh_module('_collections', fresh=['_collections'])
 
 
 @contextlib.contextmanager
@@ -2052,7 +2053,9 @@
             obj = MyOD([(None, obj)])
             obj.i = i
         del obj
-        support.gc_collect()
+        # PyPy change: we only collect 1 MyOD instance per GC
+        for _ in range(100):
+            gc.collect()
         self.assertEqual(deleted, list(reversed(range(100))))
 
     def test_delitem_hash_collision(self):
@@ -2212,11 +2215,11 @@
     OrderedDict = py_coll.OrderedDict
 
 
- at unittest.skipUnless(c_coll, 'requires the C version of the collections module')
+ at unittest.skipUnless(hasattr(c_coll, 'OrderedDict'), 'requires the C version of the collections module')
 class CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase):
 
     module = c_coll
-    OrderedDict = c_coll.OrderedDict
+    OrderedDict = getattr(c_coll, 'OrderedDict', None)
 
     def test_key_change_during_iteration(self):
         OrderedDict = self.OrderedDict
@@ -2246,8 +2249,10 @@
 class CPythonOrderedDictSubclassTests(CPythonOrderedDictTests):
 
     module = c_coll
-    class OrderedDict(c_coll.OrderedDict):
-        pass
+
+    if hasattr(c_coll, 'OrderedDict'):
+        class OrderedDict(c_coll.OrderedDict):
+            pass
 
 
 class PurePythonGeneralMappingTests(mapping_tests.BasicTestMappingProtocol):
@@ -2261,7 +2266,7 @@
         self.assertRaises(KeyError, d.popitem)
 
 
- at unittest.skipUnless(c_coll, 'requires the C version of the collections module')
+ at unittest.skipUnless(hasattr(c_coll, 'OrderedDict'), 'requires the C version of the collections module')
 class CPythonGeneralMappingTests(mapping_tests.BasicTestMappingProtocol):
 
     @classmethod
@@ -2286,7 +2291,7 @@
         self.assertRaises(KeyError, d.popitem)
 
 
- at unittest.skipUnless(c_coll, 'requires the C version of the collections module')
+ at unittest.skipUnless(hasattr(c_coll, 'OrderedDict'), 'requires the C version of the collections module')
 class CPythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol):
 
     @classmethod
diff --git a/lib-python/3/test/test_functools.py b/lib-python/3/test/test_functools.py
--- a/lib-python/3/test/test_functools.py
+++ b/lib-python/3/test/test_functools.py
@@ -129,6 +129,7 @@
         p = proxy(f)
         self.assertEqual(f.func, p.func)
         f = None
+        support.gc_collect()
         self.assertRaises(ReferenceError, getattr, p, 'func')
 
     def test_with_bound_and_unbound_methods(self):
@@ -229,13 +230,7 @@
                 raise IndexError
 
         f = self.partial(object)
-        if support.check_impl_detail(pypy=True):
-            # CPython fails, pypy does not :-)
-            f.__setstate__(BadSequence())
-        else:
-            self.assertRaisesRegex(SystemError,
-                    "new style getargs format but argument is not a tuple",
-                    f.__setstate__, BadSequence())
+        self.assertRaises(TypeError, f.__setstate__, BadSequence())
 
 
 class TestPartialPy(TestPartial, unittest.TestCase):
diff --git a/lib-python/3/test/test_generators.py b/lib-python/3/test/test_generators.py
--- a/lib-python/3/test/test_generators.py
+++ b/lib-python/3/test/test_generators.py
@@ -96,8 +96,8 @@
         # generator names must be a string and cannot be deleted
         self.assertRaises(TypeError, setattr, gen, '__name__', 123)
         self.assertRaises(TypeError, setattr, gen, '__qualname__', 123)
-        self.assertRaises(TypeError, delattr, gen, '__name__')
-        self.assertRaises(TypeError, delattr, gen, '__qualname__')
+        self.assertRaises((TypeError, AttributeError), delattr, gen, '__name__')
+        self.assertRaises((TypeError, AttributeError), delattr, gen, '__qualname__')
 
         # modify names of the function creating the generator
         func.__qualname__ = "func_qualname"
diff --git a/lib-python/3/test/test_httpservers.py b/lib-python/3/test/test_httpservers.py
--- a/lib-python/3/test/test_httpservers.py
+++ b/lib-python/3/test/test_httpservers.py
@@ -254,7 +254,8 @@
 
         with support.captured_stderr() as err:
             self.con.request('GET', '/')
-            self.con.getresponse()
+            with self.con.getresponse():
+                pass
 
         self.assertTrue(
             err.getvalue().endswith('"GET / HTTP/1.1" 200 -\n'))
@@ -265,7 +266,8 @@
 
         with support.captured_stderr() as err:
             self.con.request('ERROR', '/')
-            self.con.getresponse()
+            with self.con.getresponse():
+                pass
 
         lines = err.getvalue().split('\n')
         self.assertTrue(lines[0].endswith('code 404, message File not found'))
diff --git a/lib-python/3/test/test_logging.py b/lib-python/3/test/test_logging.py
--- a/lib-python/3/test/test_logging.py
+++ b/lib-python/3/test/test_logging.py
@@ -1665,7 +1665,7 @@
         logger = logging.getLogger("http")
         root_logger = self.root_logger
         root_logger.removeHandler(self.root_logger.handlers[0])
-        for secure in (False, True):
+        for secure in (False,):  # XXX: disable SSL tests until it works
             addr = ('localhost', 0)
             if secure:
                 try:
diff --git a/lib-python/3/test/test_sax.py b/lib-python/3/test/test_sax.py
--- a/lib-python/3/test/test_sax.py
+++ b/lib-python/3/test/test_sax.py
@@ -16,7 +16,6 @@
 from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
 from io import BytesIO, StringIO
 import codecs
-import gc
 import os.path
 import shutil
 from test import support
@@ -180,7 +179,7 @@
             with self.assertRaises(SAXException):
                 self.check_parse(TESTFN)
             # Collect leaked file.
-            gc.collect()
+            support.gc_collect()
         with open(TESTFN, 'rb') as f:
             with self.assertRaises(SAXException):
                 self.check_parse(f)
diff --git a/lib-python/3/test/test_ssl.py b/lib-python/3/test/test_ssl.py
--- a/lib-python/3/test/test_ssl.py
+++ b/lib-python/3/test/test_ssl.py
@@ -1898,7 +1898,14 @@
                 else:
                     self.sock.close()
 
+            # PyPy change
             def run(self):
+                try:
+                    self._run()
+                finally:
+                    self.close()
+
+            def _run(self):
                 self.running = True
                 if not self.server.starttls_server:
                     if not self.wrap_conn():
diff --git a/lib-python/3/test/test_urllib2_localnet.py b/lib-python/3/test/test_urllib2_localnet.py
--- a/lib-python/3/test/test_urllib2_localnet.py
+++ b/lib-python/3/test/test_urllib2_localnet.py
@@ -544,6 +544,7 @@
         self.assertEqual(handler.requests, ["/bizarre", b"get=with_feeling"])
 
     def test_https(self):
+        self.skipTest('Segfaults on PyPy')
         handler = self.start_https_server()
         context = ssl.create_default_context(cafile=CERT_localhost)
         data = self.urlopen("https://localhost:%s/bizarre" % handler.port, context=context)
@@ -573,6 +574,7 @@
                          cadefault=True)
 
     def test_https_sni(self):
+        self.skipTest('Segfaults on PyPy')
         if ssl is None:
             self.skipTest("ssl module required")
         if not ssl.HAS_SNI:
diff --git a/lib-python/3/tkinter/test/test_tkinter/test_images.py b/lib-python/3/tkinter/test/test_tkinter/test_images.py
--- a/lib-python/3/tkinter/test/test_tkinter/test_images.py
+++ b/lib-python/3/tkinter/test/test_tkinter/test_images.py
@@ -36,6 +36,7 @@
         self.assertEqual(image.height(), 16)
         self.assertIn('::img::test', self.root.image_names())
         del image
+        support.gc_collect()
         self.assertNotIn('::img::test', self.root.image_names())
 
     def test_create_from_data(self):
@@ -50,6 +51,7 @@
         self.assertEqual(image.height(), 16)
         self.assertIn('::img::test', self.root.image_names())
         del image
+        support.gc_collect()
         self.assertNotIn('::img::test', self.root.image_names())
 
     def assertEqualStrList(self, actual, expected):
@@ -130,6 +132,7 @@
         self.assertEqual(image['file'], testfile)
         self.assertIn('::img::test', self.root.image_names())
         del image
+        support.gc_collect()
         self.assertNotIn('::img::test', self.root.image_names())
 
     def check_create_from_data(self, ext):
@@ -147,6 +150,7 @@
         self.assertEqual(image['file'], '')
         self.assertIn('::img::test', self.root.image_names())
         del image
+        support.gc_collect()
         self.assertNotIn('::img::test', self.root.image_names())
 
     def test_create_from_ppm_file(self):
diff --git a/lib-python/3/tkinter/test/test_ttk/test_extensions.py b/lib-python/3/tkinter/test/test_ttk/test_extensions.py
--- a/lib-python/3/tkinter/test/test_ttk/test_extensions.py
+++ b/lib-python/3/tkinter/test/test_ttk/test_extensions.py
@@ -2,7 +2,7 @@
 import unittest
 import tkinter
 from tkinter import ttk
-from test.support import requires, run_unittest, swap_attr
+from test.support import requires, run_unittest, swap_attr, gc_collect
 from tkinter.test.support import AbstractTkTest, destroy_default_root
 
 requires('gui')
diff --git a/lib-python/3/tkinter/test/test_ttk/test_widgets.py b/lib-python/3/tkinter/test/test_ttk/test_widgets.py
--- a/lib-python/3/tkinter/test/test_ttk/test_widgets.py
+++ b/lib-python/3/tkinter/test/test_ttk/test_widgets.py
@@ -1,7 +1,7 @@
 import unittest
 import tkinter
 from tkinter import ttk, TclError
-from test.support import requires
+from test.support import requires, gc_collect
 import sys
 
 from tkinter.test.test_ttk.test_functions import MockTclObj
@@ -837,6 +837,7 @@
         self.assertEqual(conv(self.scale.get()), var.get())
         self.assertEqual(conv(self.scale.get()), max + 5)
         del var
+        gc_collect()
 
         # the same happens with the value option
         self.scale['value'] = max + 10
diff --git a/lib_pypy/_functools.py b/lib_pypy/_functools.py
--- a/lib_pypy/_functools.py
+++ b/lib_pypy/_functools.py
@@ -42,6 +42,13 @@
         self, func, args = args[0], args[1], args[2:]
         if not callable(func):
             raise TypeError("the first argument must be callable")
+        if isinstance(func, partial):
+            args = func._args + args
+            tmpkw = func._keywords.copy()
+            tmpkw.update(keywords)
+            keywords = tmpkw
+            del tmpkw
+            func = func._func
         self._func = func
         self._args = args
         self._keywords = keywords
@@ -113,3 +120,24 @@
             self.__dict__.clear()
         else:
             self.__dict__.update(d)
+
+
+ at builtinify
+def cmp_to_key(mycmp):
+    """Convert a cmp= function into a key= function"""
+    class K(object):
+        __slots__ = ['obj']
+        def __init__(self, obj):
+            self.obj = obj
+        def __lt__(self, other):
+            return mycmp(self.obj, other.obj) < 0
+        def __gt__(self, other):
+            return mycmp(self.obj, other.obj) > 0
+        def __eq__(self, other):
+            return mycmp(self.obj, other.obj) == 0
+        def __le__(self, other):
+            return mycmp(self.obj, other.obj) <= 0
+        def __ge__(self, other):
+            return mycmp(self.obj, other.obj) >= 0
+        __hash__ = None
+    return K
diff --git a/lib_pypy/_libmpdec/io.c b/lib_pypy/_libmpdec/io.c
--- a/lib_pypy/_libmpdec/io.c
+++ b/lib_pypy/_libmpdec/io.c
@@ -446,7 +446,7 @@
 
     if (mpd_isspecial(dec)) {
 
-        mem = sizeof "-Infinity";
+        mem = sizeof "-Infinity%";
         if (mpd_isnan(dec) && dec->len > 0) {
             /* diagnostic code */
             mem += dec->digits;
@@ -609,10 +609,10 @@
             *cp++ = (flags&MPD_FMT_UPPER) ? 'E' : 'e';
             cp = exp_to_string(cp, ldigits-dplace);
         }
+    }
 
-        if (flags&MPD_FMT_PERCENT) {
-            *cp++ = '%';
-        }
+    if (flags&MPD_FMT_PERCENT) {
+        *cp++ = '%';
     }
 
     assert(cp < decstring+mem);
@@ -1260,6 +1260,9 @@
             stackspec.align = '>';
             spec = &stackspec;
         }
+        if (type == '%') {
+            flags |= MPD_FMT_PERCENT;
+        }
     }
     else {
         uint32_t workstatus = 0;
diff --git a/lib_pypy/_libmpdec/mpdecimal.c b/lib_pypy/_libmpdec/mpdecimal.c
--- a/lib_pypy/_libmpdec/mpdecimal.c
+++ b/lib_pypy/_libmpdec/mpdecimal.c
@@ -43,6 +43,7 @@
 #ifdef PPRO
   #if defined(_MSC_VER)
     #include <float.h>
+    #pragma float_control(precise, on)
     #pragma fenv_access(on)
   #elif !defined(__OpenBSD__) && !defined(__NetBSD__)
     /* C99 */
diff --git a/lib_pypy/_libmpdec/mpdecimal.h b/lib_pypy/_libmpdec/mpdecimal.h
--- a/lib_pypy/_libmpdec/mpdecimal.h
+++ b/lib_pypy/_libmpdec/mpdecimal.h
@@ -108,9 +108,13 @@
 
 #define MPD_MAJOR_VERSION 2
 #define MPD_MINOR_VERSION 4
-#define MPD_MICRO_VERSION 0
+#define MPD_MICRO_VERSION 1
 
-#define MPD_VERSION "2.4.0"
+#define MPD_VERSION "2.4.1"
+
+#define MPD_VERSION_HEX ((MPD_MAJOR_VERSION << 24) | \
+                         (MPD_MINOR_VERSION << 16) | \
+                         (MPD_MICRO_VERSION <<  8))
 
 const char *mpd_version(void);
 
diff --git a/lib_pypy/_tkinter/app.py b/lib_pypy/_tkinter/app.py
--- a/lib_pypy/_tkinter/app.py
+++ b/lib_pypy/_tkinter/app.py
@@ -359,7 +359,7 @@
             for i in range(objc[0]):
                 result.append(FromObj(self, objv[0][i]))
             return tuple(result)
-        elif isinstance(arg, tuple):
+        elif isinstance(arg, (tuple, list)):
             return self._splitObj(arg)
         if isinstance(arg, str):
             arg = arg.encode('utf-8')
@@ -378,6 +378,8 @@
             return tuple(result)
         elif isinstance(arg, tuple):
             return arg
+        elif isinstance(arg, list):
+            return tuple(arg)
         elif isinstance(arg, str):
             arg = arg.encode('utf8')
 
@@ -411,6 +413,9 @@
                 result[i] = newelem
             if result is not None:
                 return tuple(result)
+        if isinstance(arg, list):
+            # Recursively invoke SplitObj for all list items.
+            return tuple(self._splitObj(elem) for elem in arg)
         elif isinstance(arg, str):
             argc = tkffi.new("int*")
             argv = tkffi.new("char***")
@@ -483,7 +488,10 @@
     def getboolean(self, s):
         if isinstance(s, int):
             return bool(s)
-        s = s.encode('utf-8')
+        try:
+            s = s.encode('utf-8')
+        except AttributeError:
+            raise TypeError
         if b'\x00' in s:
             raise TypeError
         v = tkffi.new("int*")
@@ -493,9 +501,12 @@
         return bool(v[0])
 
     def getint(self, s):
-        if isinstance(s, (int, long)):
+        if isinstance(s, int):
             return s
-        s = s.encode('utf-8')
+        try:
+            s = s.encode('utf-8')
+        except AttributeError:
+            raise TypeError
         if b'\x00' in s:
             raise TypeError
         if tklib.HAVE_LIBTOMMATH or tklib.HAVE_WIDE_INT_TYPE:
@@ -517,11 +528,14 @@
             return v[0]
 
     def getdouble(self, s):
-        if isinstance(s, float):
-            return s
-        if '\x00' in s:
+        if isinstance(s, (float, int)):
+            return float(s)
+        try:
+            s = s.encode('utf-8')
+        except AttributeError:
             raise TypeError
-        s = s.encode('utf-8')
+        if b'\x00' in s:
+            raise TypeError
         v = tkffi.new("double*")
         res = tklib.Tcl_GetDouble(self.interp, s, v)
         if res == tklib.TCL_ERROR:
diff --git a/lib_pypy/_tkinter/tclobj.py b/lib_pypy/_tkinter/tclobj.py
--- a/lib_pypy/_tkinter/tclobj.py
+++ b/lib_pypy/_tkinter/tclobj.py
@@ -70,7 +70,7 @@
 
 def AsBignumObj(value):
     sign = -1 if value < 0 else 1
-    hexstr = '%x' % abs(value)
+    hexstr = b'%x' % abs(value)
     bigValue = tkffi.new("mp_int*")
     tklib.mp_init(bigValue)
     try:
@@ -133,7 +133,7 @@
 
 def AsObj(value):
     if isinstance(value, bytes):
-        return tklib.Tcl_NewStringObj(value, len(value))
+        return tklib.Tcl_NewByteArrayObj(value, len(value))
     if isinstance(value, bool):
         return tklib.Tcl_NewBooleanObj(value)
     if isinstance(value, int):
@@ -151,7 +151,7 @@
                 return AsBignumObj(value)
     if isinstance(value, float):
         return tklib.Tcl_NewDoubleObj(value)
-    if isinstance(value, tuple):
+    if isinstance(value, (tuple, list)):
         argv = tkffi.new("Tcl_Obj*[]", len(value))
         for i in range(len(value)):
             argv[i] = AsObj(value[i])
diff --git a/lib_pypy/cffi.egg-info/PKG-INFO b/lib_pypy/cffi.egg-info/PKG-INFO
--- a/lib_pypy/cffi.egg-info/PKG-INFO
+++ b/lib_pypy/cffi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: cffi
-Version: 1.8.4
+Version: 1.9.0
 Summary: Foreign Function Interface for Python calling C code.
 Home-page: http://cffi.readthedocs.org
 Author: Armin Rigo, Maciej Fijalkowski
diff --git a/lib_pypy/cffi/__init__.py b/lib_pypy/cffi/__init__.py
--- a/lib_pypy/cffi/__init__.py
+++ b/lib_pypy/cffi/__init__.py
@@ -4,8 +4,8 @@
 from .api import FFI, CDefError, FFIError
 from .ffiplatform import VerificationError, VerificationMissing
 
-__version__ = "1.8.4"
-__version_info__ = (1, 8, 4)
+__version__ = "1.9.0"
+__version_info__ = (1, 9, 0)
 
 # The verifier module file names are based on the CRC32 of a string that
 # contains the following version number.  It may be older than __version__
diff --git a/lib_pypy/cffi/_cffi_include.h b/lib_pypy/cffi/_cffi_include.h
--- a/lib_pypy/cffi/_cffi_include.h
+++ b/lib_pypy/cffi/_cffi_include.h
@@ -141,9 +141,9 @@
 #define _cffi_to_c_char                                                  \
                  ((int(*)(PyObject *))_cffi_exports[9])
 #define _cffi_from_c_pointer                                             \
-    ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10])
+    ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10])
 #define _cffi_to_c_pointer                                               \
-    ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11])
+    ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11])
 #define _cffi_get_struct_layout                                          \
     not used any more
 #define _cffi_restore_errno                                              \
@@ -153,11 +153,11 @@
 #define _cffi_from_c_char                                                \
     ((PyObject *(*)(char))_cffi_exports[15])
 #define _cffi_from_c_deref                                               \
-    ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16])
+    ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16])
 #define _cffi_to_c                                                       \
-    ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17])
+    ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17])
 #define _cffi_from_c_struct                                              \
-    ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18])
+    ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18])
 #define _cffi_to_c_wchar_t                                               \
     ((wchar_t(*)(PyObject *))_cffi_exports[19])
 #define _cffi_from_c_wchar_t                                             \
@@ -167,21 +167,22 @@
 #define _cffi_to_c__Bool                                                 \
     ((_Bool(*)(PyObject *))_cffi_exports[22])
 #define _cffi_prepare_pointer_call_argument                              \
-    ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23])
+    ((Py_ssize_t(*)(struct _cffi_ctypedescr *,                           \
+                    PyObject *, char **))_cffi_exports[23])
 #define _cffi_convert_array_from_object                                  \
-    ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24])
+    ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24])
 #define _CFFI_CPIDX  25
 #define _cffi_call_python                                                \
     ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX])
 #define _CFFI_NUM_EXPORTS 26
 
-typedef struct _ctypedescr CTypeDescrObject;
+struct _cffi_ctypedescr;
 
 static void *_cffi_exports[_CFFI_NUM_EXPORTS];
 
 #define _cffi_type(index)   (                           \
     assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \
-    (CTypeDescrObject *)_cffi_types[index])
+    (struct _cffi_ctypedescr *)_cffi_types[index])
 
 static PyObject *_cffi_init(const char *module_name, Py_ssize_t version,
                             const struct _cffi_type_context_s *ctx)
diff --git a/lib_pypy/cffi/_embedding.h b/lib_pypy/cffi/_embedding.h
--- a/lib_pypy/cffi/_embedding.h
+++ b/lib_pypy/cffi/_embedding.h
@@ -233,7 +233,7 @@
         f = PySys_GetObject((char *)"stderr");
         if (f != NULL && f != Py_None) {
             PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
-                               "\ncompiled with cffi version: 1.8.4"
+                               "\ncompiled with cffi version: 1.9.0"
                                "\n_cffi_backend module: ", f);
             modules = PyImport_GetModuleDict();
             mod = PyDict_GetItemString(modules, "_cffi_backend");
@@ -366,7 +366,7 @@
     const char *code;
 } _cffi_pypy_init = {
     _CFFI_MODULE_NAME,
-    _CFFI_PYTHON_STARTUP_FUNC,
+    (void(*)(const void *[]))_CFFI_PYTHON_STARTUP_FUNC,
     _CFFI_PYTHON_STARTUP_CODE,
 };
 
diff --git a/pypy/doc/contributor.rst b/pypy/doc/contributor.rst
--- a/pypy/doc/contributor.rst
+++ b/pypy/doc/contributor.rst
@@ -9,8 +9,8 @@
   Philip Jenvey
   Ronan Lamy
   Brian Kearns
+  Richard Plangger
   Michael Hudson
-  Richard Plangger
   Manuel Jacob
   David Schneider
   Holger Krekel
@@ -54,10 +54,10 @@
   Jason Creighton
   Mark Young
   Alex Martelli
+  Spenser Bauman
   Michal Bendowski
   stian
   Jan de Mooij
-  Spenser Bauman
   Tyler Wade
   Vincent Legoll
   Michael Foord
@@ -65,13 +65,13 @@
   Stefan Schwarzer
   Valentino Volonghi
   Tomek Meka
+  Stefano Rivera
   Patrick Maupin
   Devin Jeanpierre
   Bob Ippolito
   Bruno Gola
   David Malcolm
   Jean-Paul Calderone
-  Stefano Rivera
   Timo Paulssen
   Edd Barrett
   Squeaky
@@ -89,12 +89,12 @@
   Dario Bertini
   Mark Pearse
   Simon Cross
+  Jeremy Thurgood
   Andreas Stührk
   Tobias Pape
   Jean-Philippe St. Pierre
   Guido van Rossum
   Pavel Vinogradov
-  Jeremy Thurgood
   Paweł Piotr Przeradowski
   Paul deGrandis
   Ilya Osadchiy
@@ -128,10 +128,11 @@
   Anton Gulenko
   Amit Regmi
   Ben Young
-  Sergey Matyunin
+  Jasper Schulz
   Nicolas Chauvat
   Andrew Durdin
   Andrew Chambers
+  Sergey Matyunin
   Michael Schneider
   Nicholas Riley
   Jason Chu
@@ -147,17 +148,16 @@
   Jared Grubb
   Karl Bartel
   Wouter van Heyst
-  Sebastian Pawluś
   Brian Dorsey
   Victor Stinner
   Andrews Medina
+  Sebastian Pawluś
   Stuart Williams
   Daniel Patrick
-  Jasper Schulz
-  Christian Hudon
+  Aaron Iles
   Toby Watson
   Antoine Pitrou
-  Aaron Iles
+  Christian Hudon
   Michael Cheng
   Justas Sadzevicius
   Gasper Zejn
@@ -165,8 +165,8 @@
   Stanislaw Halik
   Mikael Schönenberg
   Berkin Ilbeyi
+  Faye Zhao
   Elmo Mäntynen
-  Faye Zhao
   Jonathan David Riehl
   Anders Qvist
   Corbin Simpson
@@ -175,11 +175,12 @@
   Alex Perry
   Vaibhav Sood
   Alan McIntyre
+  Reuben Cummings
   Alexander Sedov
   p_zieschang at yahoo.de
   Attila Gobi
-  Jasper.Schulz
   Christopher Pope
+  Aaron Gallagher
   Florin Papa
   Christian Tismer 
   Marc Abramowitz
@@ -196,7 +197,6 @@
   Gabriel
   Lukas Vacek
   Kunal Grover
-  Aaron Gallagher
   Andrew Dalke
   Sylvain Thenault
   Jakub Stasiak
@@ -219,6 +219,7 @@
   Philipp Rustemeuer
   Henrik Vendelbo
   Richard Lancaster
+  Yasir Suhail
   Dan Buch
   Miguel de Val Borro
   Artur Lisiecki
@@ -231,6 +232,7 @@
   Catalin Gabriel Manciu
   Tomo Cocoa
   Kim Jin Su
+  rafalgalczynski at gmail.com
   Toni Mattis
   Amber Brown
   Lucas Stadler
@@ -258,9 +260,7 @@
   Michael Hudson-Doyle
   Anders Sigfridsson
   Nikolay Zinov
-  Yasir Suhail
   Jason Michalski
-  rafalgalczynski at gmail.com
   Floris Bruynooghe
   Laurens Van Houtven
   Akira Li
@@ -274,10 +274,10 @@
   James Lan
   Volodymyr Vladymyrov
   shoma hosaka
-  Daniel Neuhäuser
   Ben Mather
   Niclas Olofsson
-  "Aaron Gallagher
+  Matthew Miller
+  Rodrigo Araújo
   halgari
   Boglarka Vezer
   Chris Pressey
@@ -287,8 +287,9 @@
   Dinu Gherman
   Chris Lambacher
   coolbutuseless at gmail.com
+  Daniil Yarancev
   Jim Baker
-  Rodrigo Araújo
+  Dan Crosta
   Nikolaos-Digenis Karagiannis
   James Robert
   Armin Ronacher
@@ -302,13 +303,11 @@
   Tomer Chachamu
   Christopher Groskopf
   Asmo Soinio
-  Stefan Marr
   jiaaro
   Mads Kiilerich
-  opassembler.py
-  JohnDoe
   Antony Lee
   Jason Madden
+  Daniel Neuh�user
   reubano at gmail.com
   Yaroslav Fedevych
   Jim Hunziker
@@ -316,25 +315,24 @@
   Even Wiik Thomassen
   jbs
   squeaky
-  Zearin
   soareschen
   Jonas Pfannschmidt
   Kurt Griffiths
   Mike Bayer
-  Matthew Miller
+  Stefan Marr
   Flavio Percoco
   Kristoffer Kleine
-  yasirs
   Michael Chermside
   Anna Ravencroft
   pizi
   remarkablerocket
   Andrey Churin
-  Dan Crosta
+  Zearin
   Eli Stevens
   Tobias Diaz
   Julien Phalip
   Roman Podoliaka
   Dan Loewenherz
   werat
-  hgattic
+
+
diff --git a/pypy/doc/faq.rst b/pypy/doc/faq.rst
--- a/pypy/doc/faq.rst
+++ b/pypy/doc/faq.rst
@@ -407,3 +407,18 @@
 long and gnarly. On the other hand, all our infrastructure (buildbots,
 benchmarking, etc) would have to be adapted. So unless somebody steps up and
 volunteers to do all that work, it will likely not happen.
+
+
+What is needed for Windows 64 support of PyPy?
+-----------------------------------------------
+
+First, please note that the Windows 32 PyPy binary works just fine on Windows
+64. The only problem is that it only supports up to 4GB of heap per process.
+
+As to real Windows 64 support: Currently we don't have an active PyPy developer
+whose main development platform is Windows. So if you are interested in getting
+Windows 64 support, we encourage you to volunteer `to make it happen`_! Another
+option would be to pay some PyPy developers to implement Windows 64 support,
+but so far there doesn't seem to be an overwhelming commercial interest in it.
+
+.. _`to make it happen`: windows.html#what-is-missing-for-a-full-64-bit-translation
diff --git a/pypy/doc/how-to-release.rst b/pypy/doc/how-to-release.rst
--- a/pypy/doc/how-to-release.rst
+++ b/pypy/doc/how-to-release.rst
@@ -1,4 +1,4 @@
-The PyPy Release Process
+PyPy's Release Process
 ========================
 
 Release Policy
@@ -39,41 +39,60 @@
   Some of the next updates may be done before or after branching; make
   sure things are ported back to the trunk and to the branch as
   necessary.
-* update pypy/doc/contributor.rst (and possibly LICENSE)
-  pypy/doc/tool/makecontributor.py generates the list of contributors
-* rename pypy/doc/whatsnew_head.rst to whatsnew_VERSION.rst
-  create a fresh whatsnew_head.rst after the release
-  and add the new file to  pypy/doc/index-of-whatsnew.rst
-* go to pypy/tool/release and run
-  ``force-builds.py <release branch>``
-  The following JIT binaries should be built, however, we need more buildbots
-  windows, linux-32, linux-64, osx64, armhf-raring, armhf-raspberrian, armel,
-  freebsd64 
 
-* wait for builds to complete, make sure there are no failures
-* download the builds, repackage binaries. Tag the release version
-  and download and repackage source from bitbucket. You may find it
-  convenient to use the ``repackage.sh`` script in pypy/tool/release to do this. 
+* Update and write documentation
 
-  Otherwise repackage and upload source "-src.tar.bz2" to bitbucket
-  and to cobra, as some packagers prefer a clearly labeled source package
-  ( download e.g.  https://bitbucket.org/pypy/pypy/get/release-2.5.x.tar.bz2,
-  unpack, rename the top-level directory to "pypy-2.5.0-src", repack, and upload)
+  * update pypy/doc/contributor.rst (and possibly LICENSE)
+    pypy/doc/tool/makecontributor.py generates the list of contributors
 
-* Upload binaries to https://bitbucket.org/pypy/pypy/downloads
+  * rename pypy/doc/whatsnew_head.rst to whatsnew_VERSION.rst
+    create a fresh whatsnew_head.rst after the release
+    and add the new file to  pypy/doc/index-of-whatsnew.rst
 
-* write release announcement pypy/doc/release-x.y(.z).txt
+  * write release announcement pypy/doc/release-VERSION.rst
+    The release announcement should contain a direct link to the download page
 
-  The release announcement should contain a direct link to the download page
+  * Add the new files to  pypy/doc/index-of-{whatsnew,release-notes}.rst
 
-* Add the new files to  pypy/doc/index-of-{whatsnew,release-notes}.rst
+* Build and upload the release tar-balls
 
-* update pypy.org (under extradoc/pypy.org), rebuild and commit
+  * go to pypy/tool/release and run
+    ``force-builds.py <release branch>``
+    The following JIT binaries should be built, however, we need more buildbots
+    windows, linux-32, linux-64, osx64, armhf-raring, armhf-raspberrian, armel,
+    freebsd64 
 
-* post announcement on morepypy.blogspot.com
-* send announcements to twitter.com, pypy-dev, python-list,
-  python-announce, python-dev ...
+  * wait for builds to complete, make sure there are no failures
 
-* add a tag on the pypy/jitviewer repo that corresponds to pypy release
-* add a tag on the codespeed web site that corresponds to pypy release
-* revise versioning at https://readthedocs.org/projects/pypy
+  * send out a mailing list message asking for people to test before uploading
+    to prevent having to upload more than once
+
+  * add a tag on the pypy/jitviewer repo that corresponds to pypy release, so
+    that the source tarball can be produced in the next steps
+
+  * download the builds, repackage binaries. Tag the release version
+    and download and repackage source from bitbucket. You may find it
+    convenient to use the ``repackage.sh`` script in pypy/tool/release to do this. 
+
+    Otherwise repackage and upload source "-src.tar.bz2" to bitbucket
+    and to cobra, as some packagers prefer a clearly labeled source package
+    ( download e.g.  https://bitbucket.org/pypy/pypy/get/release-2.5.x.tar.bz2,
+    unpack, rename the top-level directory to "pypy-2.5.0-src", repack, and upload)
+
+  * Upload binaries to https://bitbucket.org/pypy/pypy/downloads
+
+* Send out a mailing list message asking for last-minute comments and testing
+
+* RELEASE !  
+
+  * update pypy.org (under extradoc/pypy.org), rebuild and commit, using the
+    hashes produced from the ``repackage.sh`` script or by hand
+
+  * post announcement on morepypy.blogspot.com
+  * send announcements to twitter.com, pypy-dev, python-list,
+    python-announce, python-dev ...
+
+* If all is OK, document the released version
+
+  * add a tag on the codespeed web site that corresponds to pypy release
+  * revise versioning at https://readthedocs.org/projects/pypy
diff --git a/pypy/doc/index-of-release-notes.rst b/pypy/doc/index-of-release-notes.rst
--- a/pypy/doc/index-of-release-notes.rst
+++ b/pypy/doc/index-of-release-notes.rst
@@ -6,6 +6,7 @@
 
 .. toctree::
 
+   release-pypy2.7-v5.6.0.rst
    release-pypy2.7-v5.4.1.rst
    release-pypy2.7-v5.4.0.rst
    release-pypy2.7-v5.3.1.rst
diff --git a/pypy/doc/index-of-whatsnew.rst b/pypy/doc/index-of-whatsnew.rst
--- a/pypy/doc/index-of-whatsnew.rst
+++ b/pypy/doc/index-of-whatsnew.rst
@@ -7,6 +7,7 @@
 .. toctree::
 
    whatsnew-head.rst
+   whatsnew-pypy2-5.6.0.rst
    whatsnew-pypy2-5.4.0.rst
    whatsnew-pypy2-5.3.1.rst
    whatsnew-pypy2-5.3.0.rst
diff --git a/pypy/doc/release-pypy2.7-v5.6.0.rst b/pypy/doc/release-pypy2.7-v5.6.0.rst
--- a/pypy/doc/release-pypy2.7-v5.6.0.rst
+++ b/pypy/doc/release-pypy2.7-v5.6.0.rst
@@ -6,17 +6,24 @@
 This new PyPy2.7 release includes the upstream stdlib version 2.7.12.
 
 We continue to make incremental improvements to our C-API
-compatability layer (cpyext). We pass all but a few of the tests in the
+compatibility layer (cpyext). We pass all but a few of the tests in the
 upstream numpy `test suite`_. 
 
 Work proceeds at a good pace on the PyPy3.5
 version due to a grant_ from the Mozilla Foundation, and some of those
-changes have been backported to PyPy2.7 where relevant
+changes have been backported to PyPy2.7 where relevant.
+
+The PowerPC and s390x backend have been enhanced_ with the capability use SIMD instructions
+ for micronumpy loops.
 
 We changed ``timeit`` to now report average +- standard deviation, which is
 better than the misleading minimum value reported in CPython.
 
-XXX
+We now support building PyPy with OpenSSL 1.1 in our built-in _ssl module, as
+well as maintaining support for previous versions.
+
+CFFI_ has been updated to 1.9, improving an already great package for
+interfacing with C.
 
 As always, this release fixed many issues and bugs raised by the
 growing community of PyPy users. We strongly recommend updating.
@@ -35,12 +42,13 @@
 with making RPython's JIT even better.
 
 .. _`test suite`: https://bitbucket.org/pypy/pypy/wiki/Adventures%20in%20cpyext%20compatibility
-.. _cffi: https://cffi.readthedocs.org
+.. _CFFI: https://cffi.readthedocs.io/en/latest/whatsnew.html
 .. _grant: https://morepypy.blogspot.com/2016/08/pypy-gets-funding-from-mozilla-for.html
 .. _`PyPy`: http://doc.pypy.org
 .. _`RPython`: https://rpython.readthedocs.org
 .. _`modules`: http://doc.pypy.org/en/latest/project-ideas.html#make-more-python-modules-pypy-friendly
 .. _`help`: http://doc.pypy.org/en/latest/project-ideas.html
+.. _`enhanced`: https://morepypy.blogspot.co.at/2016/11/vectorization-extended-powerpc-and-s390x.html
 
 What is PyPy?
 =============
@@ -64,42 +72,46 @@
   * **s390x** running Linux
 
 .. _`PyPy and CPython 2.7.x`: http://speed.pypy.org
-.. _`dynamic languages`: http://pypyjs.org
+.. _`dynamic languages`: http://rpython.readthedocs.io/en/latest/examples.html
 
 Other Highlights (since 5.4 released Aug 31, 2016)
 =========================================================
 
 * New features
+
   * Allow tests run with `-A` to find `libm.so` even if it is a script not a
     dynamically loadable file
-  * Backport fixes to rposix on windows from py2.5
+  * Backport fixes to rposix on windows from py3.5
   * Allow user-defined ``__getitem__`` on subclasses of ``str`` and ``unicode``
   * Add ``inode`` to ``scandir()`` on posix systems
   * Support more attributes on ``super``
   * Issue #2386: non-latin1 unicode keys were ignored in ``unicode.format(**d)``
   * Restore the ability to translate with CPython
-  * Update to CFFI 1.8.4
+  * Update to CFFI 1.9.0
   * Support the new buffer protocol in cpyext and numpypy
   * Add ``rposix.sync()``
   * Support full-precision nanosecond times in os.stat()
   * Add documentation about the assembler backends to RPYthon
   * Search for the stdlibs from the libpypy shared object rather than the pypy-c exe,
-    changes downstream packaging requirments
+    changes downstream packaging requirements
   * Add ``try_inline``, like ``always_inline`` and ``dont_inline`` to RPython
   * Reject ``'a'.strip(buffer(' '))`` like cpython (the argument to strip must
     be ``str`` or ``unicode``)
   * Allow ``warning.warn(('something', 1), Warning)`` like on CPython
   * Refactor ``rclock`` and add some more ``CLOCK_xxx`` constants on
     relevant platforms
-  * Backport the ``'faulthandler`` module from py3.5
+  * Backport the ``faulthandler`` module from py3.5
   * Improve the error message when trying to call a method where the ``self``
     parameter is missing in the definition
   * Implement ``rposix.cpu_count``
   * Support translation on FreeBSD running on PowerPC
   * Implement ``__rmod__`` on ``str`` and ``unicode`` types
   * Issue warnings for stricter handling of ``__new__``, ``__init__`` args
+  * When using ``struct.unpack('q', ...`` try harder to prefer int to long
+  * Support OpenSSL version 1.1 (in addition to version 1.0)
 
 * Bug Fixes
+
   * Tweak a float comparison with 0 in `backendopt.inline` to avoid rounding errors
   * Fix translation of the sandbox
   * Fix for an issue where `unicode.decode('utf8', 'custom_replace')` messed up
@@ -120,6 +132,7 @@
   * ``_numpypy.add.reduce`` returns a scalar now
 
 * Performance improvements:
+
   * Improve method calls on oldstyle classes
   * Clean and refactor code for testing cpyext to allow sharing with py3.5
   * Refactor a building the map of reflected ops in ``_numpypy``
diff --git a/pypy/doc/test/test_whatsnew.py b/pypy/doc/test/test_whatsnew.py
--- a/pypy/doc/test/test_whatsnew.py
+++ b/pypy/doc/test/test_whatsnew.py
@@ -111,4 +111,4 @@
         "hg log -r %s --template '{branch}'" % startrev)
     if errcode != 0:
         py.test.skip('no Mercurial repo')
-    assert wc_branch == 'default'
+    assert wc_branch in ('default', "'default'") # sometimes the ' leaks (windows)
diff --git a/pypy/doc/tool/makecontributor.py b/pypy/doc/tool/makecontributor.py
--- a/pypy/doc/tool/makecontributor.py
+++ b/pypy/doc/tool/makecontributor.py
@@ -32,7 +32,7 @@
     'Niklaus Haldimann': ['nik'],
     'Alexander Schremmer': ['xoraxax'],
     'Anders Hammarquist': ['iko'],
-    'David Edelsohn': ['edelsoh', 'edelsohn'],
+    'David Edelsohn': ['edelsoh', 'edelsohn','opassembler.py'],
     'Niko Matsakis': ['niko'],
     'Jakub Gustak': ['jlg'],
     'Guido Wesdorp': ['guido'],
@@ -75,6 +75,9 @@
     'Spenser Bauman':['Spenser Andrew Bauman'],
     'Raffael Tfirst':['raffael.tfirst at gmail.com'],
     'timo':['timo at eistee.fritz.box'],
+    'Jasper Schulz':['Jasper.Schulz'],
+    'Aaron Gallagher':['"Aaron Gallagher'],
+    'Yasir Suhail':['yasirs'],
     }
 
 alias_map = {}
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -1,9 +1,9 @@
 ==========================
-What's new in PyPy2.7 5.4+
+What's new in PyPy2.7 5.6+
 ==========================
 
-.. this is a revision shortly after release-pypy2.7-v5.4
-.. startrev: 522736f816dc
+.. this is a revision shortly after release-pypy2.7-v5.6
+.. startrev: 7e9787939641
 
 .. branch: mappingproxy
 .. branch: py3k-finish_time
@@ -14,75 +14,8 @@
 .. branch: rpython-resync
 Backport rpython changes made directly on the py3k and py3.5 branches.
 
-.. branch: buffer-interface
-Implement PyObject_GetBuffer, PyMemoryView_GET_BUFFER, and handles memoryviews
-in numpypy
+.. branch: rpython-error-to-systemerror
 
-.. branch: force-virtual-state
-Improve merging of virtual states in the JIT in order to avoid jumping to the
-preamble. Accomplished by allocating virtual objects where non-virtuals are
-expected.
-
-.. branch: conditional_call_value_3
-JIT residual calls: if the called function starts with a fast-path
-like "if x.foo != 0: return x.foo", then inline the check before
-doing the CALL.  For now, string hashing is about the only case.
-
-.. branch: search-path-from-libpypy
-
-The compiled pypy now looks for its lib-python/lib_pypy path starting
-from the location of the *libpypy-c* instead of the executable. This is
-arguably more consistent, and also it is what occurs anyway if you're
-embedding pypy.  Linux distribution packagers, take note!  At a minimum,
-the ``libpypy-c.so`` must really be inside the path containing
-``lib-python`` and ``lib_pypy``.  Of course, you can put a symlink to it
-from somewhere else.  You no longer have to do the same with the
-``pypy`` executable, as long as it finds its ``libpypy-c.so`` library.
-
-.. branch: _warnings
-
-CPython allows warning.warn(('something', 1), Warning), on PyPy this
-produced a "expected a readable buffer object" error. Test and fix.
-
-.. branch: stricter-strip
-
-CPython rejects 'a'.strip(buffer(' ')); only None, str or unicode are
-allowed as arguments. Test and fix for str and unicode
-
-.. branch: faulthandler
-
-Port the 'faulthandler' module to PyPy default.  This module is standard
-in Python 3.3 but can also be installed from CPython >= 2.6 from PyPI.
-
-.. branch: test-cpyext
-
-Refactor cpyext testing to be more pypy3-friendly.
-
-.. branch: better-error-missing-self
-
-Improve the error message when the user forgot the "self" argument of a method.
-
-
-.. fb6bb835369e
-Change the ``timeit`` module: it now prints the average time and the standard
-deviation over 7 runs by default, instead of the minimum. The minimum is often
-misleading.
-
-.. branch: unrecursive-opt
-
-Make optimiseopt iterative instead of recursive so it can be reasoned about
-more easily and debugging is faster.
-
-.. branch: Tiberiumk/fix-2412-1476011166874
-.. branch: redirect-assembler-jitlog
-
-
-
-.. branch: stdlib-2.7.12
-
-Update stdlib to version 2.7.12
-
-.. branch: buffer-interface2
-
-Improve support for new buffer interface in cpyext, bf_getbuffer on built-in
-types still missing
+Any uncaught RPython exception (from a PyPy bug) is turned into an
+app-level SystemError.  This should improve the lot of users hitting an
+uncaught RPython error.
diff --git a/pypy/doc/whatsnew-pypy2-5.6.0.rst b/pypy/doc/whatsnew-pypy2-5.6.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/whatsnew-pypy2-5.6.0.rst
@@ -0,0 +1,113 @@
+=========================
+What's new in PyPy2.7 5.6
+=========================
+
+.. this is a revision shortly after release-pypy2.7-v5.4
+.. startrev: 522736f816dc
+
+.. branch: mappingproxy
+.. branch: py3k-finish_time
+.. branch: py3k-kwonly-builtin
+.. branch: py3k_add_terminal_size
+.. branch: testing-cleanup-py3k
+
+.. branch: rpython-resync
+Backport rpython changes made directly on the py3k and py3.5 branches.
+
+.. branch: buffer-interface
+Implement PyObject_GetBuffer, PyMemoryView_GET_BUFFER, and handles memoryviews
+in numpypy
+
+.. branch: force-virtual-state
+Improve merging of virtual states in the JIT in order to avoid jumping to the
+preamble. Accomplished by allocating virtual objects where non-virtuals are
+expected.
+
+.. branch: conditional_call_value_3
+JIT residual calls: if the called function starts with a fast-path
+like "if x.foo != 0: return x.foo", then inline the check before
+doing the CALL.  For now, string hashing is about the only case.
+
+.. branch: search-path-from-libpypy
+
+The compiled pypy now looks for its lib-python/lib_pypy path starting
+from the location of the *libpypy-c* instead of the executable. This is
+arguably more consistent, and also it is what occurs anyway if you're
+embedding pypy.  Linux distribution packagers, take note!  At a minimum,
+the ``libpypy-c.so`` must really be inside the path containing
+``lib-python`` and ``lib_pypy``.  Of course, you can put a symlink to it
+from somewhere else.  You no longer have to do the same with the
+``pypy`` executable, as long as it finds its ``libpypy-c.so`` library.
+
+.. branch: _warnings
+
+CPython allows warning.warn(('something', 1), Warning), on PyPy this
+produced a "expected a readable buffer object" error. Test and fix.
+
+.. branch: stricter-strip
+
+CPython rejects 'a'.strip(buffer(' ')); only None, str or unicode are
+allowed as arguments. Test and fix for str and unicode
+
+.. branch: faulthandler
+
+Port the 'faulthandler' module to PyPy default.  This module is standard
+in Python 3.3 but can also be installed from CPython >= 2.6 from PyPI.
+
+.. branch: test-cpyext
+
+Refactor cpyext testing to be more pypy3-friendly.
+
+.. branch: better-error-missing-self
+
+Improve the error message when the user forgot the "self" argument of a method.
+
+
+.. fb6bb835369e
+Change the ``timeit`` module: it now prints the average time and the standard
+deviation over 7 runs by default, instead of the minimum. The minimum is often
+misleading.
+
+.. branch: unrecursive-opt
+
+Make optimiseopt iterative instead of recursive so it can be reasoned about
+more easily and debugging is faster.
+
+.. branch: Tiberiumk/fix-2412-1476011166874
+.. branch: redirect-assembler-jitlog
+
+
+
+.. branch: stdlib-2.7.12
+
+Update stdlib to version 2.7.12
+
+.. branch: buffer-interface2
+
+Improve support for new buffer interface in cpyext, bf_getbuffer on built-in
+types still missing
+
+
+.. branch: fix-struct-unpack-Q
+
+Improve compatibility with CPython in the ``struct`` module. In particular,
+``struct.unpack`` now returns an ``int`` whenever the returned value fits,
+while previously it always returned a ``long`` for certains format codes such
+as ``Q`` (and also ``I``, ``L`` and ``q`` on 32 bit)
+
+.. branch: zarch-simd-support
+
+s390x implementation for vector operations used in VecOpt
+
+.. branch: ppc-vsx-support
+
+PowerPC implementation for vector operations used in VecOpt
+
+.. branch: newinitwarn
+
+Match CPython's stricter handling of __new/init__ arguments
+
+.. branch: openssl-1.1
+
+Support for OpenSSL version 1.1 (in addition to version 1.0).
+Tested on Linux (1.1, 1.0), on Win32, and Mac (1.0 only)
diff --git a/pypy/doc/windows.rst b/pypy/doc/windows.rst
--- a/pypy/doc/windows.rst
+++ b/pypy/doc/windows.rst
@@ -20,6 +20,22 @@
 
 .. _our downloads: http://pypy.org/download.html
 
+Installing Visual Compiler v9 (for Python 2.7)
+----------------------------------------------
+
+This compiler, while the standard one for Python 2.7, is depricated. Microsoft has
+made it available as the `Microsoft Visual C++ Compiler for Python 2.7`_ (the link
+was checked in Nov 2016). Note that the compiler suite will be installed in
+``C:\Users\<user name>\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python``.
+Using a current version of ``setuptools`` will be able to find it there. For
+Windows 10, you must right-click the download, and under ``Properties`` ->
+``Compatibility`` mark it as ``Run run this program in comatibility mode for``
+``Previous version...``. Also, you must download and install the ``.Net Framework 3.5``,
+otherwise ``mt.exe`` will silently fail. Installation will begin automatically
+by running the mt.exe command by hand from a DOS window (that is how the author
+discovered the problem).
+
+.. _Microsoft Visual C++ Compiler for Python 2.7: https://www.microsoft.com/en-us/download/details.aspx?id=44266
 
 Translating PyPy with Visual Studio
 -----------------------------------
diff --git a/pypy/goal/targetpypystandalone.py b/pypy/goal/targetpypystandalone.py
--- a/pypy/goal/targetpypystandalone.py
+++ b/pypy/goal/targetpypystandalone.py
@@ -34,7 +34,12 @@
     if w_dict is not None: # for tests
         w_entry_point = space.getitem(w_dict, space.wrap('entry_point'))
         w_run_toplevel = space.getitem(w_dict, space.wrap('run_toplevel'))
+        w_initstdio = space.getitem(w_dict, space.wrap('initstdio'))
         withjit = space.config.objspace.usemodules.pypyjit
+    else:
+        w_initstdio = space.appexec([], """():
+            return lambda unbuffered: None
+        """)
 
     def entry_point(argv):
         if withjit:
@@ -110,18 +115,23 @@
                       " not found in %s or in any parent directory" % home1)
             return rffi.cast(rffi.INT, 1)
         space.startup()
-        space.appexec([w_path], """(path):
-            import sys
-            sys.path[:] = path
-        """)
-        # import site
+        must_leave = space.threadlocals.try_enter_thread(space)
         try:
-            space.setattr(space.getbuiltinmodule('sys'),
-                          space.wrap('executable'),
-                          space.wrap(home))
-            import_ = space.getattr(space.getbuiltinmodule('builtins'),
-                                    space.wrap('__import__'))
-            space.call_function(import_, space.wrap('site'))
+            # initialize sys.{path,executable,stdin,stdout,stderr}
+            # (in unbuffered mode, to avoid troubles) and import site
+            space.appexec([w_path, space.wrap(home), w_initstdio],
+            r"""(path, home, initstdio):
+                import sys
+                sys.path[:] = path
+                sys.executable = home
+                initstdio(unbuffered=True)
+                try:
+                    import site
+                except Exception as e:
+                    sys.stderr.write("'import site' failed:\n")
+                    import traceback
+                    traceback.print_exc()
+            """)
             return rffi.cast(rffi.INT, 0)
         except OperationError as e:
             if verbose:
@@ -129,6 +139,9 @@
                 debug(" operror-type: " + e.w_type.getname(space).encode('utf-8'))
                 debug(" operror-value: " + space.str_w(space.str(e.get_w_value(space))))
             return rffi.cast(rffi.INT, -1)
+        finally:
+            if must_leave:
+                space.threadlocals.leave_thread(space)
 
     @entrypoint_highlevel('main', [rffi.CCHARP], c_name='pypy_execute_source')
     def pypy_execute_source(ll_source):
@@ -247,7 +260,8 @@
                 raise Exception("Cannot use the --output option with PyPy "
                                 "when --shared is on (it is by default). "
                                 "See issue #1971.")
-            if config.translation.profopt is not None:
+            if (config.translation.profopt is not None
+                    and not config.translation.noprofopt):
                 raise Exception("Cannot use the --profopt option "
                                 "when --shared is on (it is by default). "
                                 "See issue #2398.")
diff --git a/pypy/interpreter/astcompiler/assemble.py b/pypy/interpreter/astcompiler/assemble.py
--- a/pypy/interpreter/astcompiler/assemble.py
+++ b/pypy/interpreter/astcompiler/assemble.py
@@ -662,7 +662,7 @@
     ops.LOAD_DEREF: 1,
     ops.STORE_DEREF: -1,
     ops.DELETE_DEREF: 0,
-    
+
     ops.GET_AWAITABLE: 0,
     ops.SETUP_ASYNC_WITH: 0,
     ops.BEFORE_ASYNC_WITH: 1,
@@ -682,10 +682,10 @@
     ops.JUMP_IF_FALSE_OR_POP: 0,
     ops.POP_JUMP_IF_TRUE: -1,
     ops.POP_JUMP_IF_FALSE: -1,
-    # TODO 
+    # TODO
     ops.JUMP_IF_NOT_DEBUG: 0,
 
-    # TODO 
+    # TODO
     ops.BUILD_LIST_FROM_ARG: 1,
     # TODO
     ops.LOAD_CLASSDEREF: 1,
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -210,7 +210,9 @@
 
     def sub_scope(self, kind, name, node, lineno):
         """Convenience function for compiling a sub scope."""
-        if self.qualname:
+        if self.scope.lookup(name) == symtable.SCOPE_GLOBAL_EXPLICIT:
+            qualname = name
+        elif self.qualname:
             qualname = '%s.%s' % (self.qualname, name)
         else:
             qualname = name
@@ -578,7 +580,7 @@
         self.pop_frame_block(F_BLOCK_LOOP, start)
         self.visit_sequence(fr.orelse)
         self.use_next_block(end)
-    
+
     def visit_AsyncFor(self, fr):
         self.update_position(fr.lineno, True)
         b_try = self.new_block()
@@ -588,21 +590,21 @@
         b_try_cleanup = self.new_block()
         b_after_loop = self.new_block()
         b_after_loop_else = self.new_block()
-        
+
         self.emit_jump(ops.SETUP_LOOP, b_after_loop)
         self.push_frame_block(F_BLOCK_LOOP, b_try)
-        
+
         fr.iter.walkabout(self)
         self.emit_op(ops.GET_AITER)
         self.load_const(self.space.w_None)
         self.emit_op(ops.YIELD_FROM)
-        
+
         self.use_next_block(b_try)
         # This adds another line, so each for iteration can be traced.
         self.lineno_set = False
         self.emit_jump(ops.SETUP_EXCEPT, b_except)
         self.push_frame_block(F_BLOCK_EXCEPT, b_try)
-        
+
         self.emit_op(ops.GET_ANEXT)
         self.load_const(self.space.w_None)
         self.emit_op(ops.YIELD_FROM)
@@ -610,13 +612,13 @@
         self.emit_op(ops.POP_BLOCK)
         self.pop_frame_block(F_BLOCK_EXCEPT, b_try)
         self.emit_jump(ops.JUMP_FORWARD, b_after_try)
-        
+
         self.use_next_block(b_except)
         self.emit_op(ops.DUP_TOP)
         self.emit_op_name(ops.LOAD_GLOBAL, self.names, "StopAsyncIteration")
         self.emit_op_arg(ops.COMPARE_OP, 10)
         self.emit_jump(ops.POP_JUMP_IF_FALSE, b_try_cleanup, True)
-        
+
         self.emit_op(ops.POP_TOP)
         self.emit_op(ops.POP_TOP)
         self.emit_op(ops.POP_TOP)
@@ -630,23 +632,23 @@
         self.emit_op(ops.POP_TOP)
         self.emit_op(ops.POP_BLOCK) # for SETUP_LOOP
         self.emit_jump(ops.JUMP_ABSOLUTE, b_after_loop_else, True)
-        
+
         self.use_next_block(b_try_cleanup)
         self.emit_op(ops.END_FINALLY)
-        
+
         self.use_next_block(b_after_try)
         self.visit_sequence(fr.body)
         self.emit_jump(ops.JUMP_ABSOLUTE, b_try, True)
-        
+
         self.emit_op(ops.POP_BLOCK) # for SETUP_LOOP
         self.pop_frame_block(F_BLOCK_LOOP, b_try)
-        
+
         self.use_next_block(b_after_loop)
         self.emit_jump(ops.JUMP_ABSOLUTE, b_end, True)
-        
+
         self.use_next_block(b_after_loop_else)
         self.visit_sequence(fr.orelse)
-        
+
         self.use_next_block(b_end)
 
     def visit_While(self, wh):
@@ -701,7 +703,7 @@
             self.emit_op(ops.POP_TOP)
             if handler.name:
                 ## generate the equivalent of:
-                ## 
+                ##
                 ## try:
                 ##     # body
                 ## except type as name:
@@ -960,7 +962,7 @@
 
     def visit_AsyncWith(self, wih):
         self.update_position(wih.lineno, True)
-        self.handle_asyncwithitem(wih, 0, is_async=True)
+        self.handle_withitem(wih, 0, is_async=True)
 
     def visit_Raise(self, rais):
         self.update_position(rais.lineno, True)
@@ -1008,7 +1010,7 @@
         self.emit_op(ops.GET_YIELD_FROM_ITER)
         self.load_const(self.space.w_None)
         self.emit_op(ops.YIELD_FROM)
-    
+
     def visit_Await(self, aw):
         self.update_position(aw.lineno)
         aw.value.walkabout(self)
@@ -1147,7 +1149,7 @@
             self.emit_op_arg(outer_op, elt_subitems)
         else:
             self.emit_op_arg(single_op, seen_star)
-    
+
     def _visit_assignment(self, node, elts, ctx):
         elt_count = len(elts) if elts else 0
         if ctx == ast.Store:
@@ -1210,14 +1212,8 @@
                     d.values[i].walkabout(self)
                     containers += 1
                 else:
-                    # TODO: key.walkabout has to be called before d.values.walkabout
-                    # that would fix the error "keywords must be strings"
-                    # for some reason the keys and values seem to be in reverse order
-                    # in some cases, so another error has to be fixed in order for
-                    # this to work, otherwise it breaks everything
-                    # after fix: remove dirty fixes in pyopcode
+                    key.walkabout(self)
                     d.values[i].walkabout(self)
-                    key.walkabout(self)
                     elements += 1
         if elements or containers == 0:
             self.emit_op_arg(ops.BUILD_MAP, elements)
@@ -1230,7 +1226,7 @@
             self.emit_op_arg(ops.BUILD_MAP_UNPACK, oparg)
             containers -= (oparg - 1)
             is_unpacking = False
-    
+
     def visit_Set(self, s):
         self._visit_starunpack(s, s.elts, ops.BUILD_SET, ops.BUILD_SET, ops.BUILD_SET_UNPACK)
 
@@ -1286,7 +1282,7 @@
                     # If we ended up with more than one stararg, we need
                     # to concatenate them into a single sequence.
                     self.emit_op_arg(ops.BUILD_LIST_UNPACK, nsubargs)
-        
+
         # Repeat procedure for keyword args
         nseen = 0 # the number of keyword arguments on the stack following
         if keywords is not None:
@@ -1301,8 +1297,8 @@
                     nsubkwargs += 1
                 elif nsubkwargs:
                     # A keyword argument and we already have a dict.
+                    self.load_const(self.space.wrap(kw.arg.decode('utf-8')))
                     kw.value.walkabout(self)
-                    self.load_const(self.space.wrap(kw.arg.decode('utf-8')))
                     nseen += 1
                 else:
                     # keyword argument
@@ -1340,7 +1336,7 @@


More information about the pypy-commit mailing list