Author: Wim Lavrijsen <[email protected]>
Branch: reflex-support
Changeset: r71117:3fb585ce5d69
Date: 2014-04-28 15:25 -0700
http://bitbucket.org/pypy/pypy/changeset/3fb585ce5d69/
Log: merge default into branch
diff --git a/dotviewer/graphserver.py b/dotviewer/graphserver.py
--- a/dotviewer/graphserver.py
+++ b/dotviewer/graphserver.py
@@ -160,15 +160,14 @@
" | instructions in dotviewer/sshgraphserver.py\n")
try:
import pygame
- except ImportError:
+ if isinstance(e, pygame.error):
+ print >> f, help
+ except Exception, e:
f.seek(0)
f.truncate()
- print >> f, "ImportError"
+ print >> f, "%s: %s" % (e.__class__.__name__, e)
print >> f, " | Pygame is not installed; either install it, or"
print >> f, help
- else:
- if isinstance(e, pygame.error):
- print >> f, help
io.sendmsg(msgstruct.MSG_ERROR, f.getvalue())
else:
listen_server(sys.argv[1])
diff --git a/pypy/doc/getting-started.rst b/pypy/doc/getting-started.rst
--- a/pypy/doc/getting-started.rst
+++ b/pypy/doc/getting-started.rst
@@ -76,7 +76,7 @@
.. code-block:: console
$ curl -O http://python-distribute.org/distribute_setup.py
- $ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
+ $ curl -O
https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py
$ ./pypy-2.1/bin/pypy distribute_setup.py
$ ./pypy-2.1/bin/pypy get-pip.py
$ ./pypy-2.1/bin/pip install pygments # for example
diff --git a/pypy/doc/release-2.3.0.rst b/pypy/doc/release-2.3.0.rst
--- a/pypy/doc/release-2.3.0.rst
+++ b/pypy/doc/release-2.3.0.rst
@@ -1,11 +1,17 @@
=======================================
-PyPy 2.3 - XXXX TODO
+PyPy 2.3 - Easier Than Ever
=======================================
We're pleased to announce PyPy 2.3, which targets version 2.7.6 of the Python
language. This release updates the stdlib from 2.7.3, jumping directly to
2.7.6.
-This release also contains several bugfixes and performance improvements.
+This release also contains several bugfixes and performance improvements,
+many generated by real users finding corner cases our `TDD`_ methods missed.
+`CFFI`_ has made it easier than ever to use existing C code with both cpython
+and PyPy, easing the transition for packages like `cryptography`_, `Pillow`_
+(Python Imaging Library [Fork]), a basic port of `pygame-cffi`_, and others.
+
+PyPy can now be embedded in a hosting application, for instance inside `uWSGI`_
You can download the PyPy 2.3 release here:
@@ -17,72 +23,112 @@
Please consider donating more so we can finish those projects! The three
projects are:
-* Py3k (supporting Python 3.x): the release PyPy3 2.2 is imminent.
+* `Py3k`_ (supporting Python 3.x): the release PyPy3 2.2 is imminent.
-* STM (software transactional memory): a preview will be released very soon,
- as soon as we fix a few bugs
+* `STM`_ (software transactional memory): a preview will be released very soon,
+ once we fix a few bugs
-* NumPy: the work done is included in the PyPy 2.2 release. More details below.
+* `NumPy`_ the work done is included in the PyPy 2.2 release. More details
below.
-.. _`Raspberry Pi Foundation`: http://www.raspberrypi.org
+.. _`Py3k`: http://pypy.org/py3donate.html
+.. _`STM`: http://pypy.org/tmdonate2.html
+.. _ `Numpy`: http://pypy.org/numpydonate.html
+.. _`TDD`: http://doc.pypy.org/en/latest/how-to-contribute.html
+.. _`CFFI`: http://cffi.readthedocs.org
+.. _`cryptography`: https://cryptography.io
+.. _`Pillow`: https://pypi.python.org/pypi/Pillow/2.4.0
+.. _`pygame-cffi`: https://github.com/CTPUG/pygame_cffi
+.. _`uWSGI`: http://uwsgi-docs.readthedocs.org/en/latest/PyPy.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.2 and cpython 2.7.2`_ performance comparison)
+CPython 2.7. It's fast (`pypy 2.2 and cpython 2.7.2`_ performance comparison;
+note that the latest cpython is not faster than cpython 2.7.2)
due to its integrated tracing JIT compiler.
-This release supports x86 machines running Linux 32/64, Mac OS X 64, Windows
-32, or ARM (ARMv6 or ARMv7, with VFPv3).
+This release supports x86 machines running Linux 32/64, Mac OS X 64, Windows,
+and OpenBSD,
+as well as newer ARM hardware (ARMv6 or ARMv7, with VFPv3) running Linux.
-Work on the native Windows 64 is still stalling, we would welcome a volunteer
-to handle that.
+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.2 and cpython 2.7.2`: http://speed.pypy.org
+.. _`handle that`:
http://doc.pypy.org/en/latest/windows.html#what-is-missing-for-a-full-64-bit-translation
Highlights
==========
-* Our Garbage Collector is now "incremental". It should avoid almost
- all pauses due to a major collection taking place. Previously, it
- would pause the program (rarely) to walk all live objects, which
- could take arbitrarily long if your process is using a whole lot of
- RAM. Now the same work is done in steps. This should make PyPy
- more responsive, e.g. in games. There are still other pauses, from
- the GC and the JIT, but they should be on the order of 5
- milliseconds each.
+Bugfixes
+--------
-* The JIT counters for hot code were never reset, which meant that a
- process running for long enough would eventually JIT-compile more
- and more rarely executed code. Not only is it useless to compile
- such code, but as more compiled code means more memory used, this
- gives the impression of a memory leak. This has been tentatively
- fixed by decreasing the counters from time to time.
+Many issues were cleaned up after being reported by users to
https://bugs.pypy.org (ignore the bad SSL certificate) or on IRC at #pypy. Note
that we consider
+performance slowdowns as bugs.
-* NumPy has been split: now PyPy only contains the core module, called
- ``_numpypy``. The ``numpy`` module itself has been moved to
- ``https://bitbucket.org/pypy/numpy`` and ``numpypy`` disappeared.
- You need to install NumPy separately with a virtualenv:
+* The ARM port no longer crashes on unaligned memory access to floats and
doubles,
+ and singlefloats are supported in the JIT.
+
+* Generators are faster since they now skip unecessary cleanup
+
+* A first time contributor simplified JIT traces by adding integer bound
+ propagation in indexing and logical operations.
+
+* Optimize consecutive dictionary lookups of the same key in a chain
+
+* Our extensive pre-translation test suite now runs nightly on more platforms
+
+* Fix issues with reimporting builtin modules
+
+* Fix a rpython bug with loop-unrolling that appeared in the `HippyVM`_ PHP
port
+
+.. _`HippyVM`: http://www.hippyvm.com
+
+New Platforms and Features
+--------------------------
+
+* Support for OpenBSD
+
+* Code cleanup: we continue to prune out old and unused code, and to refactor
+ large parts of the codebase. We have sepearated rpython from the PyPy python
+ interpreter, and rpython is seeing use in other dynamic language projects.
+
+* Support for precompiled headers in the build process for MSVC
+
+* Support for objects with __int__ and __float__ methods
+
+* Tweak support of errno in cpyext (the PyPy implemenation of the capi)
+
+
+Numpy
+-----
+Numpy support has been split into a builtin ``_numpy`` module and a
+fork of the numpy code base adapted to pypy at
+ ``https://bitbucket.org/pypy/numpy``.
+You need to install NumPy separately with a virtualenv:
``pip install git+https://bitbucket.org/pypy/numpy.git``;
or directly:
``git clone https://bitbucket.org/pypy/numpy.git``;
``cd numpy``; ``pypy setup.py install``.
-* non-inlined calls have less overhead
+* NumPy support has been improved, many failures in indexing, dtypes,
+ and scalars were corrected. We are slowly approaching our goal of passing
+ the numpy test suite. We still do not support object or unicode ndarrays.
-* Things that use ``sys.set_trace`` are now JITted (like coverage)
+* speed of iteration in dot() is now within 1.5x of the numpy c
+ implementation (without BLAS acceleration). Since the same array
+ iterator is used throughout the ``_numpy`` module, speed increases should
+ be apparent in all Numpy functionality.
-* JSON decoding is now very fast (JSON encoding was already very fast)
+* Most of the core functionality of nditer has been implemented.
-* various buffer copying methods experience speedups (like list-of-ints to
- ``int[]`` buffer from cffi)
+* A cffi-based ``numpy.random`` module is available as a branch in the numpy
+ repository, it will be merged soon after this release.
-* We finally wrote (hopefully) all the missing ``os.xxx()`` functions,
- including ``os.startfile()`` on Windows and a handful of rare ones
- on Posix.
+* enhancements to the PyPy JIT were made to support virtualizing the
raw_store/raw_load memory operations used in numpy arrays. Further work remains
here in virtualizing the alloc_raw_storage when possible. This will allow
scalars to have storages but still be virtualized when possible in loops.
-* numpy has a rudimentary C API that cooperates with ``cpyext``
+Cheers
+The PyPy Team
-Cheers,
-Armin Rigo and Maciej Fijalkowski
diff --git a/pypy/doc/sandbox.rst b/pypy/doc/sandbox.rst
--- a/pypy/doc/sandbox.rst
+++ b/pypy/doc/sandbox.rst
@@ -42,6 +42,10 @@
use this sandboxed PyPy from a regular Python interpreter (CPython, or
an unsandboxed PyPy). Contributions welcome.
+.. warning::
+
+ Tested with PyPy2. May not work out of the box with PyPy3.
+
Overview
--------
diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -299,9 +299,13 @@
"""
self._application_traceback = traceback
[email protected]()
+
+class ClearedOpErr:
+ def __init__(self, space):
+ self.operr = OperationError(space.w_None, space.w_None)
+
def get_cleared_operation_error(space):
- return OperationError(space.w_None, space.w_None)
+ return space.fromcache(ClearedOpErr).operr
# ____________________________________________________________
# optimization only: avoid the slowest operation -- the string
diff --git a/pypy/interpreter/executioncontext.py
b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -205,11 +205,14 @@
def sys_exc_info(self): # attn: the result is not the wrapped
sys.exc_info() !!!
"""Implements sys.exc_info().
Return an OperationError instance or None."""
- frame = self.gettopframe_nohidden()
+ frame = self.gettopframe()
while frame:
if frame.last_exception is not None:
- return frame.last_exception
- frame = self.getnextframe_nohidden(frame)
+ if (not frame.hide() or
+ frame.last_exception is
+ get_cleared_operation_error(self.space)):
+ return frame.last_exception
+ frame = frame.f_backref()
return None
def set_sys_exc_info(self, operror):
diff --git a/pypy/interpreter/main.py b/pypy/interpreter/main.py
--- a/pypy/interpreter/main.py
+++ b/pypy/interpreter/main.py
@@ -15,10 +15,11 @@
space.setitem(w_modules, w_main, mainmodule)
return mainmodule
+
def compilecode(space, source, filename, cmd='exec'):
w = space.wrap
- w_code = space.builtin.call('compile',
- w(source), w(filename), w(cmd), w(0), w(0))
+ w_code = space.builtin.call(
+ 'compile', w(source), w(filename), w(cmd), w(0), w(0))
pycode = space.interp_w(eval.Code, w_code)
return pycode
@@ -28,7 +29,7 @@
cmd = 'eval'
else:
cmd = 'exec'
-
+
try:
if space is None:
from pypy.objspace.std import StdObjSpace
@@ -55,18 +56,22 @@
operationerr.record_interpreter_traceback()
raise
+
def run_string(source, filename=None, space=None):
_run_eval_string(source, filename, space, False)
+
def eval_string(source, filename=None, space=None):
return _run_eval_string(source, filename, space, True)
+
def run_file(filename, space=None):
- if __name__=='__main__':
+ if __name__ == '__main__':
print "Running %r with %r" % (filename, space)
istring = open(filename).read()
run_string(istring, filename, space)
+
def run_module(module_name, args, space=None):
"""Implements PEP 338 'Executing modules as scripts', overwriting
sys.argv[1:] using `args` and executing the module `module_name`.
@@ -89,7 +94,6 @@
return space.call_function(w_run_module, w(module_name), space.w_None,
w('__main__'), space.w_True)
-# ____________________________________________________________
def run_toplevel(space, f, verbose=False):
"""Calls f() and handle all OperationErrors.
diff --git a/pypy/module/__builtin__/functional.py
b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -351,17 +351,17 @@
self.promote_step = promote_step
def descr_new(space, w_subtype, w_start, w_stop=None, w_step=None):
- start = _toint(space, w_start)
+ start = space.int_w(w_start)
if space.is_none(w_step): # no step argument provided
step = 1
promote_step = True
else:
- step = _toint(space, w_step)
+ step = space.int_w(w_step)
promote_step = False
if space.is_none(w_stop): # only 1 argument provided
start, stop = 0, start
else:
- stop = _toint(space, w_stop)
+ stop = space.int_w(w_stop)
howmany = get_len_of_range(space, start, stop, step)
obj = space.allocate_instance(W_XRange, w_subtype)
W_XRange.__init__(obj, space, start, howmany, step, promote_step)
@@ -425,11 +425,6 @@
minint = -sys.maxint - 1
return minint if last < minint - step else last + step
-def _toint(space, w_obj):
- # this also supports float arguments. CPython still does, too.
- # needs a bit more thinking in general...
- return space.int_w(space.int(w_obj))
-
W_XRange.typedef = TypeDef("xrange",
__new__ = interp2app(W_XRange.descr_new.im_func),
__repr__ = interp2app(W_XRange.descr_repr),
@@ -441,6 +436,7 @@
)
W_XRange.typedef.acceptable_as_base_class = False
+
class W_XRangeIterator(W_Root):
def __init__(self, space, current, remaining, step):
self.space = space
@@ -488,7 +484,10 @@
)
W_XRangeIterator.typedef.acceptable_as_base_class = False
+
class W_XRangeStepOneIterator(W_XRangeIterator):
+ _immutable_fields_ = ['stop']
+
def __init__(self, space, start, stop):
self.space = space
self.current = start
diff --git a/pypy/module/__builtin__/test/test_builtin.py
b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -311,14 +311,14 @@
def test_xrange_len(self):
x = xrange(33)
assert len(x) == 33
- x = xrange(33.2)
- assert len(x) == 33
+ exc = raises(TypeError, xrange, 33.2)
+ assert "integer" in str(exc.value)
x = xrange(33,0,-1)
assert len(x) == 33
x = xrange(33,0)
assert len(x) == 0
- x = xrange(33,0.2)
- assert len(x) == 0
+ exc = raises(TypeError, xrange, 33, 0.2)
+ assert "integer" in str(exc.value)
x = xrange(0,33)
assert len(x) == 33
x = xrange(0,33,-1)
diff --git a/pypy/module/__builtin__/test/test_functional.py
b/pypy/module/__builtin__/test/test_functional.py
--- a/pypy/module/__builtin__/test/test_functional.py
+++ b/pypy/module/__builtin__/test/test_functional.py
@@ -1,5 +1,4 @@
class AppTestMap:
-
def test_trivial_map_one_seq(self):
assert map(lambda x: x+2, [1, 2, 3, 4]) == [3, 4, 5, 6]
@@ -77,6 +76,7 @@
assert result == [(2, 7), (1, 6), (None, 5), (None, 4),
(None, 3), (None, 2), (None, 1)]
+
class AppTestZip:
def test_one_list(self):
assert zip([1,2,3]) == [(1,), (2,), (3,)]
@@ -93,6 +93,7 @@
yield None
assert zip(Foo()) == []
+
class AppTestReduce:
def test_None(self):
raises(TypeError, reduce, lambda x, y: x+y, [1,2,3], None)
@@ -105,6 +106,7 @@
assert reduce(lambda x, y: x-y, [10, 2, 8]) == 0
assert reduce(lambda x, y: x-y, [2, 8], 10) == 0
+
class AppTestFilter:
def test_None(self):
assert filter(None, ['a', 'b', 1, 0, None]) == ['a', 'b', 1]
@@ -125,6 +127,7 @@
return i * 10
assert filter(lambda x: x != 20, T("abcd")) == (0, 10, 30)
+
class AppTestXRange:
def test_xrange(self):
x = xrange(2, 9, 3)
@@ -155,7 +158,8 @@
assert list(xrange(0, 10, A())) == [0, 5]
def test_xrange_float(self):
- assert list(xrange(0.1, 2.0, 1.1)) == [0, 1]
+ exc = raises(TypeError, xrange, 0.1, 2.0, 1.1)
+ assert "integer" in str(exc.value)
def test_xrange_long(self):
import sys
@@ -218,6 +222,7 @@
assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
raises(TypeError, reversed, reversed("hello"))
+
class AppTestApply:
def test_apply(self):
def f(*args, **kw):
@@ -228,6 +233,7 @@
assert apply(f, args) == (args, {})
assert apply(f, args, kw) == (args, kw)
+
class AppTestAllAny:
"""
These are copied directly and replicated from the Python 2.5 source code.
@@ -277,6 +283,7 @@
S = [10, 20, 30]
assert any([x > 42 for x in S]) == False
+
class AppTestMinMax:
def test_min(self):
assert min(1, 2) == 1
diff --git a/pypy/module/_continuation/interp_continuation.py
b/pypy/module/_continuation/interp_continuation.py
--- a/pypy/module/_continuation/interp_continuation.py
+++ b/pypy/module/_continuation/interp_continuation.py
@@ -1,6 +1,6 @@
from rpython.rlib.rstacklet import StackletThread
from rpython.rlib import jit
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, get_cleared_operation_error
from pypy.interpreter.executioncontext import ExecutionContext
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.typedef import TypeDef
@@ -39,6 +39,7 @@
bottomframe.locals_stack_w[1] = w_callable
bottomframe.locals_stack_w[2] = w_args
bottomframe.locals_stack_w[3] = w_kwds
+ bottomframe.last_exception = get_cleared_operation_error(space)
self.bottomframe = bottomframe
#
global_state.origin = self
diff --git a/pypy/module/_continuation/test/test_stacklet.py
b/pypy/module/_continuation/test/test_stacklet.py
--- a/pypy/module/_continuation/test/test_stacklet.py
+++ b/pypy/module/_continuation/test/test_stacklet.py
@@ -684,3 +684,17 @@
execfile(self.translated, d)
d['set_fast_mode']()
d['test_various_depths']()
+
+ def test_exc_info_doesnt_follow_continuations(self):
+ import sys
+ from _continuation import continulet
+ #
+ def f1(c1):
+ return sys.exc_info()
+ #
+ c1 = continulet(f1)
+ try:
+ 1 // 0
+ except ZeroDivisionError:
+ got = c1.switch()
+ assert got == (None, None, None)
diff --git a/pypy/module/cppyy/src/dummy_backend.cxx
b/pypy/module/cppyy/src/dummy_backend.cxx
--- a/pypy/module/cppyy/src/dummy_backend.cxx
+++ b/pypy/module/cppyy/src/dummy_backend.cxx
@@ -521,6 +521,15 @@
/* misc helpers ----------------------------------------------------------- */
+#if defined(_MSC_VER)
+long long cppyy_strtoll(const char* str) {
+ return _strtoi64(str, NULL, 0);
+}
+
+extern "C" unsigned long long cppyy_strtoull(const char* str) {
+ return _strtoui64(str, NULL, 0);
+}
+#else
long long cppyy_strtoll(const char* str) {
return strtoll(str, NULL, 0);
}
@@ -528,6 +537,7 @@
extern "C" unsigned long long cppyy_strtoull(const char* str) {
return strtoull(str, NULL, 0);
}
+#endif
void cppyy_free(void* ptr) {
free(ptr);
diff --git a/pypy/module/cppyy/test/test_zjit.py
b/pypy/module/cppyy/test/test_zjit.py
--- a/pypy/module/cppyy/test/test_zjit.py
+++ b/pypy/module/cppyy/test/test_zjit.py
@@ -104,7 +104,6 @@
class dummy: pass
self.config = dummy()
self.config.translating = False
- self.BUF_SIMPLE = 1
def issequence_w(self, w_obj):
return True
diff --git a/pypy/module/pypyjit/test_pypy_c/test_buffers.py
b/pypy/module/pypyjit/test_pypy_c/test_buffers.py
--- a/pypy/module/pypyjit/test_pypy_c/test_buffers.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_buffers.py
@@ -3,16 +3,18 @@
class TestBuffers(BaseTestPyPyC):
def test_re_match(self):
- def main():
+ def main(n):
import re
import array
p = re.compile('.+')
a = array.array('c', 'test' * 1000)
i = 0
- while i < 5000:
+ while i < n:
i += 1
p.match(a) # ID: match
- log = self.run(main, [])
+ return i
+ log = self.run(main, [1000])
+ assert log.result == 1000
loop, = log.loops_by_filename(self.filepath)
assert loop.match_by_id('match', """
guard_not_invalidated(descr=...)
@@ -21,8 +23,5 @@
guard_false(i67, descr=...)
i69 = int_gt(., i65)
guard_true(i69, descr=...)
- guard_not_invalidated(descr=...)
- i74 = getfield_raw(., descr=...)
- i75 = int_lt(i74, 0)
- guard_false(i75, descr=...)
+ --TICK--
""")
diff --git a/pypy/module/pypyjit/test_pypy_c/test_weakref.py
b/pypy/module/pypyjit/test_pypy_c/test_weakref.py
--- a/pypy/module/pypyjit/test_pypy_c/test_weakref.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_weakref.py
@@ -20,8 +20,7 @@
loop, = log.loops_by_filename(self.filepath)
assert loop.match("""
i58 = getfield_gc(p18, descr=<FieldS
pypy.module.__builtin__.functional.W_XRangeIterator.inst_current .>)
- i59 = getfield_gc(p18, descr=<FieldS
pypy.module.__builtin__.functional.W_XRangeStepOneIterator.inst_stop \d+>)
- i60 = int_lt(i58, i59)
+ i60 = int_lt(i58, i31)
guard_true(i60, descr=...)
i61 = int_add(i58, 1)
p62 = getfield_gc(ConstPtr(ptr37), descr=<FieldP
pypy.objspace.std.dictmultiobject.W_DictMultiObject.inst_strategy \d+>)
diff --git a/pypy/module/sys/version.py b/pypy/module/sys/version.py
--- a/pypy/module/sys/version.py
+++ b/pypy/module/sys/version.py
@@ -14,7 +14,8 @@
if platform.name == 'msvc':
COMPILER_INFO = 'MSC v.%d 32 bit' % (platform.version * 10 + 600)
-elif platform.cc is not None and platform.cc.startswith(('gcc', 'clang')):
+elif platform.cc is not None and \
+ os.path.basename(platform.cc).startswith(('gcc', 'clang')):
from rpython.rtyper.tool import rffi_platform
COMPILER_INFO = 'GCC ' + rffi_platform.getdefinedstring('__VERSION__', '')
else:
diff --git a/pypy/module/termios/interp_termios.py
b/pypy/module/termios/interp_termios.py
--- a/pypy/module/termios/interp_termios.py
+++ b/pypy/module/termios/interp_termios.py
@@ -4,7 +4,7 @@
"""
from pypy.interpreter.gateway import unwrap_spec
-from pypy.interpreter.error import wrap_oserror
+from pypy.interpreter.error import wrap_oserror, OperationError
from rpython.rlib import rtermios
import termios
@@ -19,6 +19,10 @@
@unwrap_spec(when=int)
def tcsetattr(space, w_fd, when, w_attributes):
fd = space.c_filedescriptor_w(w_fd)
+ if not space.isinstance_w(w_attributes, space.w_list) or \
+ space.len_w(w_attributes) != 7:
+ raise OperationError(space.w_TypeError, space.wrap(
+ "tcsetattr, arg 3: must be 7 element list"))
w_iflag, w_oflag, w_cflag, w_lflag, w_ispeed, w_ospeed, w_cc = \
space.unpackiterable(w_attributes, expected_length=7)
w_builtin = space.getbuiltinmodule('__builtin__')
diff --git a/pypy/module/termios/test/test_termios.py
b/pypy/module/termios/test/test_termios.py
--- a/pypy/module/termios/test/test_termios.py
+++ b/pypy/module/termios/test/test_termios.py
@@ -86,7 +86,7 @@
child.expect('ok!')
def test_ioctl_termios(self):
- source = py.code.Source("""
+ source = py.code.Source(r"""
import termios
import fcntl
lgt = len(fcntl.ioctl(2, termios.TIOCGWINSZ, '\000'*8))
@@ -149,4 +149,7 @@
def test_error_tcsetattr(self):
import termios
- raises(ValueError, termios.tcsetattr, 0, 1, (1, 2))
+ exc = raises(TypeError, termios.tcsetattr, 0, 1, (1, 2))
+ assert str(exc.value) == "tcsetattr, arg 3: must be 7 element list"
+ exc = raises(TypeError, termios.tcsetattr, 0, 1, (1, 2, 3, 4, 5, 6, 7))
+ assert str(exc.value) == "tcsetattr, arg 3: must be 7 element list"
diff --git a/pypy/module/test_lib_pypy/test_greenlet.py
b/pypy/module/test_lib_pypy/test_greenlet.py
--- a/pypy/module/test_lib_pypy/test_greenlet.py
+++ b/pypy/module/test_lib_pypy/test_greenlet.py
@@ -289,6 +289,24 @@
greenlet(f).switch()
+ def test_exc_info_save_restore2(self):
+ import sys
+ from greenlet import greenlet
+
+ result = []
+
+ def f():
+ result.append(sys.exc_info())
+
+ g = greenlet(f)
+ try:
+ 1 / 0
+ except ZeroDivisionError:
+ g.switch()
+
+ assert result == [(None, None, None)]
+
+
def test_gr_frame(self):
from greenlet import greenlet
import sys
diff --git a/pypy/module/zipimport/interp_zipimport.py
b/pypy/module/zipimport/interp_zipimport.py
--- a/pypy/module/zipimport/interp_zipimport.py
+++ b/pypy/module/zipimport/interp_zipimport.py
@@ -56,6 +56,8 @@
w = space.wrap
w_d = space.newdict()
for key, info in w_zipimporter.zip_file.NameToInfo.iteritems():
+ if ZIPSEP != os.path.sep:
+ key = key.replace(ZIPSEP, os.path.sep)
space.setitem(w_d, w(key), space.newtuple([
w(info.filename), w(info.compress_type), w(info.compress_size),
w(info.file_size), w(info.file_offset), w(info.dostime),
diff --git a/pypy/module/zipimport/test/test_undocumented.py
b/pypy/module/zipimport/test/test_undocumented.py
--- a/pypy/module/zipimport/test/test_undocumented.py
+++ b/pypy/module/zipimport/test/test_undocumented.py
@@ -135,8 +135,7 @@
importer = zipimport.zipimporter(os.path.join(zip_path, '_pkg'))
assert zip_path in zipimport._zip_directory_cache
file_set = set(zipimport._zip_directory_cache[zip_path].iterkeys())
- compare_set = set(path.replace(os.path.sep, '/') + '.py'
- for path in self.created_paths)
+ compare_set = set(path + '.py' for path in self.created_paths)
assert file_set == compare_set
finally:
self.cleanup_zipfile(self.created_paths)
diff --git a/pypy/module/zipimport/test/test_zipimport.py
b/pypy/module/zipimport/test/test_zipimport.py
--- a/pypy/module/zipimport/test/test_zipimport.py
+++ b/pypy/module/zipimport/test/test_zipimport.py
@@ -157,7 +157,6 @@
import sys, os
self.writefile("uuu.py", "def f(x): return x")
mod = __import__('uuu', globals(), locals(), [])
- print mod
assert mod.f(3) == 3
expected = {
'__doc__' : None,
@@ -334,7 +333,9 @@
self.writefile("directory/package/__init__.py", "")
importer = zipimport.zipimporter(self.zipfile + "/directory")
l = [i for i in zipimport._zip_directory_cache]
- assert len(l)
+ assert len(l) == 1
+ k = zipimport._zip_directory_cache[l[0]].keys()
+ assert k[0] == os.path.sep.join(['directory','package','__init__.py'])
def test_path_hooks(self):
import sys
diff --git a/pypy/objspace/std/bufferobject.py
b/pypy/objspace/std/bufferobject.py
--- a/pypy/objspace/std/bufferobject.py
+++ b/pypy/objspace/std/bufferobject.py
@@ -3,13 +3,12 @@
"""
import operator
-from rpython.rlib.buffer import Buffer, StringBuffer, SubBuffer
+from rpython.rlib.buffer import Buffer, SubBuffer
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
from rpython.rlib.objectmodel import compute_hash
-from rpython.rlib.rstring import StringBuilder
class W_Buffer(W_Root):
diff --git a/pypy/objspace/std/memoryobject.py
b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -6,7 +6,7 @@
from rpython.rlib.buffer import Buffer, SubBuffer
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError
-from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.gateway import interp2app
from pypy.interpreter.typedef import TypeDef, GetSetProperty
diff --git a/pypy/tool/release/force-builds.py
b/pypy/tool/release/force-builds.py
--- a/pypy/tool/release/force-builds.py
+++ b/pypy/tool/release/force-builds.py
@@ -9,7 +9,7 @@
modified by PyPy team
"""
-import os, sys, pwd, urllib
+import os, sys, urllib
from twisted.internet import reactor, defer
from twisted.python import log
@@ -34,6 +34,13 @@
'build-pypy-c-jit-linux-armel',
]
+def get_user():
+ if sys.platform == 'win32':
+ return os.environ['USERNAME']
+ else:
+ import pwd
+ return pwd.getpwuid(os.getuid())[0]
+
def main():
#XXX: handle release tags
#XXX: handle validity checks
@@ -49,7 +56,7 @@
print 'Forcing', builder, '...'
url = "http://buildbot.pypy.org/builders/" + builder + "/force"
args = [
- ('username', pwd.getpwuid(os.getuid())[0]),
+ ('username', get_user()),
('revision', ''),
('submit', 'Force Build'),
('branch', branch),
diff --git a/rpython/flowspace/test/test_objspace.py
b/rpython/flowspace/test/test_objspace.py
--- a/rpython/flowspace/test/test_objspace.py
+++ b/rpython/flowspace/test/test_objspace.py
@@ -1,5 +1,5 @@
from __future__ import with_statement
-import new
+import types
import py
from contextlib import contextmanager
@@ -943,7 +943,7 @@
def monkey_patch_code(self, code, stacksize, flags, codestring, names,
varnames):
c = code
- return new.code(c.co_argcount, c.co_nlocals, stacksize, flags,
+ return types.CodeType(c.co_argcount, c.co_nlocals, stacksize, flags,
codestring, c.co_consts, names, varnames,
c.co_filename, c.co_name, c.co_firstlineno,
c.co_lnotab)
@@ -964,7 +964,7 @@
# this code is generated by pypy-c when compiling above f
pypy_code =
't\x00\x00\x83\x00\x00}\x00\x00|\x00\x00\xc9\x01\x00\xca\x00\x00S'
new_c = self.monkey_patch_code(f.func_code, 3, 3, pypy_code, ('X',
'x', 'm'), ('x',))
- f2 = new.function(new_c, locals(), 'f')
+ f2 = types.FunctionType(new_c, locals(), 'f')
graph = self.codetest(f2)
all_ops = self.all_operations(graph)
@@ -984,7 +984,7 @@
pypy_code =
'd\x01\x00\xcb\x00\x00D]\x0c\x00}\x00\x00|\x00\x00^\x02\x00q\x07\x00S'
new_c = self.monkey_patch_code(f.func_code, 3, 67, pypy_code, (),
('i',))
- f2 = new.function(new_c, locals(), 'f')
+ f2 = types.FunctionType(new_c, locals(), 'f')
graph = self.codetest(f2)
all_ops = self.all_operations(graph)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -5884,6 +5884,25 @@
"""
self.optimize_loop(ops, expected)
+ def test_bug_unroll_with_immutables(self):
+ ops = """
+ [p0]
+ i2 = getfield_gc_pure(p0, descr=immut_intval)
+ p1 = new_with_vtable(ConstClass(intobj_immut_vtable))
+ setfield_gc(p1, 1242, descr=immut_intval)
+ jump(p1)
+ """
+ preamble = """
+ [p0]
+ i2 = getfield_gc_pure(p0, descr=immut_intval)
+ jump()
+ """
+ expected = """
+ []
+ jump()
+ """
+ self.optimize_loop(ops, expected, preamble)
+
def test_immutable_constantfold_recursive(self):
ops = """
[]
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -180,10 +180,11 @@
self.optimizer.clear_newoperations()
for i in range(len(original_jump_args)):
+ srcbox = jump_args[i]
if values[i].is_virtual():
- values[i].force_box(self.optimizer)
- if original_jump_args[i] is not jump_args[i]:
- op = ResOperation(rop.SAME_AS, [jump_args[i]],
original_jump_args[i])
+ srcbox = values[i].force_box(self.optimizer)
+ if original_jump_args[i] is not srcbox:
+ op = ResOperation(rop.SAME_AS, [srcbox], original_jump_args[i])
self.optimizer.emit_operation(op)
inputarg_setup_ops = self.optimizer.get_newoperations()
diff --git a/rpython/rlib/parsing/lexer.py b/rpython/rlib/parsing/lexer.py
--- a/rpython/rlib/parsing/lexer.py
+++ b/rpython/rlib/parsing/lexer.py
@@ -107,7 +107,7 @@
self.matcher = matcher
self.lineno = 0
self.columnno = 0
-
+
def find_next_token(self):
while 1:
self.state = 0
@@ -126,8 +126,8 @@
i = ~i
stop = self.last_matched_index + 1
assert stop >= 0
- if start == stop:
- source_pos = SourcePos(i - 1, self.lineno, self.columnno)
+ if start == stop:
+ source_pos = self.token_position_class(i - 1, self.lineno,
self.columnno)
raise deterministic.LexerError(self.text, self.state,
source_pos)
source = self.text[start:stop]
@@ -147,7 +147,7 @@
else:
raise StopIteration
return result
- source_pos = SourcePos(i - 1, self.lineno, self.columnno)
+ source_pos = self.token_position_class(i - 1, self.lineno,
self.columnno)
raise deterministic.LexerError(self.text, self.state, source_pos)
def adjust_position(self, token):
@@ -158,7 +158,7 @@
self.columnno += len(token)
else:
self.columnno = token.rfind("\n")
-
+
# def inner_loop(self, i):
# while i < len(self.text):
# char = self.text[i]
@@ -186,10 +186,15 @@
class LexingDFARunner(AbstractLexingDFARunner):
def __init__(self, matcher, automaton, text, ignore, eof=False,
token_class=None):
- if token_class is None:
+
+ if not token_class:
self.token_class = Token
+ self.token_position_class = SourcePos
+
else:
self.token_class = token_class
+ self.token_position_class = token_class.source_position_class
+
AbstractLexingDFARunner.__init__(self, matcher, automaton, text, eof)
self.ignore = ignore
@@ -198,8 +203,10 @@
def make_token(self, index, state, text, eof=False):
assert (eof and state == -1) or 0 <= state < len(self.automaton.names)
- source_pos = SourcePos(index, self.lineno, self.columnno)
+
+ source_pos = self.token_position_class(index, self.lineno,
self.columnno)
if eof:
return self.token_class("EOF", "EOF", source_pos)
+
return self.token_class(self.automaton.names[self.last_matched_state],
text, source_pos)
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -1146,9 +1146,9 @@
address_to_fill=None):
# port_or_service is a string, not an int (but try str(port_number)).
assert port_or_service is None or isinstance(port_or_service, str)
- if _c._MACOSX:
- if port_or_service is None or port_or_service == '0':
- port_or_service = '00'
+ if _c._MACOSX and flags & AI_NUMERICSERV and \
+ (port_or_service is None or port_or_service == '0'):
+ port_or_service = '00'
hints = lltype.malloc(_c.addrinfo, flavor='raw', zero=True)
rffi.setintfield(hints, 'c_ai_family', family)
rffi.setintfield(hints, 'c_ai_socktype', socktype)
diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py
--- a/rpython/rlib/streamio.py
+++ b/rpython/rlib/streamio.py
@@ -40,7 +40,7 @@
from rpython.rlib import rposix
from rpython.rlib.rstring import StringBuilder
-from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC
+from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND
O_BINARY = getattr(os, "O_BINARY", 0)
# (basemode, plus)
@@ -48,8 +48,8 @@
('r', True): O_RDWR,
('w', False): O_WRONLY | O_CREAT | O_TRUNC,
('w', True): O_RDWR | O_CREAT | O_TRUNC,
- ('a', False): O_WRONLY | O_CREAT,
- ('a', True): O_RDWR | O_CREAT,
+ ('a', False): O_WRONLY | O_CREAT | O_APPEND,
+ ('a', True): O_RDWR | O_CREAT | O_APPEND,
}
class MyNotImplementedError(Exception):
diff --git a/rpython/rlib/test/test_streamio.py
b/rpython/rlib/test/test_streamio.py
--- a/rpython/rlib/test/test_streamio.py
+++ b/rpython/rlib/test/test_streamio.py
@@ -1104,6 +1104,21 @@
finally:
signal(SIGALRM, SIG_DFL)
+ def test_append_mode(self):
+ tfn = str(udir.join('streamio-append-mode'))
+ fo = streamio.open_file_as_stream # shorthand
+ x = fo(tfn, 'w')
+ x.write('abc123')
+ x.close()
+
+ x = fo(tfn, 'a')
+ x.seek(0, 0)
+ x.write('456')
+ x.close()
+ x = fo(tfn, 'r')
+ assert x.read() == 'abc123456'
+ x.close()
+
# Speed test
diff --git a/rpython/tool/identity_dict.py b/rpython/tool/identity_dict.py
--- a/rpython/tool/identity_dict.py
+++ b/rpython/tool/identity_dict.py
@@ -3,15 +3,15 @@
except ImportError:
idict = None
-from UserDict import DictMixin
+from collections import MutableMapping
-class IdentityDictPurePython(object, DictMixin):
+class IdentityDictPurePython(MutableMapping):
__slots__ = "_dict _keys".split()
def __init__(self):
self._dict = {}
- self._keys = {} # id(obj) -> obj
+ self._keys = {} # id(obj) -> obj
def __getitem__(self, arg):
return self._dict[id(arg)]
@@ -24,8 +24,11 @@
del self._keys[id(arg)]
del self._dict[id(arg)]
- def keys(self):
- return self._keys.values()
+ def __iter__(self):
+ return self._keys.itervalues()
+
+ def __len__(self):
+ return len(self._keys)
def __contains__(self, arg):
return id(arg) in self._dict
@@ -37,8 +40,7 @@
return d
-class IdentityDictPyPy(object, DictMixin):
- __slots__ = ["_dict"]
+class IdentityDictPyPy(MutableMapping):
def __init__(self):
self._dict = idict()
@@ -52,8 +54,11 @@
def __delitem__(self, arg):
del self._dict[arg]
- def keys(self):
- return self._dict.keys()
+ def __iter__(self):
+ return iter(self._dict.keys())
+
+ def __len__(self):
+ return len(self._dict)
def __contains__(self, arg):
return arg in self._dict
@@ -64,8 +69,10 @@
assert len(d) == len(self)
return d
+ def __nonzero__(self):
+ return bool(self._dict)
+
if idict is None:
identity_dict = IdentityDictPurePython
else:
identity_dict = IdentityDictPyPy
-
diff --git a/rpython/tool/sourcetools.py b/rpython/tool/sourcetools.py
--- a/rpython/tool/sourcetools.py
+++ b/rpython/tool/sourcetools.py
@@ -6,7 +6,7 @@
# XXX We should try to generalize and single out one approach to dynamic
# XXX code compilation.
-import sys, os, inspect, new
+import sys, os, inspect, types
import py
def render_docstr(func, indent_str='', closing_str=''):
@@ -127,7 +127,7 @@
for name in names:
if name not in kwargs:
kwargs[name] = getattr(fromcode, name)
- return new.code(
+ return types.CodeType(
kwargs['co_argcount'],
kwargs['co_nlocals'],
kwargs['co_stacksize'],
@@ -218,9 +218,8 @@
"""Make a renamed copy of a function."""
if globals is None:
globals = func.func_globals
- f = new.function(func.func_code, globals,
- newname, func.func_defaults,
- func.func_closure)
+ f = types.FunctionType(func.func_code, globals, newname,
+ func.func_defaults, func.func_closure)
if func.func_dict:
f.func_dict = {}
f.func_dict.update(func.func_dict)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit