[pypy-commit] pypy py3.5: hg merge default
mjacob
pypy.commits at gmail.com
Thu Sep 28 15:49:19 EDT 2017
Author: Manuel Jacob <me at manueljacob.de>
Branch: py3.5
Changeset: r92491:aee2981816b8
Date: 2017-09-28 21:48 +0200
http://bitbucket.org/pypy/pypy/changeset/aee2981816b8/
Log: hg merge default
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -60,8 +60,8 @@
Wim Lavrijsen
Eric van Riet Paap
Richard Emslie
+ Remi Meier
Alexander Schremmer
- Remi Meier
Dan Villiom Podlaski Christiansen
Lukas Diekmann
Sven Hager
@@ -102,6 +102,7 @@
Michael Foord
Stephan Diehl
Stefano Rivera
+ Jean-Paul Calderone
Stefan Schwarzer
Tomek Meka
Valentino Volonghi
@@ -110,14 +111,13 @@
Bob Ippolito
Bruno Gola
David Malcolm
- Jean-Paul Calderone
Squeaky
Edd Barrett
Timo Paulssen
Marius Gedminas
+ Nicolas Truessel
Alexandre Fayolle
Simon Burton
- Nicolas Truessel
Martin Matusiak
Laurence Tratt
Wenzhu Man
@@ -156,6 +156,7 @@
Stefan H. Muller
Tim Felgentreff
Eugene Oden
+ Dodan Mihai
Jeff Terrace
Henry Mason
Vasily Kuznetsov
@@ -182,11 +183,13 @@
Rocco Moretti
Gintautas Miliauskas
Lucian Branescu Mihaila
+ Mariano Anaya
anatoly techtonik
- Dodan Mihai
Karl Bartel
+ Stefan Beyer
Gabriel Lavoie
Jared Grubb
+ Alecsandru Patrascu
Olivier Dormond
Wouter van Heyst
Sebastian Pawluś
@@ -194,6 +197,7 @@
Victor Stinner
Andrews Medina
Aaron Iles
+ p_zieschang at yahoo.de
Toby Watson
Daniel Patrick
Stuart Williams
@@ -204,6 +208,7 @@
Michael Cheng
Mikael Schönenberg
Stanislaw Halik
+ Mihnea Saracin
Berkin Ilbeyi
Gasper Zejn
Faye Zhao
@@ -214,14 +219,12 @@
Jonathan David Riehl
Beatrice During
Alex Perry
- p_zieschang at yahoo.de
Robert Zaremba
Alan McIntyre
Alexander Sedov
Vaibhav Sood
Reuben Cummings
Attila Gobi
- Alecsandru Patrascu
Christopher Pope
Tristan Arthur
Christian Tismer
@@ -243,7 +246,6 @@
Jacek Generowicz
Sylvain Thenault
Jakub Stasiak
- Stefan Beyer
Andrew Dalke
Alejandro J. Cura
Vladimir Kryachko
@@ -275,6 +277,7 @@
Christoph Gerum
Miguel de Val Borro
Artur Lisiecki
+ afteryu
Toni Mattis
Laurens Van Houtven
Bobby Impollonia
@@ -305,6 +308,7 @@
Anna Katrina Dominguez
Kim Jin Su
Amber Brown
+ Anthony Sottile
Nate Bragg
Ben Darnell
Juan Francisco Cantero Hurtado
@@ -325,12 +329,14 @@
Mike Bayer
Rodrigo Araújo
Daniil Yarancev
+ Min RK
OlivierBlanvillain
Jonas Pfannschmidt
Zearin
Andrey Churin
Dan Crosta
reubano at gmail.com
+ Stanisław Halik
Julien Phalip
Roman Podoliaka
Eli Stevens
diff --git a/lib-python/2.7/inspect.py b/lib-python/2.7/inspect.py
--- a/lib-python/2.7/inspect.py
+++ b/lib-python/2.7/inspect.py
@@ -203,7 +203,7 @@
f_locals local namespace seen by this frame
f_restricted 0 or 1 if frame is in restricted execution mode
f_trace tracing function for this frame, or None"""
- return isinstance(object, types.FrameType)
+ return isinstance(object, (types.FrameType, types.FakeFrameType))
def iscode(object):
"""Return true if the object is a code object.
diff --git a/lib-python/2.7/types.py b/lib-python/2.7/types.py
--- a/lib-python/2.7/types.py
+++ b/lib-python/2.7/types.py
@@ -71,6 +71,12 @@
FrameType = type(tb.tb_frame)
del tb
+# PyPy extension
+try:
+ FakeFrameType = type(next(sys._current_frames().itervalues()))
+except (AttributeError, StopIteration):
+ FakeFrameType = FrameType
+
SliceType = slice
EllipsisType = type(Ellipsis)
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.11.0
+Version: 1.11.1
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
from .error import CDefError, FFIError, VerificationError, VerificationMissing
-__version__ = "1.11.0"
-__version_info__ = (1, 11, 0)
+__version__ = "1.11.1"
+__version_info__ = (1, 11, 1)
# 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/_embedding.h b/lib_pypy/cffi/_embedding.h
--- a/lib_pypy/cffi/_embedding.h
+++ b/lib_pypy/cffi/_embedding.h
@@ -247,7 +247,7 @@
if (f != NULL && f != Py_None) {
PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
- "\ncompiled with cffi version: 1.11.0"
+ "\ncompiled with cffi version: 1.11.1"
"\n_cffi_backend module: ", f);
modules = PyImport_GetModuleDict();
mod = PyDict_GetItemString(modules, "_cffi_backend");
diff --git a/lib_pypy/pyrepl/historical_reader.py b/lib_pypy/pyrepl/historical_reader.py
--- a/lib_pypy/pyrepl/historical_reader.py
+++ b/lib_pypy/pyrepl/historical_reader.py
@@ -17,7 +17,7 @@
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-from pyrepl import reader, commands
+from pyrepl import reader, commands, input
from pyrepl.reader import Reader as R
isearch_keymap = tuple(
@@ -215,7 +215,6 @@
isearch_forwards, isearch_backwards, operate_and_get_next]:
self.commands[c.__name__] = c
self.commands[c.__name__.replace('_', '-')] = c
- from pyrepl import input
self.isearch_trans = input.KeymapTranslator(
isearch_keymap, invalid_cls=isearch_end,
character_cls=isearch_add_character)
diff --git a/pypy/doc/contributor.rst b/pypy/doc/contributor.rst
--- a/pypy/doc/contributor.rst
+++ b/pypy/doc/contributor.rst
@@ -27,8 +27,8 @@
Wim Lavrijsen
Eric van Riet Paap
Richard Emslie
+ Remi Meier
Alexander Schremmer
- Remi Meier
Dan Villiom Podlaski Christiansen
Lukas Diekmann
Sven Hager
@@ -69,6 +69,7 @@
Michael Foord
Stephan Diehl
Stefano Rivera
+ Jean-Paul Calderone
Stefan Schwarzer
Tomek Meka
Valentino Volonghi
@@ -77,14 +78,13 @@
Bob Ippolito
Bruno Gola
David Malcolm
- Jean-Paul Calderone
Squeaky
Edd Barrett
Timo Paulssen
Marius Gedminas
+ Nicolas Truessel
Alexandre Fayolle
Simon Burton
- Nicolas Truessel
Martin Matusiak
Laurence Tratt
Wenzhu Man
@@ -123,6 +123,7 @@
Stefan H. Muller
Tim Felgentreff
Eugene Oden
+ Dodan Mihai
Jeff Terrace
Henry Mason
Vasily Kuznetsov
@@ -149,11 +150,13 @@
Rocco Moretti
Gintautas Miliauskas
Lucian Branescu Mihaila
+ Mariano Anaya
anatoly techtonik
- Dodan Mihai
Karl Bartel
+ Stefan Beyer
Gabriel Lavoie
Jared Grubb
+ Alecsandru Patrascu
Olivier Dormond
Wouter van Heyst
Sebastian Pawluś
@@ -161,6 +164,7 @@
Victor Stinner
Andrews Medina
Aaron Iles
+ p_zieschang at yahoo.de
Toby Watson
Daniel Patrick
Stuart Williams
@@ -171,6 +175,7 @@
Michael Cheng
Mikael Schönenberg
Stanislaw Halik
+ Mihnea Saracin
Berkin Ilbeyi
Gasper Zejn
Faye Zhao
@@ -181,14 +186,12 @@
Jonathan David Riehl
Beatrice During
Alex Perry
- p_zieschang at yahoo.de
Robert Zaremba
Alan McIntyre
Alexander Sedov
Vaibhav Sood
Reuben Cummings
Attila Gobi
- Alecsandru Patrascu
Christopher Pope
Tristan Arthur
Christian Tismer
@@ -210,7 +213,6 @@
Jacek Generowicz
Sylvain Thenault
Jakub Stasiak
- Stefan Beyer
Andrew Dalke
Alejandro J. Cura
Vladimir Kryachko
@@ -242,6 +244,7 @@
Christoph Gerum
Miguel de Val Borro
Artur Lisiecki
+ afteryu
Toni Mattis
Laurens Van Houtven
Bobby Impollonia
@@ -272,6 +275,7 @@
Anna Katrina Dominguez
Kim Jin Su
Amber Brown
+ Anthony Sottile
Nate Bragg
Ben Darnell
Juan Francisco Cantero Hurtado
@@ -292,12 +296,14 @@
Mike Bayer
Rodrigo Araújo
Daniil Yarancev
+ Min RK
OlivierBlanvillain
Jonas Pfannschmidt
Zearin
Andrey Churin
Dan Crosta
reubano at gmail.com
+ Stanisław Halik
Julien Phalip
Roman Podoliaka
Eli Stevens
diff --git a/pypy/doc/cpython_differences.rst b/pypy/doc/cpython_differences.rst
--- a/pypy/doc/cpython_differences.rst
+++ b/pypy/doc/cpython_differences.rst
@@ -436,7 +436,8 @@
* the ``__builtins__`` name is always referencing the ``__builtin__`` module,
never a dictionary as it sometimes is in CPython. Assigning to
- ``__builtins__`` has no effect.
+ ``__builtins__`` has no effect. (For usages of tools like
+ RestrictedPython, see `issue #2653`_.)
* directly calling the internal magic methods of a few built-in types
with invalid arguments may have a slightly different result. For
@@ -556,4 +557,4 @@
.. _`is ignored in PyPy`: http://bugs.python.org/issue14621
.. _`little point`: http://events.ccc.de/congress/2012/Fahrplan/events/5152.en.html
.. _`#2072`: https://bitbucket.org/pypy/pypy/issue/2072/
-
+.. _`issue #2653`: https://bitbucket.org/pypy/pypy/issues/2653/
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-v5.9.0.rst
release-v5.8.0.rst
release-v5.7.1.rst
release-v5.7.0.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.9.0.rst
whatsnew-pypy2-5.8.0.rst
whatsnew-pypy2-5.7.0.rst
whatsnew-pypy2-5.6.0.rst
@@ -36,6 +37,7 @@
.. toctree::
whatsnew-pypy3-head.rst
+ whatsnew-pypy3-5.9.0.rst
whatsnew-pypy3-5.8.0.rst
whatsnew-pypy3-5.7.0.rst
diff --git a/pypy/doc/release-v5.9.0.rst b/pypy/doc/release-v5.9.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/release-v5.9.0.rst
@@ -0,0 +1,215 @@
+=====================================
+PyPy2.7 and PyPy3.5 v5.9 dual release
+=====================================
+
+The PyPy team is proud to release both PyPy2.7 v5.9 (an interpreter supporting
+Python 2.7 syntax), and a beta-quality PyPy3.5 v5.9 (an interpreter for Python
+3.5 syntax). The two releases are both based on much the same codebase, thus
+the dual release. Note that PyPy3.5 supports Linux 64bit only for now.
+
+This new PyPy2.7 release includes the upstream stdlib version 2.7.13, and
+PyPy3.5 includes the upstream stdlib version 3.5.3.
+
+NumPy and Pandas now work on PyPy2.7. Issues that appeared as excessive memory
+use were cleared up and other incompatibilities were resolved. The C-API
+compatibility layer does slow down code which crosses the python-c interface
+often, we have ideas on how it could be improved, and still recommend
+using pure python on PyPy or interfacing via CFFI_. Many other modules
+based on C-API exentions now work on PyPy as well.
+
+Cython 0.27 (released last week) should support more projects with PyPy, both
+on PyPy2.7 and PyPy3.5 beta.
+
+We optimized the JSON parser for recurring string keys, which should decrease
+memory use to 50% and increase parsing speed by up to 15% for large JSON files
+with many repeating dictionary keys (which is quite common).
+
+CFFI_, which is part of the PyPy release, has been updated to 1.11.1,
+improving an already great package for interfacing with C. CFFI now supports
+complex arguments in API mode, as well as ``char16_t`` and ``char32_t`` and has
+improved support for callbacks.
+
+Please let us know if your use case is slow, we have ideas how to make things
+faster but need real-world examples (not micro-benchmarks) of problematic code.
+
+Work sponsored by a Mozilla grant_ continues on PyPy3.5; numerous fixes from
+CPython were ported to PyPy. Of course the bug fixes and performance enhancements
+mentioned above are part of both PyPy2.7 and PyPy3.5 beta.
+
+As always, this release fixed many other issues and bugs raised by the
+growing community of PyPy users. We strongly recommend updating.
+
+You can download the v5.9 releases here:
+
+ http://pypy.org/download.html
+
+We would like to thank our donors for the continued support of the PyPy
+project.
+
+We would also like to thank our contributors and
+encourage new people to join the project. PyPy has many
+layers and we need help with all of them: `PyPy`_ and `RPython`_ documentation
+improvements, tweaking popular `modules`_ to run on pypy, or general `help`_
+with making RPython's JIT even better.
+
+.. _vmprof: http://vmprof.readthedocs.io
+.. _CFFI: https://cffi.readthedocs.io/en/latest/whatsnew.html
+.. _grant: https://morepypy.blogspot.com/2016/08/pypy-gets-funding-from-mozilla-for.html
+.. _`PyPy`: index.html
+.. _`RPython`: https://rpython.readthedocs.org
+.. _`modules`: project-ideas.html#make-more-python-modules-pypy-friendly
+.. _`help`: project-ideas.html
+
+What is PyPy?
+=============
+
+PyPy is a very compliant Python interpreter, almost a drop-in replacement for
+CPython 2.7 and CPython 3.5. It's fast (`PyPy and CPython 2.7.x`_ performance comparison)
+due to its integrated tracing JIT compiler.
+
+We also welcome developers of other `dynamic languages`_ to see what RPython
+can do for them.
+
+The PyPy 2.7 release supports:
+
+ * **x86** machines on most common operating systems
+ (Linux 32/64 bits, Mac OS X 64 bits, Windows 32 bits, OpenBSD, FreeBSD)
+
+ * newer **ARM** hardware (ARMv6 or ARMv7, with VFPv3) running Linux,
+
+ * big- and little-endian variants of **PPC64** running Linux,
+
+ * **s390x** running Linux
+
+.. _`PyPy and CPython 2.7.x`: http://speed.pypy.org
+.. _`dynamic languages`: http://rpython.readthedocs.io/en/latest/examples.html
+
+Highlights of the PyPy2.7, cpyext, and RPython changes (since 5.8 released June, 2017)
+======================================================================================
+
+See also issues that were resolved_
+
+Note that these are also merged into PyPy 3.5
+
+* New features and cleanups
+
+ * Add support for ``PyFrozenSet_New``, ``PyObject_HashNotImplemented``,
+ ``PyObject_Print(NULL, ...)``, ``PyObject_RichCompareBool(a, a, ...)``,
+ ``PyType_IS_GC`` (does nothing), ``PyUnicode_FromFormat``
+ * ctypes ``char_p`` and ``unichar_p`` indexing now CPython compatible
+ * ``gcdump`` now reports largest object
+ * More complete support in the ``_curses`` CFFI module
+ * Add cPickle.Unpickler.find_global (issue 1853_)
+ * Fix ``PyErr_Fetch`` + ``PyErr_NormalizeException`` with no exception set
+ * Simplify ``gc.get_referrers()`` to return the opposite of ``gc.get_referents()``
+ * Update RevDB to version pypy2.7-v5.6.2
+ * Previously, ``instance.method`` would return always the same bound method
+ object, when gotten from the same instance (as far as ``is`` and ``id()``
+ can tell). CPython doesn't do that. Now PyPy, like CPython, returns a
+ different bound method object every time. For ``type.method``, PyPy2 still
+ returns always the same *unbound* method object; CPython does it for built-in
+ types but not for user-defined types
+ * Link to disable PaX protection for the JIT when needed
+ * Update build instructions and an rarely used Makefile
+ * Recreate support for using leakfinder in cpyext tests which had suffered
+ bit-rot, disable due to many false positives
+ * Add more functionality to ``sysconfig``
+ * Added ``_swappedbytes_`` support for ``ctypes.Structure``
+ * Better support the ``inspect`` module on ``frames``
+
+* Bug Fixes
+
+ * Fix issue 2592_ - cpyext ``PyListObject.pop``, ``pop_end`` must return a value
+ * Implement ``PyListOjbect.getstorage_copy``
+ * Fix for ``reversed(dictproxy)`` issue 2601_
+ * Fix for duplicate names in ctypes' ``_fields__``, issue 2621_
+ * Update built-in ``pyexpat`` module on win32 to use UTF-8 version not UTF-16
+ * ``gc.get_objects`` now handles objects with finalizers more consistently
+ * Fixed memory leak in ``SSLContext.getpeercert`` returning validated
+ certificates and ``SSLContext.get_ca_certs(binary_mode=True)``
+ (_get_crl_dp) `CPython issue 29738`_
+
+* Performance improvements:
+
+ * Improve performance of ``bytearray.extend`` by rewriting portions in app-level
+ * Optimize list accesses with constant indexes better by retaining more
+ information about them
+ * Add a jit driver for ``array.count`` and ``array.index``
+ * Improve information retained in a bridge wrt ``array``
+ * Move some dummy CAPI functions and ``Py*_Check`` functions from RPython into
+ pure C macros
+ * In the fast ``zip(intlist1, intlist2)`` implementation, don't wrap and unwrap
+ all the ints
+ * Cache string keys that occur in JSON dicts, as they are likely to repeat
+
+* RPython improvements
+
+ * Do not preallocate a RPython list if we only know an upper bound on its size
+ * Issue 2590_: fix the bounds in the GC when allocating a lot of objects with finalizers
+ * Replace magical NOT RPYTHON comment with a decorator
+ * Implement ``socket.sendmsg()``/``.recvmsg()`` for py3.5
+ * Reduce excessive ``memory_pressure`` for ``_SSLContext`` objects and add
+ ``memory_pressure`` for ``_SSLSocket`` objects
+
+* Degredations
+
+ * Disable vmprof on win32, due to upstream changes that break the internal ``_vmprof`` module
+
+.. _here: cpython_differences.html
+.. _1853: https://bitbucket.org/pypy/pypy/issues/1853
+.. _2592: https://bitbucket.org/pypy/pypy/issues/2592
+.. _2590: https://bitbucket.org/pypy/pypy/issues/2590
+.. _2621: https://bitbucket.org/pypy/pypy/issues/2621
+
+Highlights of the PyPy3.5 release (since 5.8 beta released June 2017)
+======================================================================
+
+* New features
+
+ * Add support for ``_PyNamespace_New``, ``PyMemoryView_FromMemory``,
+ ``Py_EnterRecursiveCall`` raising RecursionError, ``PyObject_LengthHint``,
+ ``PyUnicode_FromKindAndData``, ``PyDict_SetDefault``, ``PyGenObject``,
+ ``PyGenObject``, ``PyUnicode_Substring``, ``PyLong_FromUnicodeObject``
+ * Implement ``PyType_FromSpec`` (PEP 384) and fix issues with PEP 489 support
+ * Support the new version of ``os.stat()`` on win32
+ * Use ``stat3()`` on Posix
+ * Accept buffer objects as filenames, except for `oslistdir``
+ * Make slices of array ``memoryview`` s usable as writable buffers if contiguous
+ * Better handling of ``'%s'`` formatting for byte strings which might be utf-8 encoded
+ * Update the macros ``Py_DECREF`` and similar to use the CPython 3.5 version
+ * Ensure that ``mappingproxy`` is recognised as a mapping, not a sequence
+ * Enable PGO for CLang
+ * Rework ``cppyy`` packaging and rename the backend to ``_cppyy``
+ * Support for libressl 2.5.4
+ * Mirror CPython ``classmethod __reduce__`` which fixes pickling test
+ * Use utf-8 for ``readline`` history file
+ * Allow assigning ``'__class__'`` between ``ModuleType`` and its subclasses
+ * Add async slot functions in cpyext
+
+* Bug Fixes
+
+ * Try to make ``openssl`` CFFI bindings more general and future-proof
+ * Better support ``importlib`` by only listing built-in modules in ``sys.builtin``
+ * Add ``memory_pressure`` to large CFFI allocations in ``_lzma``, issue 2579_
+ * Fix for ``reversed(mapping object)`` issue 2601_
+ * Fixing regression with non-started generator receiving non-``None``, should
+ always raise ``TypeError``
+ * ``itertools.islice``: use same logic as CPython, fixes 2643_
+
+* Performance improvements:
+
+ *
+
+* The following features of Python 3.5 are not implemented yet in PyPy:
+
+ * PEP 442: Safe object finalization
+
+.. _resolved: whatsnew-pypy2-5.9.0.html
+.. _2579: https://bitbucket.org/pypy/pypy/issues/2579
+.. _2601: https://bitbucket.org/pypy/pypy/issues/2601
+.. _2643: https://bitbucket.org/pypy/pypy/issues/2643
+.. _CPython issue 29738: https://bugs.python.org/issue29738
+
+Please update, and continue to help us make PyPy better.
+
+Cheers
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,87 +1,6 @@
-==========================
-What's new in PyPy2.7 5.9+
-==========================
-
-.. this is a revision shortly after release-pypy2.7-v5.8.0
-.. startrev: 558bd00b3dd8
-
-In previous versions of PyPy, ``instance.method`` would return always
-the same bound method object, when gotten out of the same instance (as
-far as ``is`` and ``id()`` can tell). CPython doesn't do that. Now
-PyPy, like CPython, returns a different bound method object every time.
-For ``type.method``, PyPy2 still returns always the same *unbound*
-method object; CPython does it for built-in types but not for
-user-defined types.
-
-.. branch: cffi-complex
-.. branch: cffi-char16-char32
-
-The two ``cffi-*`` branches are part of the upgrade to cffi 1.11.
-
-.. branch: ctypes_char_indexing
-
-Indexing into char* behaves differently than CPython
-
-.. branch: vmprof-0.4.8
-
-Improve and fix issues with vmprof
-
-.. branch: issue-2592
-
-CPyext PyListObject.pop must return the value
-
-.. branch: cpyext-hash_notimpl
-
-If ``tp_hash`` is ``PyObject_HashNotImplemented``, set ``obj.__dict__['__hash__']`` to None
-
-.. branch: cppyy-packaging
-
-Renaming of ``cppyy`` to ``_cppyy``.
-The former is now an external package installable with ``pip install cppyy``.
-
-.. branch: Enable_PGO_for_clang
-
-.. branch: nopax
-
-At the end of translation, run ``attr -q -s pax.flags -V m`` on
-PAX-enabled systems on the produced binary. This seems necessary
-because PyPy uses a JIT.
-
-.. branch: pypy_bytearray
-
-Improve ``bytearray`` performance (backported from py3.5)
-
-.. branch: gc-del-limit-growth
-
-Fix the bounds in the GC when allocating a lot of objects with finalizers,
-fixes issue #2590
-
-.. branch: arrays-force-less
-
-Small improvement to optimize list accesses with constant indexes better by
-throwing away information about them less eagerly.
-
-
-.. branch: getarrayitem-into-bridges
-
-More information is retained into a bridge: knowledge about the content of
-arrays (at fixed indices) is stored in guards (and thus available at the
-beginning of bridges). Also, some better feeding of information about known
-fields of constant objects into bridges.
-
-.. branch: cpyext-leakchecking
-
-Add support for leakfinder in cpyext tests (disabled for now, due to too many
-failures).
-
-.. branch: pypy_swappedbytes
-
-Added ``_swappedbytes_`` support for ``ctypes.Structure``
-
-.. branch: pycheck-macros
-
-Convert many Py*_Check cpyext functions into macros, like CPython.
-
-.. branch: py_ssize_t
-
-Explicitly use Py_ssize_t as the Signed type in pypy c-api
+===========================
+What's new in PyPy2.7 5.10+
+===========================
+
+.. this is a revision shortly after release-pypy2.7-v5.9.0
+.. startrev:899e5245de1e
diff --git a/pypy/doc/whatsnew-pypy2-5.9.0.rst b/pypy/doc/whatsnew-pypy2-5.9.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/whatsnew-pypy2-5.9.0.rst
@@ -0,0 +1,87 @@
+=========================
+What's new in PyPy2.7 5.9
+=========================
+
+.. this is a revision shortly after release-pypy2.7-v5.8.0
+.. startrev: 558bd00b3dd8
+
+In previous versions of PyPy, ``instance.method`` would return always
+the same bound method object, when gotten out of the same instance (as
+far as ``is`` and ``id()`` can tell). CPython doesn't do that. Now
+PyPy, like CPython, returns a different bound method object every time.
+For ``type.method``, PyPy2 still returns always the same *unbound*
+method object; CPython does it for built-in types but not for
+user-defined types.
+
+.. branch: cffi-complex
+.. branch: cffi-char16-char32
+
+The two ``cffi-*`` branches are part of the upgrade to cffi 1.11.
+
+.. branch: ctypes_char_indexing
+
+Indexing into char* behaves differently than CPython
+
+.. branch: vmprof-0.4.8
+
+Improve and fix issues with vmprof
+
+.. branch: issue-2592
+
+CPyext PyListObject.pop must return the value
+
+.. branch: cpyext-hash_notimpl
+
+If ``tp_hash`` is ``PyObject_HashNotImplemented``, set ``obj.__dict__['__hash__']`` to None
+
+.. branch: cppyy-packaging
+
+Renaming of ``cppyy`` to ``_cppyy``.
+The former is now an external package installable with ``pip install cppyy``.
+
+.. branch: Enable_PGO_for_clang
+
+.. branch: nopax
+
+At the end of translation, run ``attr -q -s pax.flags -V m`` on
+PAX-enabled systems on the produced binary. This seems necessary
+because PyPy uses a JIT.
+
+.. branch: pypy_bytearray
+
+Improve ``bytearray`` performance (backported from py3.5)
+
+.. branch: gc-del-limit-growth
+
+Fix the bounds in the GC when allocating a lot of objects with finalizers,
+fixes issue #2590
+
+.. branch: arrays-force-less
+
+Small improvement to optimize list accesses with constant indexes better by
+throwing away information about them less eagerly.
+
+
+.. branch: getarrayitem-into-bridges
+
+More information is retained into a bridge: knowledge about the content of
+arrays (at fixed indices) is stored in guards (and thus available at the
+beginning of bridges). Also, some better feeding of information about known
+fields of constant objects into bridges.
+
+.. branch: cpyext-leakchecking
+
+Add support for leakfinder in cpyext tests (disabled for now, due to too many
+failures).
+
+.. branch: pypy_swappedbytes
+
+Added ``_swappedbytes_`` support for ``ctypes.Structure``
+
+.. branch: pycheck-macros
+
+Convert many Py*_Check cpyext functions into macros, like CPython.
+
+.. branch: py_ssize_t
+
+Explicitly use Py_ssize_t as the Signed type in pypy c-api
diff --git a/pypy/doc/whatsnew-pypy3-5.9.0.rst b/pypy/doc/whatsnew-pypy3-5.9.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/whatsnew-pypy3-5.9.0.rst
@@ -0,0 +1,7 @@
+=======================
+What's new in PyPy3 5.9
+=======================
+
+.. this is the revision after release-pypy3.5-5.8
+.. startrev: afbf09453369
+
diff --git a/pypy/doc/whatsnew-pypy3-head.rst b/pypy/doc/whatsnew-pypy3-head.rst
--- a/pypy/doc/whatsnew-pypy3-head.rst
+++ b/pypy/doc/whatsnew-pypy3-head.rst
@@ -1,9 +1,9 @@
=========================
-What's new in PyPy3 5.8+
+What's new in PyPy3 5.9+
=========================
-.. this is the revision after release-pypy3.3-5.8.x was branched
-.. startrev: c173df164527
+.. this is the revision after release-pypy3.5-5.9
+.. startrev: be41e3ac0a29
.. branch: multiphase
diff --git a/pypy/module/_cffi_backend/__init__.py b/pypy/module/_cffi_backend/__init__.py
--- a/pypy/module/_cffi_backend/__init__.py
+++ b/pypy/module/_cffi_backend/__init__.py
@@ -3,7 +3,7 @@
from rpython.rlib import rdynload, clibffi
from rpython.rtyper.lltypesystem import rffi
-VERSION = "1.11.0"
+VERSION = "1.11.1"
FFI_DEFAULT_ABI = clibffi.FFI_DEFAULT_ABI
try:
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -1,7 +1,7 @@
# ____________________________________________________________
import sys
-assert __version__ == "1.11.0", ("This test_c.py file is for testing a version"
+assert __version__ == "1.11.1", ("This test_c.py file is for testing a version"
" of cffi that differs from the one that we"
" get from 'import _cffi_backend'")
if sys.version_info < (3,):
diff --git a/pypy/module/_pypyjson/interp_decoder.py b/pypy/module/_pypyjson/interp_decoder.py
--- a/pypy/module/_pypyjson/interp_decoder.py
+++ b/pypy/module/_pypyjson/interp_decoder.py
@@ -1,6 +1,6 @@
import sys
from rpython.rlib.rstring import StringBuilder
-from rpython.rlib.objectmodel import specialize, always_inline
+from rpython.rlib.objectmodel import specialize, always_inline, r_dict
from rpython.rlib import rfloat, runicode
from rpython.rtyper.lltypesystem import lltype, rffi
from pypy.interpreter.error import oefmt, OperationError
@@ -42,6 +42,22 @@
ll_res.chars[i] = cast_primitive(UniChar, ch)
return hlunicode(ll_res)
+def slice_eq(a, b):
+ (ll_chars1, start1, length1, _) = a
+ (ll_chars2, start2, length2, _) = b
+ if length1 != length2:
+ return False
+ j = start2
+ for i in range(start1, start1 + length1):
+ if ll_chars1[i] != ll_chars2[j]:
+ return False
+ j += 1
+ return True
+
+def slice_hash(a):
+ (ll_chars, start, length, h) = a
+ return h
+
class DecoderError(Exception):
def __init__(self, msg, pos):
self.msg = msg
@@ -60,8 +76,7 @@
self.ll_chars = rffi.str2charp(s)
self.end_ptr = lltype.malloc(rffi.CCHARPP.TO, 1, flavor='raw')
self.pos = 0
- self.last_type = TYPE_UNKNOWN
- self.memo = {}
+ self.cache = r_dict(slice_eq, slice_hash)
def close(self):
rffi.free_charp(self.ll_chars)
@@ -249,21 +264,16 @@
def decode_object(self, i):
start = i
- w_dict = self.space.newdict()
- #
+
i = self.skip_whitespace(i)
if self.ll_chars[i] == '}':
self.pos = i+1
- return w_dict
- #
+ return self.space.newdict()
+
+ d = {}
while True:
# parse a key: value
- self.last_type = TYPE_UNKNOWN
- w_name = self.decode_any(i)
- if self.last_type != TYPE_STRING:
- raise DecoderError("Key name must be string for object starting at", start)
- w_name = self.memo.setdefault(self.space.unicode_w(w_name), w_name)
-
+ name = self.decode_key(i)
i = self.skip_whitespace(self.pos)
ch = self.ll_chars[i]
if ch != ':':
@@ -272,13 +282,13 @@
i = self.skip_whitespace(i)
#
w_value = self.decode_any(i)
- self.space.setitem(w_dict, w_name, w_value)
+ d[name] = w_value
i = self.skip_whitespace(self.pos)
ch = self.ll_chars[i]
i += 1
if ch == '}':
self.pos = i
- return w_dict
+ return self._create_dict(d)
elif ch == ',':
pass
elif ch == '\0':
@@ -287,6 +297,9 @@
raise DecoderError("Unexpected '%s' when decoding object" % ch,
i-1)
+ def _create_dict(self, d):
+ from pypy.objspace.std.dictmultiobject import from_unicode_key_dict
+ return from_unicode_key_dict(self.space, d)
def decode_string(self, i):
start = i
@@ -298,22 +311,23 @@
i += 1
bits |= ord(ch)
if ch == '"':
- if bits & 0x80:
- # the 8th bit is set, it's an utf8 strnig
- content_utf8 = self.getslice(start, i-1)
- content_unicode = unicodehelper.decode_utf8(self.space, content_utf8)
- else:
- # ascii only, fast path (ascii is a strict subset of
- # latin1, and we already checked that all the chars are <
- # 128)
- content_unicode = strslice2unicode_latin1(self.s, start, i-1)
- self.last_type = TYPE_STRING
self.pos = i
- return self.space.newunicode(content_unicode)
+ return self.space.newunicode(
+ self._create_string(start, i - 1, bits))
elif ch == '\\' or ch < '\x20':
self.pos = i-1
return self.decode_string_escaped(start)
+ def _create_string(self, start, end, bits):
+ if bits & 0x80:
+ # the 8th bit is set, it's an utf8 string
+ content_utf8 = self.getslice(start, end)
+ return unicodehelper.decode_utf8(self.space, content_utf8)
+ else:
+ # ascii only, fast path (ascii is a strict subset of
+ # latin1, and we already checked that all the chars are <
+ # 128)
+ return strslice2unicode_latin1(self.s, start, end)
def decode_string_escaped(self, start):
i = self.pos
@@ -326,9 +340,7 @@
i += 1
if ch == '"':
content_utf8 = builder.build()
- content_unicode = unicodehelper.decode_utf8(
- self.space, content_utf8, allow_surrogates=True)
- self.last_type = TYPE_STRING
+ content_unicode = unicodehelper.decode_utf8(self.space, content_utf8, allow_surrogates=True)
self.pos = i
return self.space.newunicode(content_unicode)
elif ch == '\\':
@@ -390,6 +402,47 @@
lowsurr = int(hexdigits, 16) # the possible ValueError is caugth by the caller
return 0x10000 + (((highsurr - 0xd800) << 10) | (lowsurr - 0xdc00))
+ def decode_key(self, i):
+ """ returns an unwrapped unicode """
+ from rpython.rlib.rarithmetic import intmask
+
+ i = self.skip_whitespace(i)
+ ll_chars = self.ll_chars
+ ch = ll_chars[i]
+ if ch != '"':
+ raise DecoderError("Key name must be string at char", i)
+ i += 1
+
+ start = i
+ bits = 0
+ strhash = ord(ll_chars[i]) << 7
+ while True:
+ ch = ll_chars[i]
+ i += 1
+ if ch == '"':
+ break
+ elif ch == '\\' or ch < '\x20':
+ self.pos = i-1
+ return self.space.unicode_w(self.decode_string_escaped(start))
+ strhash = intmask((1000003 * strhash) ^ ord(ll_chars[i]))
+ bits |= ord(ch)
+ length = i - start - 1
+ if length == 0:
+ strhash = -1
+ else:
+ strhash ^= length
+ strhash = intmask(strhash)
+ self.pos = i
+ # check cache first:
+ key = (ll_chars, start, length, strhash)
+ try:
+ return self.cache[key]
+ except KeyError:
+ pass
+ res = self._create_string(start, i - 1, bits)
+ self.cache[key] = res
+ return res
+
def loads(space, w_s, w_errorcls=None):
s = space.text_w(w_s)
decoder = JSONDecoder(space, s)
diff --git a/pypy/module/_pypyjson/targetjson.py b/pypy/module/_pypyjson/targetjson.py
--- a/pypy/module/_pypyjson/targetjson.py
+++ b/pypy/module/_pypyjson/targetjson.py
@@ -5,9 +5,15 @@
import time
from pypy.interpreter.error import OperationError
-from pypy.module._pypyjson.interp_decoder import loads
+from pypy.module._pypyjson.interp_decoder import loads, JSONDecoder
from rpython.rlib.objectmodel import specialize, dont_inline
+def _create_dict(self, d):
+ w_res = W_Dict()
+ w_res.dictval = d
+ return w_res
+
+JSONDecoder._create_dict = _create_dict
## MSG = open('msg.json').read()
@@ -65,10 +71,14 @@
def isinstance_w(self, w_x, w_type):
return isinstance(w_x, w_type)
- def str_w(self, w_x):
+ def bytes_w(self, w_x):
assert isinstance(w_x, W_String)
return w_x.strval
+ def unicode_w(self, w_x):
+ assert isinstance(w_x, W_Unicode)
+ return w_x.unival
+
@dont_inline
def call_method(self, obj, name, arg):
assert name == 'append'
@@ -83,13 +93,17 @@
assert isinstance(key, W_Unicode)
d.dictval[key.unival] = value
- def wrapunicode(self, x):
+ def newunicode(self, x):
return W_Unicode(x)
- def wrapint(self, x):
+ def newtext(self, x):
+ return W_String(x)
+ newbytes = newtext
+
+ def newint(self, x):
return W_Int(x)
- def wrapfloat(self, x):
+ def newfloat(self, x):
return W_Float(x)
@specialize.argtype(1)
diff --git a/pypy/module/_pypyjson/test/test__pypyjson.py b/pypy/module/_pypyjson/test/test__pypyjson.py
--- a/pypy/module/_pypyjson/test/test__pypyjson.py
+++ b/pypy/module/_pypyjson/test/test__pypyjson.py
@@ -10,7 +10,18 @@
assert dec.skip_whitespace(8) == len(s)
dec.close()
-
+def test_decode_key():
+ s1 = "123" * 100
+ s = ' "%s" "%s" ' % (s1, s1)
+ dec = JSONDecoder('fake space', s)
+ assert dec.pos == 0
+ x = dec.decode_key(0)
+ assert x == s1
+ # check caching
+ y = dec.decode_key(dec.pos)
+ assert y == s1
+ assert y is x
+ dec.close()
class AppTest(object):
spaceconfig = {"usemodules": ['_pypyjson']}
@@ -189,6 +200,12 @@
res = _pypyjson.loads(json)
assert res == {u'a': u'\ud83d'}
+ def test_cache_keys(self):
+ import _pypyjson
+ json = '[{"a": 1}, {"a": 2}]'
+ res = _pypyjson.loads(json)
+ assert res == [{u'a': 1}, {u'a': 2}]
+
def test_tab_in_string_should_fail(self):
import _pypyjson
# http://json.org/JSON_checker/test/fail25.json
@@ -226,7 +243,7 @@
('{"spam":[42}', "Unexpected '}' when decoding array", 11),
('["]', 'Unterminated string starting at', 1),
('["spam":', "Unexpected ':' when decoding array", 7),
- ('[{]', "Unexpected ']' at", 2),
+ ('[{]', "Key name must be string at char", 2),
]
for inputtext, errmsg, errpos in test_cases:
exc = raises(ValueError, _pypyjson.loads, inputtext)
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -562,6 +562,7 @@
'_PyObject_CallFunction_SizeT', '_PyObject_CallMethod_SizeT',
'PyObject_GetBuffer', 'PyBuffer_Release',
+ '_Py_setfilesystemdefaultencoding',
'PyCObject_FromVoidPtr', 'PyCObject_FromVoidPtrAndDesc', 'PyCObject_AsVoidPtr',
'PyCObject_GetDesc', 'PyCObject_Import', 'PyCObject_SetVoidPtr',
@@ -1058,10 +1059,16 @@
get_capsule_type = rffi.llexternal('_%s_get_capsule_type' % prefix,
[], PyTypeObjectPtr,
compilation_info=eci, _nowrapper=True)
+ setdefenc = rffi.llexternal('_%s_setfilesystemdefaultencoding' % prefix,
+ [rffi.CCHARP], lltype.Void,
+ compilation_info=eci, _nowrapper=True)
def init_types(space):
from pypy.module.cpyext.typeobject import py_type_ready
+ from pypy.module.sys.interp_encoding import getfilesystemencoding
py_type_ready(space, get_cobject_type())
py_type_ready(space, get_capsule_type())
+ s = space.text_w(getfilesystemencoding(space))
+ setdefenc(rffi.str2charp(s, track_allocation=False)) # "leaks"
INIT_FUNCTIONS.append(init_types)
from pypy.module.posix.interp_posix import add_fork_hook
global py_fatalerror
@@ -1330,6 +1337,18 @@
decls = defaultdict(list)
for decl in FORWARD_DECLS:
decls[pypy_decl].append("%s;" % (decl,))
+ decls[pypy_decl].append("""
+ /* hack for https://bugs.python.org/issue29943 */
+ PyAPI_FUNC(int) %s(PySliceObject *arg0,
+ Signed arg1, Signed *arg2,
+ Signed *arg3, Signed *arg4, Signed *arg5);
+ static int PySlice_GetIndicesEx(PySliceObject *arg0, Py_ssize_t arg1,
+ Py_ssize_t *arg2, Py_ssize_t *arg3, Py_ssize_t *arg4,
+ Py_ssize_t *arg5) {
+ return %s(arg0, arg1, arg2, arg3,
+ arg4, arg5);
+ }
+ """ % ((mangle_name(prefix, 'PySlice_GetIndicesEx'),)*2))
for header_name, header_functions in FUNCTIONS_BY_HEADER.iteritems():
header = decls[header_name]
diff --git a/pypy/module/cpyext/include/fileobject.h b/pypy/module/cpyext/include/fileobject.h
--- a/pypy/module/cpyext/include/fileobject.h
+++ b/pypy/module/cpyext/include/fileobject.h
@@ -1,1 +1,2 @@
-#define Py_FileSystemDefaultEncoding NULL
+PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
+PyAPI_FUNC(void) _Py_setfilesystemdefaultencoding(const char *);
diff --git a/pypy/module/cpyext/include/patchlevel.h b/pypy/module/cpyext/include/patchlevel.h
--- a/pypy/module/cpyext/include/patchlevel.h
+++ b/pypy/module/cpyext/include/patchlevel.h
@@ -30,7 +30,7 @@
/* PyPy version as a string */
#define PYPY_VERSION "5.10.0-alpha0"
-#define PYPY_VERSION_NUM 0x05100000
+#define PYPY_VERSION_NUM 0x050A0000
/* Defined to mean a PyPy where cpyext holds more regular references
to PyObjects, e.g. staying alive as long as the internal PyPy object
diff --git a/pypy/module/cpyext/src/missing.c b/pypy/module/cpyext/src/missing.c
--- a/pypy/module/cpyext/src/missing.c
+++ b/pypy/module/cpyext/src/missing.c
@@ -27,3 +27,7 @@
int Py_Py3kWarningFlag = 0;
int Py_HashRandomizationFlag = 0;
+const char *Py_FileSystemDefaultEncoding; /* filled when cpyext is imported */
+void _Py_setfilesystemdefaultencoding(const char *enc) {
+ Py_FileSystemDefaultEncoding = enc;
+}
diff --git a/pypy/module/cpyext/test/test_fileobject.py b/pypy/module/cpyext/test/test_fileobject.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/test/test_fileobject.py
@@ -0,0 +1,13 @@
+from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
+
+
+class AppTestFileObject(AppTestCpythonExtensionBase):
+ def test_defaultencoding(self):
+ import sys
+ module = self.import_extension('foo', [
+ ("defenc", "METH_NOARGS",
+ """
+ return PyString_FromString(Py_FileSystemDefaultEncoding);
+ """),
+ ])
+ assert module.defenc() == sys.getfilesystemencoding()
diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_verify.py b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_verify.py
--- a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_verify.py
+++ b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_verify.py
@@ -2498,8 +2498,8 @@
for i in range(2000):
p = lib.malloc(50*1024*1024) # 50 MB
p1 = ffi.cast("char *", p)
- for j in xrange(0, 50*1024*1024, 4096):
- p1[j] = '!'
+ for j in range(0, 50*1024*1024, 4096):
+ p1[j] = b'!'
p = ffi.gc(p, lib.free, 50*1024*1024)
x = X()
x.p = p
@@ -2517,8 +2517,8 @@
pass
for i in range(2000):
p = ffi.new("char[]", 50*1024*1024) # 50 MB
- for j in xrange(0, 50*1024*1024, 4096):
- p[j] = '!'
+ for j in range(0, 50*1024*1024, 4096):
+ p[j] = b'!'
x = X()
x.p = p
x.cyclic = x
diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_verify1.py b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_verify1.py
--- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_verify1.py
+++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_verify1.py
@@ -2337,8 +2337,8 @@
for i in range(2000):
p = lib.malloc(50*1024*1024) # 50 MB
p1 = ffi.cast("char *", p)
- for j in xrange(0, 50*1024*1024, 4096):
- p1[j] = '!'
+ for j in range(0, 50*1024*1024, 4096):
+ p1[j] = b'!'
p = ffi.gc(p, lib.free, 50*1024*1024)
x = X()
x.p = p
@@ -2356,8 +2356,8 @@
pass
for i in range(2000):
p = ffi.new("char[]", 50*1024*1024) # 50 MB
- for j in xrange(0, 50*1024*1024, 4096):
- p[j] = '!'
+ for j in range(0, 50*1024*1024, 4096):
+ p[j] = b'!'
x = X()
x.p = p
x.cyclic = x
diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -1232,6 +1232,12 @@
create_iterator_classes(UnicodeDictStrategy)
+def from_unicode_key_dict(space, d):
+ strategy = space.fromcache(UnicodeDictStrategy)
+ storage = strategy.erase(d)
+ return W_DictObject(space, strategy, storage)
+
+
class IntDictStrategy(AbstractTypedStrategy, DictStrategy):
erase, unerase = rerased.new_erasing_pair("int")
erase = staticmethod(erase)
More information about the pypy-commit
mailing list