[pypy-commit] pypy py3k: merge default
pjenvey
noreply at buildbot.pypy.org
Thu Sep 11 22:48:43 CEST 2014
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r73481:1568c757e7cb
Date: 2014-09-11 13:47 -0700
http://bitbucket.org/pypy/pypy/changeset/1568c757e7cb/
Log: merge default
diff too long, truncating to 2000 out of 6687 lines
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -35,280 +35,290 @@
the beginning of each file) the files in the 'pypy' directory are each
copyrighted by one or more of the following people and organizations:
- Armin Rigo
- Maciej Fijalkowski
- Carl Friedrich Bolz
- Antonio Cuni
- Amaury Forgeot d'Arc
- Samuele Pedroni
- Alex Gaynor
- Michael Hudson
- David Schneider
- Matti Picus
- Brian Kearns
- Philip Jenvey
- Holger Krekel
- Christian Tismer
- Hakan Ardo
- Benjamin Peterson
- Manuel Jacob
- Anders Chrigstrom
- Eric van Riet Paap
- Wim Lavrijsen
- Ronan Lamy
- Richard Emslie
- Alexander Schremmer
- Dan Villiom Podlaski Christiansen
- Lukas Diekmann
- Sven Hager
- Anders Lehmann
- Aurelien Campeas
- Niklaus Haldimann
- Camillo Bruni
- Laura Creighton
- Toon Verwaest
- Remi Meier
- Leonardo Santagada
- Seo Sanghyeon
- Romain Guillebert
- Justin Peel
- Ronny Pfannschmidt
- David Edelsohn
- Anders Hammarquist
- Jakub Gustak
- Guido Wesdorp
- Lawrence Oluyede
- Bartosz Skowron
- Daniel Roberts
- Niko Matsakis
- Adrien Di Mascio
- Alexander Hesse
- Ludovic Aubry
- Jacob Hallen
- Jason Creighton
- Alex Martelli
- Michal Bendowski
- Jan de Mooij
- stian
- Michael Foord
- Stephan Diehl
- Stefan Schwarzer
- Valentino Volonghi
- Tomek Meka
- Patrick Maupin
- Bob Ippolito
- Bruno Gola
- Jean-Paul Calderone
- Timo Paulssen
- Squeaky
- Alexandre Fayolle
- Simon Burton
- Marius Gedminas
- John Witulski
- Konstantin Lopuhin
- Greg Price
- Dario Bertini
- Mark Pearse
- Simon Cross
- Andreas Stührk
- Jean-Philippe St. Pierre
- Guido van Rossum
- Pavel Vinogradov
- Paweł Piotr Przeradowski
- Paul deGrandis
- Ilya Osadchiy
- Tobias Oberstein
- Adrian Kuhn
- Boris Feigin
- Stefano Rivera
- tav
- Taavi Burns
- Georg Brandl
- Bert Freudenberg
- Stian Andreassen
- Laurence Tratt
- Wanja Saatkamp
- Ivan Sichmann Freitas
- Gerald Klix
- Mike Blume
- Oscar Nierstrasz
- Stefan H. Muller
- Jeremy Thurgood
- Gregor Wegberg
- Rami Chowdhury
- Tobias Pape
- Edd Barrett
- David Malcolm
- Eugene Oden
- Henry Mason
- Preston Timmons
- Jeff Terrace
- David Ripton
- Dusty Phillips
- Lukas Renggli
- Guenter Jantzen
- Ned Batchelder
- Amit Regmi
- Ben Young
- Nicolas Chauvat
- Andrew Durdin
- Andrew Chambers
- Michael Schneider
- Nicholas Riley
- Jason Chu
- Igor Trindade Oliveira
- Rocco Moretti
- Gintautas Miliauskas
- Michael Twomey
- Lucian Branescu Mihaila
- Tim Felgentreff
- Tyler Wade
- Gabriel Lavoie
- Olivier Dormond
- Jared Grubb
- Karl Bartel
- Brian Dorsey
- Victor Stinner
- Andrews Medina
- Stuart Williams
- Jasper Schulz
- Christian Hudon
- Toby Watson
- Antoine Pitrou
- Aaron Iles
- Michael Cheng
- Justas Sadzevicius
- Mikael Schönenberg
- Gasper Zejn
- Neil Shepperd
- Elmo Mäntynen
- Jonathan David Riehl
- Stanislaw Halik
- Anders Qvist
- Chirag Jadwani
- Beatrice During
- Alex Perry
- Vincent Legoll
- Alan McIntyre
- Alexander Sedov
- Corbin Simpson
- Christopher Pope
- wenzhuman
- Christian Tismer
- Marc Abramowitz
- Dan Stromberg
- Stefano Parmesan
- Alexis Daboville
- Jens-Uwe Mager
- Carl Meyer
- Karl Ramm
- Pieter Zieschang
- Gabriel
- Lukas Vacek
- Andrew Dalke
- Sylvain Thenault
- Nathan Taylor
- Vladimir Kryachko
- Jacek Generowicz
- Alejandro J. Cura
- Jacob Oscarson
- Travis Francis Athougies
- Ryan Gonzalez
- Kristjan Valur Jonsson
- Sebastian Pawluś
- Neil Blakey-Milner
- anatoly techtonik
- Lutz Paelike
- Lucio Torre
- Lars Wassermann
- Henrik Vendelbo
- Dan Buch
- Miguel de Val Borro
- Artur Lisiecki
- Sergey Kishchenko
- Ignas Mikalajunas
- Christoph Gerum
- Martin Blais
- Lene Wagner
- Tomo Cocoa
- roberto at goyle
- Yury V. Zaytsev
- Anna Katrina Dominguez
- William Leslie
- Bobby Impollonia
- timo at eistee.fritz.box
- Andrew Thompson
- Ben Darnell
- Roberto De Ioris
- Juan Francisco Cantero Hurtado
- Godefroid Chappelle
- Joshua Gilbert
- Dan Colish
- Christopher Armstrong
- Michael Hudson-Doyle
- Anders Sigfridsson
- Yasir Suhail
- rafalgalczynski at gmail.com
- Floris Bruynooghe
- Laurens Van Houtven
- Akira Li
- Gustavo Niemeyer
- Stephan Busemann
- Rafał Gałczyński
- Yusei Tahara
- Christian Muirhead
- James Lan
- shoma hosaka
- Daniel Neuh?user
- Matthew Miller
- Buck Golemon
- Konrad Delong
- Dinu Gherman
- Chris Lambacher
- coolbutuseless at gmail.com
- Rodrigo Araújo
- w31rd0
- Jim Baker
- James Robert
- Armin Ronacher
- Brett Cannon
- yrttyr
- aliceinwire
- OlivierBlanvillain
- Zooko Wilcox-O Hearn
- Tomer Chachamu
- Christopher Groskopf
- Asmo Soinio
- Stefan Marr
- jiaaro
- opassembler.py
- Antony Lee
- Jim Hunziker
- Markus Unterwaditzer
- Even Wiik Thomassen
- jbs
- soareschen
- Kurt Griffiths
- Mike Bayer
- Flavio Percoco
- Kristoffer Kleine
- yasirs
- Michael Chermside
- Anna Ravencroft
- Julien Phalip
- Dan Loewenherz
+ Armin Rigo
+ Maciej Fijalkowski
+ Carl Friedrich Bolz
+ Antonio Cuni
+ Amaury Forgeot d'Arc
+ Samuele Pedroni
+ Alex Gaynor
+ Michael Hudson
+ David Schneider
+ Matti Picus
+ Brian Kearns
+ Philip Jenvey
+ Holger Krekel
+ Christian Tismer
+ Hakan Ardo
+ Benjamin Peterson
+ Manuel Jacob
+ Anders Chrigstrom
+ Eric van Riet Paap
+ Ronan Lamy
+ Wim Lavrijsen
+ Richard Emslie
+ Alexander Schremmer
+ Dan Villiom Podlaski Christiansen
+ Lukas Diekmann
+ Sven Hager
+ Anders Lehmann
+ Aurelien Campeas
+ Niklaus Haldimann
+ Remi Meier
+ Camillo Bruni
+ Laura Creighton
+ Toon Verwaest
+ Leonardo Santagada
+ Seo Sanghyeon
+ Romain Guillebert
+ Justin Peel
+ Ronny Pfannschmidt
+ David Edelsohn
+ Anders Hammarquist
+ Jakub Gustak
+ Guido Wesdorp
+ Lawrence Oluyede
+ Bartosz Skowron
+ Gregor Wegberg
+ Daniel Roberts
+ Niko Matsakis
+ Adrien Di Mascio
+ Alexander Hesse
+ Ludovic Aubry
+ Jacob Hallen
+ Jason Creighton
+ Alex Martelli
+ Michal Bendowski
+ Jan de Mooij
+ stian
+ Michael Foord
+ Stephan Diehl
+ Tyler Wade
+ Stefan Schwarzer
+ Valentino Volonghi
+ Tomek Meka
+ Patrick Maupin
+ Bob Ippolito
+ Bruno Gola
+ Jean-Paul Calderone
+ Timo Paulssen
+ Squeaky
+ Alexandre Fayolle
+ Simon Burton
+ Marius Gedminas
+ Martin Matusiak
+ Konstantin Lopuhin
+ John Witulski
+ Wenzhu Man
+ Greg Price
+ Dario Bertini
+ Mark Pearse
+ Simon Cross
+ Ivan Sichmann Freitas
+ Andreas Stührk
+ Jean-Philippe St. Pierre
+ Guido van Rossum
+ Pavel Vinogradov
+ Stefano Rivera
+ Paweł Piotr Przeradowski
+ Paul deGrandis
+ Ilya Osadchiy
+ Tobias Oberstein
+ Adrian Kuhn
+ Boris Feigin
+ tav
+ Taavi Burns
+ Georg Brandl
+ Laurence Tratt
+ Bert Freudenberg
+ Stian Andreassen
+ Wanja Saatkamp
+ Gerald Klix
+ Mike Blume
+ Oscar Nierstrasz
+ Stefan H. Muller
+ Edd Barrett
+ Jeremy Thurgood
+ Rami Chowdhury
+ Tobias Pape
+ David Malcolm
+ Eugene Oden
+ Henry Mason
+ Vasily Kuznetsov
+ Preston Timmons
+ Jeff Terrace
+ David Ripton
+ Dusty Phillips
+ Lukas Renggli
+ Guenter Jantzen
+ Ned Batchelder
+ Amit Regmi
+ Ben Young
+ Nicolas Chauvat
+ Andrew Durdin
+ Andrew Chambers
+ Michael Schneider
+ Nicholas Riley
+ Jason Chu
+ Igor Trindade Oliveira
+ Tim Felgentreff
+ Rocco Moretti
+ Gintautas Miliauskas
+ Michael Twomey
+ Lucian Branescu Mihaila
+ Gabriel Lavoie
+ Olivier Dormond
+ Jared Grubb
+ Karl Bartel
+ Brian Dorsey
+ Victor Stinner
+ Andrews Medina
+ Stuart Williams
+ Jasper Schulz
+ Christian Hudon
+ Toby Watson
+ Antoine Pitrou
+ Aaron Iles
+ Michael Cheng
+ Justas Sadzevicius
+ Gasper Zejn
+ anatoly techtonik
+ Neil Shepperd
+ Mikael Schönenberg
+ Elmo M?ntynen
+ Jonathan David Riehl
+ Stanislaw Halik
+ Anders Qvist
+ Corbin Simpson
+ Chirag Jadwani
+ Beatrice During
+ Alex Perry
+ Vincent Legoll
+ Alan McIntyre
+ Alexander Sedov
+ Christopher Pope
+ Christian Tismer
+ Marc Abramowitz
+ Dan Stromberg
+ Stefano Parmesan
+ Alexis Daboville
+ Jens-Uwe Mager
+ Carl Meyer
+ Karl Ramm
+ Pieter Zieschang
+ Sebastian Pawluś
+ Gabriel
+ Lukas Vacek
+ Andrew Dalke
+ Sylvain Thenault
+ Nathan Taylor
+ Vladimir Kryachko
+ Arjun Naik
+ Attila Gobi
+ Jacek Generowicz
+ Alejandro J. Cura
+ Jacob Oscarson
+ Travis Francis Athougies
+ Ryan Gonzalez
+ Ian Foote
+ Kristjan Valur Jonsson
+ Neil Blakey-Milner
+ Lutz Paelike
+ Lucio Torre
+ Lars Wassermann
+ Valentina Mukhamedzhanova
+ Henrik Vendelbo
+ Dan Buch
+ Miguel de Val Borro
+ Artur Lisiecki
+ Sergey Kishchenko
+ Yichao Yu
+ Ignas Mikalajunas
+ Christoph Gerum
+ Martin Blais
+ Lene Wagner
+ Tomo Cocoa
+ roberto at goyle
+ Yury V. Zaytsev
+ Anna Katrina Dominguez
+ William Leslie
+ Bobby Impollonia
+ timo at eistee.fritz.box
+ Andrew Thompson
+ Yusei Tahara
+ Ben Darnell
+ Roberto De Ioris
+ Juan Francisco Cantero Hurtado
+ Godefroid Chappelle
+ Joshua Gilbert
+ Dan Colish
+ Christopher Armstrong
+ Michael Hudson-Doyle
+ Anders Sigfridsson
+ Yasir Suhail
+ Jason Michalski
+ rafalgalczynski at gmail.com
+ Floris Bruynooghe
+ Laurens Van Houtven
+ Akira Li
+ Gustavo Niemeyer
+ Stephan Busemann
+ Rafał Gałczyński
+ Christian Muirhead
+ James Lan
+ shoma hosaka
+ Daniel Neuh?user
+ Matthew Miller
+ Buck Golemon
+ Konrad Delong
+ Dinu Gherman
+ Chris Lambacher
+ coolbutuseless at gmail.com
+ Rodrigo Araújo
+ Jim Baker
+ James Robert
+ Armin Ronacher
+ Brett Cannon
+ yrttyr
+ aliceinwire
+ OlivierBlanvillain
+ Zooko Wilcox-O Hearn
+ Tomer Chachamu
+ Christopher Groskopf
+ Asmo Soinio
+ Stefan Marr
+ jiaaro
+ Mads Kiilerich
+ opassembler.py
+ Antony Lee
+ Jim Hunziker
+ Markus Unterwaditzer
+ Even Wiik Thomassen
+ jbs
+ soareschen
+ Kurt Griffiths
+ Mike Bayer
+ Matthew Miller
+ Flavio Percoco
+ Kristoffer Kleine
+ yasirs
+ Michael Chermside
+ Anna Ravencroft
+ Dan Crosta
+ Julien Phalip
+ Dan Loewenherz
- Heinrich-Heine University, Germany
- Open End AB (formerly AB Strakt), Sweden
- merlinux GmbH, Germany
- tismerysoft GmbH, Germany
- Logilab Paris, France
- DFKI GmbH, Germany
- Impara, Germany
- Change Maker, Sweden
- University of California Berkeley, USA
- Google Inc.
- King's College London
+ Heinrich-Heine University, Germany
+ Open End AB (formerly AB Strakt), Sweden
+ merlinux GmbH, Germany
+ tismerysoft GmbH, Germany
+ Logilab Paris, France
+ DFKI GmbH, Germany
+ Impara, Germany
+ Change Maker, Sweden
+ University of California Berkeley, USA
+ Google Inc.
+ King's College London
The PyPy Logo as used by http://speed.pypy.org and others was created
by Samuel Reis and is distributed on terms of Creative Commons Share Alike
diff --git a/_pytest/README-BEFORE-UPDATING b/_pytest/README-BEFORE-UPDATING
new file mode 100644
--- /dev/null
+++ b/_pytest/README-BEFORE-UPDATING
@@ -0,0 +1,17 @@
+This is PyPy's code of the pytest lib. We don't expect to upgrade it
+very often, but once we do:
+
+ WARNING!
+
+ WE HAVE MADE A FEW TWEAKS HERE!
+
+Please be sure that you don't just copy the newer version from
+upstream without checking the few changes that we did. This
+can be done like this:
+
+ cd <this directory>
+ hg log . -v | less
+
+then search for all " _pytest/" in that list to know which are the
+relevant checkins. (Look for the checkins that only edit one
+or two files in this directory.)
diff --git a/_pytest/resultlog.py b/_pytest/resultlog.py
--- a/_pytest/resultlog.py
+++ b/_pytest/resultlog.py
@@ -53,16 +53,24 @@
self.config = config
self.logfile = logfile # preferably line buffered
- def write_log_entry(self, testpath, lettercode, longrepr):
- py.builtin.print_("%s %s" % (lettercode, testpath), file=self.logfile)
+ def write_log_entry(self, testpath, lettercode, longrepr, sections=None):
+ _safeprint("%s %s" % (lettercode, testpath), file=self.logfile)
for line in longrepr.splitlines():
- py.builtin.print_(" %s" % line, file=self.logfile)
+ _safeprint(" %s" % line, file=self.logfile)
+ if sections is not None and (
+ lettercode in ('E', 'F')): # to limit the size of logs
+ for title, content in sections:
+ _safeprint(" ---------- %s ----------" % (title,),
+ file=self.logfile)
+ for line in content.splitlines():
+ _safeprint(" %s" % line, file=self.logfile)
def log_outcome(self, report, lettercode, longrepr):
testpath = getattr(report, 'nodeid', None)
if testpath is None:
testpath = report.fspath
- self.write_log_entry(testpath, lettercode, longrepr)
+ self.write_log_entry(testpath, lettercode, longrepr,
+ getattr(report, 'sections', None))
def pytest_runtest_logreport(self, report):
if report.when != "call" and report.passed:
@@ -98,3 +106,8 @@
if path is None:
path = "cwd:%s" % py.path.local()
self.write_log_entry(path, '!', str(excrepr))
+
+def _safeprint(s, file):
+ if isinstance(s, unicode):
+ s = s.encode('utf-8')
+ py.builtin.print_(s, file=file)
diff --git a/lib-python/2.7/json/encoder.py b/lib-python/2.7/json/encoder.py
--- a/lib-python/2.7/json/encoder.py
+++ b/lib-python/2.7/json/encoder.py
@@ -529,3 +529,10 @@
_current_indent_level):
yield chunk
self.__remove_markers(markers, o)
+
+
+# overwrite some helpers here with more efficient versions
+try:
+ from _pypyjson import raw_encode_basestring_ascii
+except ImportError:
+ pass
diff --git a/lib-python/2.7/sysconfig.py b/lib-python/2.7/sysconfig.py
--- a/lib-python/2.7/sysconfig.py
+++ b/lib-python/2.7/sysconfig.py
@@ -7,30 +7,30 @@
_INSTALL_SCHEMES = {
'posix_prefix': {
- 'stdlib': '{base}/lib/python{py_version_short}',
- 'platstdlib': '{platbase}/lib/python{py_version_short}',
- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
- 'include': '{base}/include/python{py_version_short}',
- 'platinclude': '{platbase}/include/python{py_version_short}',
+ 'stdlib': '{base}/lib/{implementation_lower}{py_version_short}',
+ 'platstdlib': '{platbase}/lib/{implementation_lower}{py_version_short}',
+ 'purelib': '{base}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'platlib': '{platbase}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'include': '{base}/include/{implementation_lower}{py_version_short}',
+ 'platinclude': '{platbase}/include/{implementation_lower}{py_version_short}',
'scripts': '{base}/bin',
'data': '{base}',
},
'posix_home': {
- 'stdlib': '{base}/lib/python',
- 'platstdlib': '{base}/lib/python',
- 'purelib': '{base}/lib/python',
- 'platlib': '{base}/lib/python',
- 'include': '{base}/include/python',
- 'platinclude': '{base}/include/python',
+ 'stdlib': '{base}/lib/{implementation_lower}',
+ 'platstdlib': '{base}/lib/{implementation_lower}',
+ 'purelib': '{base}/lib/{implementation_lower}',
+ 'platlib': '{base}/lib/{implementation_lower}',
+ 'include': '{base}/include/{implementation_lower}',
+ 'platinclude': '{base}/include/{implementation_lower}',
'scripts': '{base}/bin',
'data' : '{base}',
},
'pypy': {
- 'stdlib': '{base}/lib-python/{py_version_short}',
- 'platstdlib': '{base}/lib-python/{py_version_short}',
- 'purelib': '{base}/lib-python/{py_version_short}',
- 'platlib': '{base}/lib-python/{py_version_short}',
+ 'stdlib': '{base}/lib-{implementation_lower}/{py_version_short}',
+ 'platstdlib': '{base}/lib-{implementation_lower}/{py_version_short}',
+ 'purelib': '{base}/lib-{implementation_lower}/{py_version_short}',
+ 'platlib': '{base}/lib-{implementation_lower}/{py_version_short}',
'include': '{base}/include',
'platinclude': '{base}/include',
'scripts': '{base}/bin',
@@ -57,37 +57,37 @@
'data' : '{base}',
},
'os2_home': {
- 'stdlib': '{userbase}/lib/python{py_version_short}',
- 'platstdlib': '{userbase}/lib/python{py_version_short}',
- 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'include': '{userbase}/include/python{py_version_short}',
+ 'stdlib': '{userbase}/lib/{implementation_lower}{py_version_short}',
+ 'platstdlib': '{userbase}/lib/{implementation_lower}{py_version_short}',
+ 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'include': '{userbase}/include/{implementation_lower}{py_version_short}',
'scripts': '{userbase}/bin',
'data' : '{userbase}',
},
'nt_user': {
- 'stdlib': '{userbase}/Python{py_version_nodot}',
- 'platstdlib': '{userbase}/Python{py_version_nodot}',
- 'purelib': '{userbase}/Python{py_version_nodot}/site-packages',
- 'platlib': '{userbase}/Python{py_version_nodot}/site-packages',
- 'include': '{userbase}/Python{py_version_nodot}/Include',
+ 'stdlib': '{userbase}/{implementation}{py_version_nodot}',
+ 'platstdlib': '{userbase}/{implementation}{py_version_nodot}',
+ 'purelib': '{userbase}/{implementation}{py_version_nodot}/site-packages',
+ 'platlib': '{userbase}/{implementation}{py_version_nodot}/site-packages',
+ 'include': '{userbase}/{implementation}{py_version_nodot}/Include',
'scripts': '{userbase}/Scripts',
'data' : '{userbase}',
},
'posix_user': {
- 'stdlib': '{userbase}/lib/python{py_version_short}',
- 'platstdlib': '{userbase}/lib/python{py_version_short}',
- 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
- 'include': '{userbase}/include/python{py_version_short}',
+ 'stdlib': '{userbase}/lib/{implementation_lower}{py_version_short}',
+ 'platstdlib': '{userbase}/lib/{implementation_lower}{py_version_short}',
+ 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
+ 'include': '{userbase}/include/{implementation_lower}{py_version_short}',
'scripts': '{userbase}/bin',
'data' : '{userbase}',
},
'osx_framework_user': {
- 'stdlib': '{userbase}/lib/python',
- 'platstdlib': '{userbase}/lib/python',
- 'purelib': '{userbase}/lib/python/site-packages',
- 'platlib': '{userbase}/lib/python/site-packages',
+ 'stdlib': '{userbase}/lib/{implementation_lower}',
+ 'platstdlib': '{userbase}/lib/{implementation_lower}',
+ 'purelib': '{userbase}/lib/{implementation_lower}/site-packages',
+ 'platlib': '{userbase}/lib/{implementation_lower}/site-packages',
'include': '{userbase}/include',
'scripts': '{userbase}/bin',
'data' : '{userbase}',
@@ -104,6 +104,11 @@
_CONFIG_VARS = None
_USER_BASE = None
+def _get_implementation():
+ if '__pypy__' in sys.builtin_module_names:
+ return 'PyPy'
+ return 'Python'
+
def _safe_realpath(path):
try:
return realpath(path)
@@ -475,6 +480,8 @@
_CONFIG_VARS['base'] = _PREFIX
_CONFIG_VARS['platbase'] = _EXEC_PREFIX
_CONFIG_VARS['projectbase'] = _PROJECT_BASE
+ _CONFIG_VARS['implementation'] = _get_implementation()
+ _CONFIG_VARS['implementation_lower'] = _get_implementation().lower()
if os.name in ('nt', 'os2'):
_init_non_posix(_CONFIG_VARS)
@@ -644,6 +651,8 @@
_print_dict('Paths', get_paths())
print
_print_dict('Variables', get_config_vars())
+ print
+ _print_dict('User', get_paths('%s_user' % os.name))
if __name__ == '__main__':
diff --git a/lib-python/2.7/test/pickletester.py b/lib-python/2.7/test/pickletester.py
--- a/lib-python/2.7/test/pickletester.py
+++ b/lib-python/2.7/test/pickletester.py
@@ -6,14 +6,16 @@
import pickletools
import copy_reg
-from test.test_support import TestFailed, verbose, have_unicode, TESTFN, impl_detail
+from test.test_support import TestFailed, verbose, have_unicode, TESTFN
try:
- from test.test_support import _2G, _1M, precisionbigmemtest
+ from test.test_support import _2G, _1M, precisionbigmemtest, impl_detail
except ImportError:
# this import might fail when run on older Python versions by test_xpickle
_2G = _1M = 0
def precisionbigmemtest(*args, **kwargs):
return lambda self: None
+ def impl_detail(*args, **kwargs):
+ return lambda self: None
# Tests that try a number of pickle protocols should have a
# for proto in protocols:
diff --git a/lib-python/2.7/test/test_mmap.py b/lib-python/2.7/test/test_mmap.py
--- a/lib-python/2.7/test/test_mmap.py
+++ b/lib-python/2.7/test/test_mmap.py
@@ -179,25 +179,27 @@
import sys
f = open(TESTFN, "r+b")
try:
- m = mmap.mmap(f.fileno(), mapsize+1)
- except ValueError:
- # we do not expect a ValueError on Windows
- # CAUTION: This also changes the size of the file on disk, and
- # later tests assume that the length hasn't changed. We need to
- # repair that.
+ try:
+ m = mmap.mmap(f.fileno(), mapsize+1)
+ except ValueError:
+ # we do not expect a ValueError on Windows
+ # CAUTION: This also changes the size of the file on disk, and
+ # later tests assume that the length hasn't changed. We need to
+ # repair that.
+ if sys.platform.startswith('win'):
+ self.fail("Opening mmap with size+1 should work on Windows.")
+ else:
+ # we expect a ValueError on Unix, but not on Windows
+ if not sys.platform.startswith('win'):
+ self.fail("Opening mmap with size+1 should raise ValueError.")
+ m.close()
+ finally:
+ f.close()
if sys.platform.startswith('win'):
- self.fail("Opening mmap with size+1 should work on Windows.")
- else:
- # we expect a ValueError on Unix, but not on Windows
- if not sys.platform.startswith('win'):
- self.fail("Opening mmap with size+1 should raise ValueError.")
- m.close()
- f.close()
- if sys.platform.startswith('win'):
- # Repair damage from the resizing test.
- f = open(TESTFN, 'r+b')
- f.truncate(mapsize)
- f.close()
+ # Repair damage from the resizing test.
+ f = open(TESTFN, 'r+b')
+ f.truncate(mapsize)
+ f.close()
# Opening mmap with access=ACCESS_WRITE
f = open(TESTFN, "r+b")
diff --git a/py/README-BEFORE-UPDATING b/py/README-BEFORE-UPDATING
new file mode 100644
--- /dev/null
+++ b/py/README-BEFORE-UPDATING
@@ -0,0 +1,17 @@
+This is PyPy's code of the py lib. We don't expect to upgrade it
+very often, but once we do:
+
+ WARNING!
+
+ WE HAVE MADE A FEW TWEAKS HERE!
+
+Please be sure that you don't just copy the newer version from
+upstream without checking the few changes that we did. This
+can be done like this:
+
+ cd <this directory>
+ hg log . -v | less
+
+then search for all " py/" in that list to know which are the
+relevant checkins. (Look for the checkins that only edit one
+or two files in this directory.)
diff --git a/py/_code/code.py b/py/_code/code.py
--- a/py/_code/code.py
+++ b/py/_code/code.py
@@ -588,7 +588,7 @@
class TerminalRepr:
def __str__(self):
s = self.__unicode__()
- if sys.version_info[0] < 3:
+ if sys.version_info[0] < 3 and isinstance(s, unicode):
s = s.encode('utf-8')
return s
diff --git a/py/_path/local.py b/py/_path/local.py
--- a/py/_path/local.py
+++ b/py/_path/local.py
@@ -750,7 +750,8 @@
mkdtemp = classmethod(mkdtemp)
def make_numbered_dir(cls, prefix='session-', rootdir=None, keep=3,
- lock_timeout = 172800): # two days
+ lock_timeout = 172800, # two days
+ min_timeout = 300): # five minutes
""" return unique directory with a number greater than the current
maximum one. The number is assumed to start directly after prefix.
if keep is true directories with a number less than (maxnum-keep)
@@ -818,6 +819,20 @@
for path in rootdir.listdir():
num = parse_num(path)
if num is not None and num <= (maxnum - keep):
+ if min_timeout:
+ # NB: doing this is needed to prevent (or reduce
+ # a lot the chance of) the following situation:
+ # 'keep+1' processes call make_numbered_dir() at
+ # the same time, they create dirs, but then the
+ # last process notices the first dir doesn't have
+ # (yet) a .lock in it and kills it.
+ try:
+ t1 = path.lstat().mtime
+ t2 = lockfile.lstat().mtime
+ if abs(t2-t1) < min_timeout:
+ continue # skip directories too recent
+ except py.error.Error:
+ continue # failure to get a time, better skip
lf = path.join('.lock')
try:
t1 = lf.lstat().mtime
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -53,12 +53,11 @@
if sys.platform == "win32":
working_modules.add("_winreg")
# unix only modules
- working_modules.remove("crypt")
- working_modules.remove("fcntl")
- working_modules.remove("pwd")
- working_modules.remove("termios")
- working_modules.remove("_minimal_curses")
- working_modules.remove("_posixsubprocess")
+ for name in ["crypt", "fcntl", "pwd", "termios", "_minimal_curses",
+ "_posixsubprocess"]:
+ working_modules.remove(name)
+ if name in translation_modules:
+ translation_modules.remove(name)
if "cppyy" in working_modules:
working_modules.remove("cppyy") # not tested on win32
diff --git a/pypy/doc/conf.py b/pypy/doc/conf.py
--- a/pypy/doc/conf.py
+++ b/pypy/doc/conf.py
@@ -65,9 +65,9 @@
# built documents.
#
# The short X.Y version.
-version = '2.3'
+version = '2.4'
# The full version, including alpha/beta/rc tags.
-release = '2.3.0'
+release = '2.4.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/pypy/doc/contributor.rst b/pypy/doc/contributor.rst
--- a/pypy/doc/contributor.rst
+++ b/pypy/doc/contributor.rst
@@ -25,8 +25,8 @@
Manuel Jacob
Anders Chrigstrom
Eric van Riet Paap
+ Ronan Lamy
Wim Lavrijsen
- Ronan Lamy
Richard Emslie
Alexander Schremmer
Dan Villiom Podlaski Christiansen
@@ -35,10 +35,10 @@
Anders Lehmann
Aurelien Campeas
Niklaus Haldimann
+ Remi Meier
Camillo Bruni
Laura Creighton
Toon Verwaest
- Remi Meier
Leonardo Santagada
Seo Sanghyeon
Romain Guillebert
@@ -50,6 +50,7 @@
Guido Wesdorp
Lawrence Oluyede
Bartosz Skowron
+ Gregor Wegberg
Daniel Roberts
Niko Matsakis
Adrien Di Mascio
@@ -63,6 +64,7 @@
stian
Michael Foord
Stephan Diehl
+ Tyler Wade
Stefan Schwarzer
Valentino Volonghi
Tomek Meka
@@ -75,43 +77,45 @@
Alexandre Fayolle
Simon Burton
Marius Gedminas
+ Martin Matusiak
+ Konstantin Lopuhin
John Witulski
- Konstantin Lopuhin
+ Wenzhu Man
Greg Price
Dario Bertini
Mark Pearse
Simon Cross
+ Ivan Sichmann Freitas
Andreas Stührk
Jean-Philippe St. Pierre
Guido van Rossum
Pavel Vinogradov
+ Stefano Rivera
Paweł Piotr Przeradowski
Paul deGrandis
Ilya Osadchiy
Tobias Oberstein
Adrian Kuhn
Boris Feigin
- Stefano Rivera
tav
Taavi Burns
Georg Brandl
+ Laurence Tratt
Bert Freudenberg
Stian Andreassen
- Laurence Tratt
Wanja Saatkamp
- Ivan Sichmann Freitas
Gerald Klix
Mike Blume
Oscar Nierstrasz
Stefan H. Muller
+ Edd Barrett
Jeremy Thurgood
- Gregor Wegberg
Rami Chowdhury
Tobias Pape
- Edd Barrett
David Malcolm
Eugene Oden
Henry Mason
+ Vasily Kuznetsov
Preston Timmons
Jeff Terrace
David Ripton
@@ -128,12 +132,11 @@
Nicholas Riley
Jason Chu
Igor Trindade Oliveira
+ Tim Felgentreff
Rocco Moretti
Gintautas Miliauskas
Michael Twomey
Lucian Branescu Mihaila
- Tim Felgentreff
- Tyler Wade
Gabriel Lavoie
Olivier Dormond
Jared Grubb
@@ -149,22 +152,22 @@
Aaron Iles
Michael Cheng
Justas Sadzevicius
+ Gasper Zejn
+ anatoly techtonik
+ Neil Shepperd
Mikael Schönenberg
- Gasper Zejn
- Neil Shepperd
- Elmo Mäntynen
+ Elmo M?ntynen
Jonathan David Riehl
Stanislaw Halik
Anders Qvist
+ Corbin Simpson
Chirag Jadwani
Beatrice During
Alex Perry
Vincent Legoll
Alan McIntyre
Alexander Sedov
- Corbin Simpson
Christopher Pope
- wenzhuman
Christian Tismer
Marc Abramowitz
Dan Stromberg
@@ -174,29 +177,33 @@
Carl Meyer
Karl Ramm
Pieter Zieschang
+ Sebastian Pawluś
Gabriel
Lukas Vacek
Andrew Dalke
Sylvain Thenault
Nathan Taylor
Vladimir Kryachko
+ Arjun Naik
+ Attila Gobi
Jacek Generowicz
Alejandro J. Cura
Jacob Oscarson
Travis Francis Athougies
Ryan Gonzalez
+ Ian Foote
Kristjan Valur Jonsson
- Sebastian Pawluś
Neil Blakey-Milner
- anatoly techtonik
Lutz Paelike
Lucio Torre
Lars Wassermann
+ Valentina Mukhamedzhanova
Henrik Vendelbo
Dan Buch
Miguel de Val Borro
Artur Lisiecki
Sergey Kishchenko
+ Yichao Yu
Ignas Mikalajunas
Christoph Gerum
Martin Blais
@@ -209,6 +216,7 @@
Bobby Impollonia
timo at eistee.fritz.box
Andrew Thompson
+ Yusei Tahara
Ben Darnell
Roberto De Ioris
Juan Francisco Cantero Hurtado
@@ -219,6 +227,7 @@
Michael Hudson-Doyle
Anders Sigfridsson
Yasir Suhail
+ Jason Michalski
rafalgalczynski at gmail.com
Floris Bruynooghe
Laurens Van Houtven
@@ -226,7 +235,6 @@
Gustavo Niemeyer
Stephan Busemann
Rafał Gałczyński
- Yusei Tahara
Christian Muirhead
James Lan
shoma hosaka
@@ -238,7 +246,6 @@
Chris Lambacher
coolbutuseless at gmail.com
Rodrigo Araújo
- w31rd0
Jim Baker
James Robert
Armin Ronacher
@@ -252,6 +259,7 @@
Asmo Soinio
Stefan Marr
jiaaro
+ Mads Kiilerich
opassembler.py
Antony Lee
Jim Hunziker
@@ -261,11 +269,13 @@
soareschen
Kurt Griffiths
Mike Bayer
+ Matthew Miller
Flavio Percoco
Kristoffer Kleine
yasirs
Michael Chermside
Anna Ravencroft
+ Dan Crosta
Julien Phalip
Dan Loewenherz
diff --git a/pypy/doc/getting-started-python.rst b/pypy/doc/getting-started-python.rst
--- a/pypy/doc/getting-started-python.rst
+++ b/pypy/doc/getting-started-python.rst
@@ -111,6 +111,10 @@
of your choice. Typical example: ``--opt=2`` gives a good (but of
course slower) Python interpreter without the JIT.
+ Consider using PyPy instead of CPython in the above command line,
+ as it is much faster. (Note that ``rpython`` is a Python 2 program,
+ not Python 3; you need to run either PyPy 2 or CPython 2.)
+
.. _`optimization level`: config/opt.html
If everything works correctly this will create an executable
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-2.4.0.rst
release-2.3.1.rst
release-2.3.0.rst
release-2.2.1.rst
diff --git a/pypy/doc/index.rst b/pypy/doc/index.rst
--- a/pypy/doc/index.rst
+++ b/pypy/doc/index.rst
@@ -40,7 +40,7 @@
* `FAQ`_: some frequently asked questions.
-* `Release 2.3.1`_: the latest official release
+* `Release 2.4.0`_: the latest official release
* `PyPy Blog`_: news and status info about PyPy
@@ -110,7 +110,7 @@
.. _`Getting Started`: getting-started.html
.. _`Papers`: extradoc.html
.. _`Videos`: video-index.html
-.. _`Release 2.3.1`: http://pypy.org/download.html
+.. _`Release 2.4.0`: http://pypy.org/download.html
.. _`speed.pypy.org`: http://speed.pypy.org
.. _`RPython toolchain`: translation.html
.. _`potential project ideas`: project-ideas.html
diff --git a/pypy/doc/release-2.4.0.rst b/pypy/doc/release-2.4.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/release-2.4.0.rst
@@ -0,0 +1,119 @@
+=================================================
+PyPy 2.4 - Snow White
+=================================================
+
+We're pleased to announce PyPy 2.4, which contains significant performance
+enhancements and bug fixes.
+
+You can already download the PyPy 2.4-beta1 pre-release here:
+
+ http://pypy.org/download.html
+
+We would like to thank our donors for the continued support of the PyPy
+project, and for those who donate to our three sub-projects.
+We've shown quite a bit of progress, but we're slowly running out of funds.
+Please consider donating more, or even better convince your employer to donate,
+so we can finish those projects! We would like to also point out that in
+September, `the Python Software Foundation`_ will `match funds`_ for
+any donations up to $10k! The three sub-projects are:
+
+* `Py3k`_ (supporting Python 3.x): We have released a Python 3.2.5 compatible version
+ we call PyPy3 2.3.1, and are working toward a Python 3.3 compatible version
+
+* `STM`_ (software transactional memory): We have released a first working version,
+ and continue to try out new promising paths of achieving a fast multithreaded Python
+
+* `NumPy`_ which requires installation of our fork of upstream numpy,
+ available `on bitbucket`_
+
+.. _`Py3k`: http://pypy.org/py3donate.html
+.. _`STM`: http://pypy.org/tmdonate2.html
+.. _`NumPy`: http://pypy.org/numpydonate.html
+.. _`on bitbucket`: https://www.bitbucket.org/pypy/numpy
+.. _`the Python Software Foundation`: https://www.python.org/psf/
+.. _`match funds`: http://morepypy.blogspot.com/2014/09/python-software-foundation-matching.html
+
+What is PyPy?
+=============
+
+PyPy is a very compliant Python interpreter, almost a drop-in replacement for
+CPython 2.7. It's fast (`pypy 2.4 and cpython 2.7.x`_ performance comparison)
+due to its integrated tracing JIT compiler.
+
+This release supports **x86** machines on most common operating systems
+(Linux 32/64, Mac OS X 64, Windows, and OpenBSD),
+as well as newer **ARM** hardware (ARMv6 or ARMv7, with VFPv3) running Linux.
+
+While we support 32 bit python on Windows, work on the native Windows 64
+bit python is still stalling, we would welcome a volunteer
+to `handle that`_.
+
+.. _`pypy 2.4 and cpython 2.7.x`: http://speed.pypy.org
+.. _`handle that`: http://doc.pypy.org/en/latest/windows.html#what-is-missing-for-a-full-64-bit-translation
+
+Highlights
+==========
+
+Benchmarks improved after internal enhancements in string and
+bytearray handling, and a major rewrite of the GIL handling. This means
+that external calls are now a lot faster, especially the CFFI ones. It also
+means better performance in a lot of corner cases with handling strings or
+bytearrays. The main bugfix is handling of many socket objects in your
+program which in the long run used to "leak" memory.
+
+PyPy now uses Python 2.7.8 standard library.
+
+We welcomed more than 12 new contributors, and conducted two Google
+Summer of Code projects, as well as other student projects not
+directly related to Summer of Code.
+
+
+Issues reported with our previous release were fixed after reports from users on
+our new issue tracker at https://bitbucket.org/pypy/pypy/issues or on IRC at
+#pypy. Here is a summary of the user-facing changes;
+for more information see `whats-new`_:
+
+* Reduced internal copying of bytearray operations
+
+* Tweak the internal structure of StringBuilder to speed up large string
+ handling, which becomes advantageous on large programs at the cost of slightly
+ slower small *benchmark* type programs.
+
+* Boost performance of thread-local variables in both unjitted and jitted code,
+ this mostly affects errno handling on linux, which makes external calls
+ faster.
+
+* Move to a mixed polling and mutex GIL model that make mutlithreaded jitted
+ code run *much* faster
+
+* Optimize errno handling in linux (x86 and x86-64 only)
+
+* Remove ctypes pythonapi and ctypes.PyDLL, which never worked on PyPy
+
+* Fix performance regression on ufunc(<scalar>, <scalar>) in numpy
+
+* Classes in the ast module are now distinct from structures used by
+ the compiler, which simplifies and speeds up translation of our
+ source code to the PyPy binary interpreter
+
+* Upgrade stdlib from 2.7.5 to 2.7.8
+
+* Win32 now links statically to zlib, expat, bzip, and openssl-1.0.1i.
+ No more missing DLLs
+
+* Many issues were resolved_ since the 2.3.1 release on June 8
+
+.. _`whats-new`: http://doc.pypy.org/en/latest/whatsnew-2.3.1.html
+.. _resolved: https://bitbucket.org/pypy/pypy/issues?status=resolved
+
+We have further improvements on the way: rpython file handling,
+numpy linalg compatibility, as well
+as improved GC and many smaller improvements.
+
+Please try it out and let us know what you think. We especially welcome
+success stories, we know you are using PyPy, please tell us about it!
+
+Cheers
+
+The PyPy Team
+
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
@@ -67,6 +67,8 @@
'Edd Barrett': ['edd'],
'Manuel Jacob': ['mjacob'],
'Rami Chowdhury': ['necaris'],
+ 'Stanislaw Halik':['w31rd0'],
+ 'Wenzhu Man':['wenzhu man', 'wenzhuman'],
}
alias_map = {}
diff --git a/pypy/doc/whatsnew-2.4.0.rst b/pypy/doc/whatsnew-2.4.0.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/whatsnew-2.4.0.rst
@@ -0,0 +1,66 @@
+=======================
+What's new in PyPy 2.4+
+=======================
+
+.. this is a revision shortly after release-2.3.x
+.. startrev: ca9b7cf02cf4
+
+.. branch: fix-bytearray-complexity
+Bytearray operations no longer copy the bytearray unnecessarily
+
+Added support for ``__getitem__``, ``__setitem__``, ``__getslice__``,
+``__setslice__``, and ``__len__`` to RPython
+
+.. branch: stringbuilder2-perf
+Give the StringBuilder a more flexible internal structure, with a
+chained list of strings instead of just one string. This make it
+more efficient when building large strings, e.g. with cStringIO().
+
+Also, use systematically jit.conditional_call() instead of regular
+branches. This lets the JIT make more linear code, at the cost of
+forcing a bit more data (to be passed as arguments to
+conditional_calls). I would expect the net result to be a slight
+slow-down on some simple benchmarks and a speed-up on bigger
+programs.
+
+.. branch: ec-threadlocal
+Change the executioncontext's lookup to be done by reading a thread-
+local variable (which is implemented in C using '__thread' if
+possible, and pthread_getspecific() otherwise). On Linux x86 and
+x86-64, the JIT backend has a special optimization that lets it emit
+directly a single MOV from a %gs- or %fs-based address. It seems
+actually to give a good boost in performance.
+
+.. branch: fast-gil
+A faster way to handle the GIL, particularly in JIT code. The GIL is
+now a composite of two concepts: a global number (it's just set from
+1 to 0 and back around CALL_RELEASE_GIL), and a real mutex. If there
+are threads waiting to acquire the GIL, one of them is actively
+checking the global number every 0.1 ms to 1 ms. Overall, JIT loops
+full of external function calls now run a bit faster (if no thread was
+started yet), or a *lot* faster (if threads were started already).
+
+.. branch: jit-get-errno
+Optimize the errno handling in the JIT, notably around external
+function calls. Linux-only.
+
+.. branch: disable_pythonapi
+Remove non-functioning ctypes.pyhonapi and ctypes.PyDLL, document this
+incompatibility with cpython. Recast sys.dllhandle to an int.
+
+.. branch: scalar-operations
+Fix performance regression on ufunc(<scalar>, <scalar>) in numpy.
+
+.. branch: pytest-25
+Update our copies of py.test and pylib to versions 2.5.2 and 1.4.20,
+respectively.
+
+.. branch: split-ast-classes
+Classes in the ast module are now distinct from structures used by the compiler.
+
+.. branch: stdlib-2.7.8
+Upgrades from 2.7.6 to 2.7.8
+
+.. branch: cpybug-seq-radd-rmul
+Fix issue #1861 - cpython compatability madness
+
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,59 +1,8 @@
+
=======================
-What's new in PyPy 2.4+
+What's new in PyPy 2.5+
=======================
-.. this is a revision shortly after release-2.3.x
-.. startrev: ca9b7cf02cf4
+.. this is a revision shortly after release-2.4.x
+.. startrev: 7026746cbb1b
-.. branch: fix-bytearray-complexity
-Bytearray operations no longer copy the bytearray unnecessarily
-
-Added support for ``__getitem__``, ``__setitem__``, ``__getslice__``,
-``__setslice__``, and ``__len__`` to RPython
-
-.. branch: stringbuilder2-perf
-Give the StringBuilder a more flexible internal structure, with a
-chained list of strings instead of just one string. This make it
-more efficient when building large strings, e.g. with cStringIO().
-
-Also, use systematically jit.conditional_call() instead of regular
-branches. This lets the JIT make more linear code, at the cost of
-forcing a bit more data (to be passed as arguments to
-conditional_calls). I would expect the net result to be a slight
-slow-down on some simple benchmarks and a speed-up on bigger
-programs.
-
-.. branch: ec-threadlocal
-Change the executioncontext's lookup to be done by reading a thread-
-local variable (which is implemented in C using '__thread' if
-possible, and pthread_getspecific() otherwise). On Linux x86 and
-x86-64, the JIT backend has a special optimization that lets it emit
-directly a single MOV from a %gs- or %fs-based address. It seems
-actually to give a good boost in performance.
-
-.. branch: fast-gil
-A faster way to handle the GIL, particularly in JIT code. The GIL is
-now a composite of two concepts: a global number (it's just set from
-1 to 0 and back around CALL_RELEASE_GIL), and a real mutex. If there
-are threads waiting to acquire the GIL, one of them is actively
-checking the global number every 0.1 ms to 1 ms. Overall, JIT loops
-full of external function calls now run a bit faster (if no thread was
-started yet), or a *lot* faster (if threads were started already).
-
-.. branch: jit-get-errno
-Optimize the errno handling in the JIT, notably around external
-function calls. Linux-only.
-
-.. branch: disable_pythonapi
-Remove non-functioning ctypes.pyhonapi and ctypes.PyDLL, document this
-incompatibility with cpython. Recast sys.dllhandle to an int.
-
-.. branch: scalar-operations
-Fix performance regression on ufunc(<scalar>, <scalar>) in numpy.
-
-.. branch: pytest-25
-Update our copies of py.test and pylib to versions 2.5.2 and 1.4.20,
-respectively.
-
-.. branch: split-ast-classes
-Classes in the ast module are now distinct from structures used by the compiler.
diff --git a/pypy/interpreter/mixedmodule.py b/pypy/interpreter/mixedmodule.py
--- a/pypy/interpreter/mixedmodule.py
+++ b/pypy/interpreter/mixedmodule.py
@@ -7,7 +7,6 @@
class MixedModule(Module):
applevel_name = None
- expose__file__attribute = True
# The following attribute is None as long as the module has not been
# imported yet, and when it has been, it is mod.__dict__.items() just
@@ -144,8 +143,6 @@
for name, spec in cls.appleveldefs.items():
loaders[name] = getappfileloader(pkgroot, appname, spec)
assert '__file__' not in loaders
- if cls.expose__file__attribute:
- loaders['__file__'] = cls.get__file__
if '__doc__' not in loaders:
loaders['__doc__'] = cls.get__doc__
@@ -159,28 +156,6 @@
w_obj = loader(space)
space.setattr(space.wrap(self), space.wrap(name), w_obj)
- def get__file__(cls, space):
- """ NOT_RPYTHON.
- return the __file__ attribute of a MixedModule
- which is the root-directory for the various
- applevel and interplevel snippets that make
- up the module.
- """
- try:
- fname = cls._fname
- except AttributeError:
- pkgroot = cls.__module__
- mod = __import__(pkgroot, None, None, ['__doc__'])
- fname = mod.__file__
- assert os.path.basename(fname).startswith('__init__.py')
- # make it clear that it's not really the interp-level module
- # at this path that we are seeing, but an app-level version of it
- fname = os.path.dirname(fname)
- cls._fname = fname
- return space.wrap(fname)
-
- get__file__ = classmethod(get__file__)
-
def get__doc__(cls, space):
return space.wrap(cls.__doc__)
get__doc__ = classmethod(get__doc__)
diff --git a/pypy/interpreter/module.py b/pypy/interpreter/module.py
--- a/pypy/interpreter/module.py
+++ b/pypy/interpreter/module.py
@@ -29,6 +29,17 @@
space.w_None)
self.startup_called = False
+ def _cleanup_(self):
+ """Called by the annotator on prebuilt Module instances.
+ We don't have many such modules, but for the ones that
+ show up, remove their __file__ rather than translate it
+ statically inside the executable."""
+ try:
+ space = self.space
+ space.delitem(self.w_dict, space.wrap('__file__'))
+ except OperationError:
+ pass
+
def install(self):
"""NOT_RPYTHON: installs this module into space.builtin_modules"""
w_mod = self.space.wrap(self)
diff --git a/pypy/interpreter/test/test_app_main.py b/pypy/interpreter/test/test_app_main.py
--- a/pypy/interpreter/test/test_app_main.py
+++ b/pypy/interpreter/test/test_app_main.py
@@ -1104,6 +1104,11 @@
assert sys.path == old_sys_path + [self.goal_dir]
app_main.setup_bootstrap_path(self.fake_exe)
+ assert sys.executable == '' # not executable!
+ assert sys.path == old_sys_path + [self.goal_dir]
+
+ os.chmod(self.fake_exe, 0755)
+ app_main.setup_bootstrap_path(self.fake_exe)
assert sys.executable == self.fake_exe
assert self.goal_dir not in sys.path
diff --git a/pypy/interpreter/test/test_extmodules.py b/pypy/interpreter/test/test_extmodules.py
--- a/pypy/interpreter/test/test_extmodules.py
+++ b/pypy/interpreter/test/test_extmodules.py
@@ -64,5 +64,5 @@
@pytest.mark.skipif("config.option.runappdirect")
def test_import(self):
import extmod
- assert extmod.__file__.endswith('extmod')
+ assert not hasattr(extmod, '__file__')
assert type(extmod.time()) is float
diff --git a/pypy/interpreter/test/test_module.py b/pypy/interpreter/test/test_module.py
--- a/pypy/interpreter/test/test_module.py
+++ b/pypy/interpreter/test/test_module.py
@@ -1,4 +1,6 @@
# encoding: utf-8
+import py
+from pypy.interpreter.error import OperationError
from pypy.interpreter.module import Module
class TestModule:
@@ -17,6 +19,18 @@
space.raises_w(space.w_AttributeError,
space.delattr, w_m, w('x'))
+ def test___file__(self, space):
+ w = space.wrap
+ m = Module(space, space.wrap('m'))
+ py.test.raises(OperationError, space.getattr, w(m), w('__file__'))
+ m._cleanup_()
+ py.test.raises(OperationError, space.getattr, w(m), w('__file__'))
+ space.setattr(w(m), w('__file__'), w('m.py'))
+ space.getattr(w(m), w('__file__')) # does not raise
+ m._cleanup_()
+ py.test.raises(OperationError, space.getattr, w(m), w('__file__'))
+
+
class AppTest_ModuleObject:
def test_attr(self):
m = __import__('builtins')
@@ -42,12 +56,9 @@
bar = type(sys)('bar','docstring')
assert bar.__doc__ == 'docstring'
- def test___file__(self):
- import sys, os
- if not hasattr(sys, "pypy_objspaceclass"):
- skip("need PyPy for sys.__file__ checking")
- assert sys.__file__
- assert os.path.basename(sys.__file__) == 'sys'
+ def test___file__(self):
+ import sys
+ assert not hasattr(sys, '__file__')
def test_repr(self):
import sys
diff --git a/pypy/interpreter/test/test_typedef.py b/pypy/interpreter/test/test_typedef.py
--- a/pypy/interpreter/test/test_typedef.py
+++ b/pypy/interpreter/test/test_typedef.py
@@ -385,6 +385,7 @@
assert bm.__self__ is obj
assert bm.__doc__ == "aaa"
assert bm.x == 3
+ assert type(bm).__doc__ == "instancemethod(function, instance, class)\n\nCreate an instance method object."
raises(AttributeError, setattr, bm, 'x', 15)
l = []
assert l.append.__self__ is l
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -837,6 +837,9 @@
Method.typedef = TypeDef(
"method",
+ __doc__ = """instancemethod(function, instance, class)
+
+Create an instance method object.""",
__new__ = interp2app(Method.descr_method__new__.im_func),
__call__ = interp2app(Method.descr_method_call),
__get__ = interp2app(Method.descr_method_get),
diff --git a/pypy/module/__builtin__/__init__.py b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -9,8 +9,6 @@
"""Built-in functions, exceptions, and other objects."""
applevel_name = 'builtins'
- expose__file__attribute = False
-
appleveldefs = {
'input' : 'app_io.input',
'print' : 'app_io.print_',
diff --git a/pypy/module/_cffi_backend/ctypeprim.py b/pypy/module/_cffi_backend/ctypeprim.py
--- a/pypy/module/_cffi_backend/ctypeprim.py
+++ b/pypy/module/_cffi_backend/ctypeprim.py
@@ -182,8 +182,12 @@
value = misc.read_raw_long_data(cdata, self.size)
return self.space.wrap(value)
else:
- value = misc.read_raw_signed_data(cdata, self.size)
- return self.space.wrap(value) # r_longlong => on 32-bit, 'long'
+ return self._convert_to_object_longlong(cdata)
+
+ def _convert_to_object_longlong(self, cdata):
+ # in its own function: LONGLONG may make the whole function jit-opaque
+ value = misc.read_raw_signed_data(cdata, self.size)
+ return self.space.wrap(value) # r_longlong => on 32-bit, 'long'
def convert_from_object(self, cdata, w_ob):
if self.value_fits_long:
@@ -193,8 +197,12 @@
self._overflow(w_ob)
misc.write_raw_signed_data(cdata, value, self.size)
else:
- value = misc.as_long_long(self.space, w_ob)
- misc.write_raw_signed_data(cdata, value, self.size)
+ self._convert_from_object_longlong(cdata, w_ob)
+
+ def _convert_from_object_longlong(self, cdata, w_ob):
+ # in its own function: LONGLONG may make the whole function jit-opaque
+ value = misc.as_long_long(self.space, w_ob)
+ misc.write_raw_signed_data(cdata, value, self.size)
def get_vararg_type(self):
if self.size < rffi.sizeof(rffi.INT):
@@ -264,8 +272,12 @@
self._overflow(w_ob)
misc.write_raw_unsigned_data(cdata, value, self.size)
else:
- value = misc.as_unsigned_long_long(self.space, w_ob, strict=True)
- misc.write_raw_unsigned_data(cdata, value, self.size)
+ self._convert_from_object_longlong(cdata, w_ob)
+
+ def _convert_from_object_longlong(self, cdata, w_ob):
+ # in its own function: LONGLONG may make the whole function jit-opaque
+ value = misc.as_unsigned_long_long(self.space, w_ob, strict=True)
+ misc.write_raw_unsigned_data(cdata, value, self.size)
def convert_to_object(self, cdata):
if self.value_fits_ulong:
@@ -275,8 +287,12 @@
else:
return self.space.wrap(value) # r_uint => 'long' object
else:
- value = misc.read_raw_unsigned_data(cdata, self.size)
- return self.space.wrap(value) # r_ulonglong => 'long' object
+ return self._convert_to_object_longlong(cdata)
+
+ def _convert_to_object_longlong(self, cdata):
+ # in its own function: LONGLONG may make the whole function jit-opaque
+ value = misc.read_raw_unsigned_data(cdata, self.size)
+ return self.space.wrap(value) # r_ulonglong => 'long' object
def get_vararg_type(self):
if self.size < rffi.sizeof(rffi.INT):
diff --git a/pypy/module/_cffi_backend/ctypestruct.py b/pypy/module/_cffi_backend/ctypestruct.py
--- a/pypy/module/_cffi_backend/ctypestruct.py
+++ b/pypy/module/_cffi_backend/ctypestruct.py
@@ -17,7 +17,7 @@
class W_CTypeStructOrUnion(W_CType):
- _immutable_fields_ = ['alignment?', 'fields_list?', 'fields_dict?',
+ _immutable_fields_ = ['alignment?', 'fields_list?[*]', 'fields_dict?',
'custom_field_pos?', 'with_var_array?']
# fields added by complete_struct_or_union():
alignment = -1
diff --git a/pypy/module/_cffi_backend/newtype.py b/pypy/module/_cffi_backend/newtype.py
--- a/pypy/module/_cffi_backend/newtype.py
+++ b/pypy/module/_cffi_backend/newtype.py
@@ -389,7 +389,7 @@
w_ctype.size = totalsize
w_ctype.alignment = totalalignment
- w_ctype.fields_list = fields_list
+ w_ctype.fields_list = fields_list[:]
w_ctype.fields_dict = fields_dict
w_ctype.custom_field_pos = custom_field_pos
w_ctype.with_var_array = with_var_array
diff --git a/pypy/module/_io/interp_stringio.py b/pypy/module/_io/interp_stringio.py
--- a/pypy/module/_io/interp_stringio.py
+++ b/pypy/module/_io/interp_stringio.py
@@ -86,7 +86,7 @@
initval = space.unicode_w(w_initval)
size = len(initval)
self.resize_buffer(size)
- self.buf = [c for c in initval]
+ self.buf = list(initval)
pos = space.getindex_w(w_pos, space.w_TypeError)
if pos < 0:
raise OperationError(space.w_ValueError,
diff --git a/pypy/module/_pypyjson/__init__.py b/pypy/module/_pypyjson/__init__.py
--- a/pypy/module/_pypyjson/__init__.py
+++ b/pypy/module/_pypyjson/__init__.py
@@ -7,4 +7,6 @@
interpleveldefs = {
'loads' : 'interp_decoder.loads',
+ 'raw_encode_basestring_ascii':
+ 'interp_encoder.raw_encode_basestring_ascii',
}
diff --git a/pypy/module/_pypyjson/interp_encoder.py b/pypy/module/_pypyjson/interp_encoder.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_pypyjson/interp_encoder.py
@@ -0,0 +1,82 @@
+from rpython.rlib.rstring import StringBuilder
+from rpython.rlib.runicode import str_decode_utf_8
+from pypy.interpreter import unicodehelper
+
+
+HEX = '0123456789abcdef'
+
+ESCAPE_DICT = {
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+}
+ESCAPE_BEFORE_SPACE = [ESCAPE_DICT.get(chr(_i), '\\u%04x' % _i)
+ for _i in range(32)]
+
+
+def raw_encode_basestring_ascii(space, w_string):
+ if space.isinstance_w(w_string, space.w_str):
+ s = space.str_w(w_string)
+ for i in range(len(s)):
+ c = s[i]
+ if c >= ' ' and c <= '~' and c != '"' and c != '\\':
+ pass
+ else:
+ first = i
+ break
+ else:
+ # the input is a string with only non-special ascii chars
+ return w_string
+
+ eh = unicodehelper.decode_error_handler(space)
+ u = str_decode_utf_8(
+ s, len(s), None, final=True, errorhandler=eh,
+ allow_surrogates=True)[0]
+ sb = StringBuilder(len(u))
+ sb.append_slice(s, 0, first)
+ else:
+ # We used to check if 'u' contains only safe characters, and return
+ # 'w_string' directly. But this requires an extra pass over all
+ # characters, and the expected use case of this function, from
+ # json.encoder, will anyway re-encode a unicode result back to
+ # a string (with the ascii encoding). This requires two passes
+ # over the characters. So we may as well directly turn it into a
+ # string here --- only one pass.
+ u = space.unicode_w(w_string)
+ sb = StringBuilder(len(u))
+ first = 0
+
+ for i in range(first, len(u)):
+ c = u[i]
+ if c <= u'~':
+ if c == u'"' or c == u'\\':
+ sb.append('\\')
+ elif c < u' ':
+ sb.append(ESCAPE_BEFORE_SPACE[ord(c)])
+ continue
+ sb.append(chr(ord(c)))
+ else:
+ if c <= u'\uffff':
+ sb.append('\\u')
+ sb.append(HEX[ord(c) >> 12])
+ sb.append(HEX[(ord(c) >> 8) & 0x0f])
+ sb.append(HEX[(ord(c) >> 4) & 0x0f])
+ sb.append(HEX[ord(c) & 0x0f])
+ else:
+ # surrogate pair
+ n = ord(c) - 0x10000
+ s1 = 0xd800 | ((n >> 10) & 0x3ff)
+ sb.append('\\ud')
+ sb.append(HEX[(s1 >> 8) & 0x0f])
+ sb.append(HEX[(s1 >> 4) & 0x0f])
+ sb.append(HEX[s1 & 0x0f])
+ s2 = 0xdc00 | (n & 0x3ff)
+ sb.append('\\ud')
+ sb.append(HEX[(s2 >> 8) & 0x0f])
+ sb.append(HEX[(s2 >> 4) & 0x0f])
+ sb.append(HEX[s2 & 0x0f])
+
+ res = sb.build()
+ return space.wrap(res)
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
@@ -189,6 +189,25 @@
s = '["\ttab\tcharacter\tin\tstring\t"]'
raises(ValueError, "_pypyjson.loads(s)")
+ def test_raw_encode_basestring_ascii(self):
+ import _pypyjson
+ def check(s):
+ s = _pypyjson.raw_encode_basestring_ascii(s)
+ assert type(s) is str
+ return s
+ assert check("") == ""
+ assert check(u"") == ""
+ assert check("abc ") == "abc "
+ assert check(u"abc ") == "abc "
+ raises(UnicodeDecodeError, check, "\xc0")
+ assert check("\xc2\x84") == "\\u0084"
+ assert check("\xf0\x92\x8d\x85") == "\\ud808\\udf45"
+ assert check(u"\ud808\udf45") == "\\ud808\\udf45"
+ assert check(u"\U00012345") == "\\ud808\\udf45"
+ assert check("a\"c") == "a\\\"c"
+ assert check("\\\"\b\f\n\r\t") == '\\\\\\"\\b\\f\\n\\r\\t'
+ assert check("\x07") == "\\u0007"
+
def test_keys_reuse(self):
import _pypyjson
s = '[{"a_key": 1, "b_\xe9": 2}, {"a_key": 3, "b_\xe9": 4}]'
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -907,17 +907,25 @@
# socket's timeout is in seconds, poll's timeout in ms
timeout = int(sock_timeout * 1000 + 0.5)
- ready = rpoll.poll(fddict, timeout)
+ try:
+ ready = rpoll.poll(fddict, timeout)
+ except rpoll.PollError, e:
+ message = e.get_msg()
+ raise ssl_error(space, message, e.errno)
else:
if MAX_FD_SIZE is not None and sock_fd >= MAX_FD_SIZE:
return SOCKET_TOO_LARGE_FOR_SELECT
- if writing:
- r, w, e = rpoll.select([], [sock_fd], [], sock_timeout)
- ready = w
- else:
- r, w, e = rpoll.select([sock_fd], [], [], sock_timeout)
- ready = r
+ try:
+ if writing:
+ r, w, e = rpoll.select([], [sock_fd], [], sock_timeout)
+ ready = w
+ else:
+ r, w, e = rpoll.select([sock_fd], [], [], sock_timeout)
+ ready = r
+ except SelectError, e:
+ message = e.get_msg()
+ raise ssl_error(space, message, e.errno)
if ready:
return SOCKET_OPERATION_OK
else:
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
@@ -29,7 +29,7 @@
#define PY_VERSION "3.2.5"
/* PyPy version as a string */
-#define PYPY_VERSION "2.4.0-alpha0"
+#define PYPY_VERSION "2.5.0-alpha0"
/* Subversion Revision number of this file (not of the repository).
* Empty since Mercurial migration. */
diff --git a/pypy/module/errno/test/test_errno.py b/pypy/module/errno/test/test_errno.py
--- a/pypy/module/errno/test/test_errno.py
+++ b/pypy/module/errno/test/test_errno.py
@@ -8,7 +8,7 @@
cls.w_errorcode = cls.space.wrap(errno.errorcode)
def test_posix(self):
- assert self.errno.__file__
+ assert not hasattr(self.errno, '__file__')
def test_constants(self):
for code, name in self.errorcode.items():
diff --git a/pypy/module/operator/__init__.py b/pypy/module/operator/__init__.py
--- a/pypy/module/operator/__init__.py
+++ b/pypy/module/operator/__init__.py
@@ -35,7 +35,7 @@
'indexOf']
interpleveldefs = {
- '_compare_digest': 'interp_operator.compare_digest',
+ '_compare_digest': 'tscmp.compare_digest',
}
for name in interp_names:
diff --git a/pypy/module/operator/interp_operator.py b/pypy/module/operator/interp_operator.py
--- a/pypy/module/operator/interp_operator.py
+++ b/pypy/module/operator/interp_operator.py
@@ -1,6 +1,4 @@
-from rpython.rlib.objectmodel import specialize
-
-from pypy.interpreter.error import OperationError, oefmt
+from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import unwrap_spec
@@ -208,33 +206,3 @@
@unwrap_spec(default=int)
def _length_hint(space, w_iterable, default):
return space.wrap(space.length_hint(w_iterable, default))
-
-def compare_digest(space, w_a, w_b):
- if (
- space.isinstance_w(w_a, space.w_unicode) and
- space.isinstance_w(w_b, space.w_unicode)
- ):
- return space.wrap(tscmp(space.unicode_w(w_a), space.unicode_w(w_b)))
- if (
- space.isinstance_w(w_a, space.w_unicode) or
- space.isinstance_w(w_b, space.w_unicode)
- ):
More information about the pypy-commit
mailing list