Author: Brian Kearns <[email protected]>
Branch: stdlib-2.7.4
Changeset: r60750:5b8631b71974
Date: 2013-01-31 01:42 -0500
http://bitbucket.org/pypy/pypy/changeset/5b8631b71974/
Log: merge default
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
@@ -27,10 +27,10 @@
'data' : '{base}',
},
'pypy': {
- 'stdlib': '{base}/lib-python',
- 'platstdlib': '{base}/lib-python',
- 'purelib': '{base}/lib-python',
- 'platlib': '{base}/lib-python',
+ '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}',
'include': '{base}/include',
'platinclude': '{base}/include',
'scripts': '{base}/bin',
diff --git a/lib-python/2.7/test/test_capi.py b/lib-python/2.7/test/test_capi.py
--- a/lib-python/2.7/test/test_capi.py
+++ b/lib-python/2.7/test/test_capi.py
@@ -19,9 +19,6 @@
'test_broken_memoryview',
'test_capsule',
'test_lazy_hash_inheritance',
- 'test_long_api',
- 'test_longlong_api',
- 'test_null_strings',
'test_widechar',
'TestThreadState',
'TestPendingCalls',
diff --git a/pypy/bin/checkmodule.py b/pypy/bin/checkmodule.py
--- a/pypy/bin/checkmodule.py
+++ b/pypy/bin/checkmodule.py
@@ -8,6 +8,8 @@
"""
import sys, os
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
+
from pypy.objspace.fake.checkmodule import checkmodule
def main(argv):
diff --git a/pypy/doc/cpython_differences.rst b/pypy/doc/cpython_differences.rst
--- a/pypy/doc/cpython_differences.rst
+++ b/pypy/doc/cpython_differences.rst
@@ -318,10 +318,5 @@
type and vice versa. For builtin types, a dictionary will be returned that
cannot be changed (but still looks and behaves like a normal dictionary).
-* the ``__len__`` or ``__length_hint__`` special methods are sometimes
- called by CPython to get a length estimate to preallocate internal arrays.
- So far, PyPy never calls ``__len__`` for this purpose, and never calls
- ``__length_hint__`` at all.
-
.. include:: _ref.txt
diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -153,41 +153,49 @@
self.readable, self.writable, append, flags = decode_mode(space, mode)
- if fd >= 0:
- verify_fd(fd)
- try:
- os.fstat(fd)
- except OSError, e:
- if e.errno == errno.EBADF:
- raise wrap_oserror(space, e)
- # else: pass
- self.fd = fd
- self.closefd = bool(closefd)
- else:
- if not closefd:
- raise OperationError(space.w_ValueError, space.wrap(
- "Cannot use closefd=False with file name"))
- self.closefd = True
+ fd_is_own = False
+ try:
+ if fd >= 0:
+ verify_fd(fd)
+ try:
+ os.fstat(fd)
+ except OSError, e:
+ if e.errno == errno.EBADF:
+ raise wrap_oserror(space, e)
+ # else: pass
+ self.fd = fd
+ self.closefd = bool(closefd)
+ else:
+ self.closefd = True
+ if not closefd:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "Cannot use closefd=False with file name"))
- from pypy.module.posix.interp_posix import (
- dispatch_filename, rposix)
- try:
- self.fd = dispatch_filename(rposix.open)(
- space, w_name, flags, 0666)
- except OSError, e:
- raise wrap_oserror2(space, e, w_name,
- exception_name='w_IOError')
+ from pypy.module.posix.interp_posix import (
+ dispatch_filename, rposix)
+ try:
+ self.fd = dispatch_filename(rposix.open)(
+ space, w_name, flags, 0666)
+ except OSError, e:
+ raise wrap_oserror2(space, e, w_name,
+ exception_name='w_IOError')
+ finally:
+ fd_is_own = True
self._dircheck(space, w_name)
- self.w_name = w_name
+ self.w_name = w_name
- if append:
- # For consistent behaviour, we explicitly seek to the end of file
- # (otherwise, it might be done only on the first write()).
- try:
- os.lseek(self.fd, 0, os.SEEK_END)
- except OSError, e:
- raise wrap_oserror(space, e, exception_name='w_IOError')
+ if append:
+ # For consistent behaviour, we explicitly seek to the end of
file
+ # (otherwise, it might be done only on the first write()).
+ try:
+ os.lseek(self.fd, 0, os.SEEK_END)
+ except OSError, e:
+ raise wrap_oserror(space, e, exception_name='w_IOError')
+ except:
+ if not fd_is_own:
+ self.fd = -1
+ raise
def _mode(self):
if self.readable:
@@ -253,7 +261,6 @@
except OSError:
return
if stat.S_ISDIR(st.st_mode):
- self._close(space)
raise wrap_oserror2(space, OSError(errno.EISDIR, "fstat"),
w_filename, exception_name='w_IOError')
diff --git a/pypy/module/_io/test/test_fileio.py
b/pypy/module/_io/test/test_fileio.py
--- a/pypy/module/_io/test/test_fileio.py
+++ b/pypy/module/_io/test/test_fileio.py
@@ -41,7 +41,11 @@
def test_open_directory(self):
import _io
+ import os
raises(IOError, _io.FileIO, self.tmpdir, "rb")
+ fd = os.open(self.tmpdir, os.O_RDONLY)
+ raises(IOError, _io.FileIO, fd, "rb")
+ os.close(fd)
def test_readline(self):
import _io
diff --git a/pypy/module/cpyext/longobject.py b/pypy/module/cpyext/longobject.py
--- a/pypy/module/cpyext/longobject.py
+++ b/pypy/module/cpyext/longobject.py
@@ -47,7 +47,12 @@
Return a C unsigned long representation of the contents of pylong.
If pylong is greater than ULONG_MAX, an OverflowError is
raised."""
- return rffi.cast(rffi.ULONG, space.uint_w(w_long))
+ try:
+ return rffi.cast(rffi.ULONG, space.uint_w(w_long))
+ except OperationError, e:
+ if e.match(space, space.w_ValueError):
+ e.w_type = space.w_OverflowError
+ raise
@cpython_api([PyObject], rffi.ULONG, error=-1)
def PyLong_AsUnsignedLongMask(space, w_long):
@@ -86,7 +91,12 @@
Return a C unsigned long representation of the contents of pylong.
If pylong is greater than ULONG_MAX, an OverflowError is
raised."""
- return rffi.cast(rffi.ULONGLONG, space.r_ulonglong_w(w_long))
+ try:
+ return rffi.cast(rffi.ULONGLONG, space.r_ulonglong_w(w_long))
+ except OperationError, e:
+ if e.match(space, space.w_ValueError):
+ e.w_type = space.w_OverflowError
+ raise
@cpython_api([PyObject], rffi.ULONGLONG, error=-1)
def PyLong_AsUnsignedLongLongMask(space, w_long):
diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py
--- a/pypy/module/cpyext/object.py
+++ b/pypy/module/cpyext/object.py
@@ -218,6 +218,8 @@
@cpython_api([PyObject], PyObject)
def PyObject_Str(space, w_obj):
+ if w_obj is None:
+ return space.wrap("<NULL>")
return space.str(w_obj)
@cpython_api([PyObject], PyObject)
@@ -226,6 +228,8 @@
representation on success, NULL on failure. This is the equivalent of the
Python expression repr(o). Called by the repr() built-in function and
by reverse quotes."""
+ if w_obj is None:
+ return space.wrap("<NULL>")
return space.repr(w_obj)
@cpython_api([PyObject], PyObject)
@@ -234,6 +238,8 @@
string representation on success, NULL on failure. This is the equivalent
of
the Python expression unicode(o). Called by the unicode() built-in
function."""
+ if w_obj is None:
+ return space.wrap(u"<NULL>")
return space.call_function(space.w_unicode, w_obj)
@cpython_api([PyObject, PyObject], rffi.INT_real, error=-1)
diff --git a/pypy/module/cpyext/test/test_longobject.py
b/pypy/module/cpyext/test/test_longobject.py
--- a/pypy/module/cpyext/test/test_longobject.py
+++ b/pypy/module/cpyext/test/test_longobject.py
@@ -31,6 +31,8 @@
value = api.PyLong_AsUnsignedLong(w_value)
assert value == (sys.maxint - 1) * 2
+ self.raises(space, api, OverflowError, api.PyLong_AsUnsignedLong,
space.wrap(-1))
+
def test_as_ssize_t(self, space, api):
w_value = space.newlong(2)
value = api.PyLong_AsSsize_t(w_value)
@@ -46,11 +48,11 @@
w_l = space.wrap(sys.maxint + 1)
assert api.PyLong_Check(w_l)
assert api.PyLong_CheckExact(w_l)
-
+
w_i = space.wrap(sys.maxint)
assert not api.PyLong_Check(w_i)
assert not api.PyLong_CheckExact(w_i)
-
+
L = space.appexec([], """():
class L(long):
pass
@@ -73,6 +75,8 @@
assert api.PyLong_AsUnsignedLongLongMask(
space.wrap(1<<64)) == 0
+ self.raises(space, api, OverflowError, api.PyLong_AsUnsignedLongLong,
space.wrap(-1))
+
def test_as_long_and_overflow(self, space, api):
overflow = lltype.malloc(rffi.CArrayPtr(rffi.INT_real).TO, 1,
flavor='raw')
assert api.PyLong_AsLongAndOverflow(
diff --git a/pypy/module/cpyext/test/test_object.py
b/pypy/module/cpyext/test/test_object.py
--- a/pypy/module/cpyext/test/test_object.py
+++ b/pypy/module/cpyext/test/test_object.py
@@ -94,27 +94,30 @@
def test_size(self, space, api):
assert api.PyObject_Size(space.newlist([space.w_None])) == 1
-
+
+ def test_str(self, space, api):
+ w_list = space.newlist([space.w_None, space.wrap(42)])
+ assert space.str_w(api.PyObject_Str(None)) == "<NULL>"
+ assert space.str_w(api.PyObject_Str(w_list)) == "[None, 42]"
+ assert space.str_w(api.PyObject_Str(space.wrap("a"))) == "a"
+
def test_repr(self, space, api):
w_list = space.newlist([space.w_None, space.wrap(42)])
+ assert space.str_w(api.PyObject_Repr(None)) == "<NULL>"
assert space.str_w(api.PyObject_Repr(w_list)) == "[None, 42]"
assert space.str_w(api.PyObject_Repr(space.wrap("a"))) == "'a'"
-
- w_list = space.newlist([space.w_None, space.wrap(42)])
- assert space.str_w(api.PyObject_Str(w_list)) == "[None, 42]"
- assert space.str_w(api.PyObject_Str(space.wrap("a"))) == "a"
-
+
def test_RichCompare(self, space, api):
def compare(w_o1, w_o2, opid):
res = api.PyObject_RichCompareBool(w_o1, w_o2, opid)
w_res = api.PyObject_RichCompare(w_o1, w_o2, opid)
assert space.is_true(w_res) == res
return res
-
+
def test_compare(o1, o2):
w_o1 = space.wrap(o1)
w_o2 = space.wrap(o2)
-
+
for opid, expected in [
(Py_LT, o1 < o2), (Py_LE, o1 <= o2),
(Py_NE, o1 != o2), (Py_EQ, o1 == o2),
@@ -190,6 +193,7 @@
api.PyErr_Clear()
def test_unicode(self, space, api):
+ assert space.unwrap(api.PyObject_Unicode(None)) == u"<NULL>"
assert space.unwrap(api.PyObject_Unicode(space.wrap([]))) == u"[]"
assert space.unwrap(api.PyObject_Unicode(space.wrap("e"))) == u"e"
assert api.PyObject_Unicode(space.wrap("\xe9")) is None
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit