[pypy-commit] pypy py3k: hg merge py3k
Manuel Jacob
noreply at buildbot.pypy.org
Thu Feb 21 00:37:19 CET 2013
Author: Manuel Jacob
Branch: py3k
Changeset: r61510:2383a5b7c9b3
Date: 2013-02-21 00:35 +0100
http://bitbucket.org/pypy/pypy/changeset/2383a5b7c9b3/
Log: hg merge py3k
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -35,7 +35,7 @@
"thread", "itertools", "pyexpat", "_ssl", "cpyext", "array",
"_bisect", "binascii", "_multiprocessing", '_warnings',
"_collections", "_multibytecodec", "_ffi",
- "_continuation", "_csv", # "micronumpy", "_cffi_backend",
+ "_continuation", "_csv", "_cffi_backend", # "micronumpy",
"_posixsubprocess",
]
))
diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -164,26 +164,19 @@
#
# In the following table, 'Class' means a subclass of BaseException
# and 'inst' is an instance of either 'Class' or a subclass of it.
- # Or 'Class' can also be an old-style class and 'inst' an old-style
- # instance of it.
#
- # The flow object space only deals with non-advanced case. Old-style
- # classes and instances *are* advanced.
+ # The flow object space only deals with non-advanced case.
#
# input (w_type, w_value)... becomes... advanced case?
# ---------------------------------------------------------------------
- # (tuple, w_value) (tuple[0], w_value) yes
# (Class, None) (Class, Class()) no
# (Class, inst) (inst.__class__, inst) no
# (Class, tuple) (Class, Class(*tuple)) yes
# (Class, x) (Class, Class(x)) no
- # ("string", ...) ("string", ...) deprecated
# (inst, None) (inst.__class__, inst) no
#
w_type = self.w_type
w_value = self.get_w_value(space)
- while space.is_true(space.isinstance(w_type, space.w_tuple)):
- w_type = space.getitem(w_type, space.wrap(0))
if space.exception_is_valid_obj_as_class_w(w_type):
# this is for all cases of the form (Class, something)
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1161,7 +1161,7 @@
"""Raised when exiting a frame via a 'yield' statement."""
class RaiseWithExplicitTraceback(Exception):
- """Raised at interp-level by a 0- or 3-arguments 'raise' statement."""
+ """Raised at interp-level by a 0-argument 'raise' statement."""
def __init__(self, operr):
self.operr = operr
diff --git a/pypy/module/_cffi_backend/ctypeptr.py b/pypy/module/_cffi_backend/ctypeptr.py
--- a/pypy/module/_cffi_backend/ctypeptr.py
+++ b/pypy/module/_cffi_backend/ctypeptr.py
@@ -2,6 +2,8 @@
Pointers.
"""
+import os
+
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.error import wrap_oserror
from rpython.rtyper.lltypesystem import lltype, rffi
@@ -247,11 +249,10 @@
return W_CTypePtrBase.cast(self, w_ob)
def prepare_file(self, w_ob):
- from pypy.module._file.interp_file import W_File
- from pypy.module._cffi_backend import ctypefunc
+ from pypy.module._io.interp_iobase import W_IOBase
ob = self.space.interpclass_w(w_ob)
- if isinstance(ob, W_File):
- return prepare_file_argument(self.space, ob)
+ if isinstance(ob, W_IOBase):
+ return prepare_iofile_argument(self.space, w_ob)
else:
return lltype.nullptr(rffi.CCHARP.TO)
@@ -350,15 +351,21 @@
def close(self):
rffi_fclose(self.llf)
-def prepare_file_argument(space, fileobj):
- fileobj.direct_flush()
+def prepare_iofile_argument(space, w_fileobj):
+ fileobj = space.interpclass_w(w_fileobj)
+ from pypy.module._io.interp_iobase import W_IOBase
+ assert isinstance(fileobj, W_IOBase)
+ space.call_method(w_fileobj, "flush")
if fileobj.cffi_fileobj is None:
- fd = fileobj.direct_fileno()
+ fd = space.int_w(space.call_method(w_fileobj, "fileno"))
if fd < 0:
raise OperationError(space.w_ValueError,
space.wrap("file has no OS file descriptor"))
+ fd = os.dup(fd)
+ mode = space.str_w(space.getattr(w_fileobj, space.wrap("mode")))
try:
- fileobj.cffi_fileobj = CffiFileObj(fd, fileobj.mode)
+ fileobj.cffi_fileobj = CffiFileObj(fd, mode)
except OSError, e:
raise wrap_oserror(space, e)
return fileobj.cffi_fileobj.llf
+
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -2480,13 +2480,13 @@
assert len(p) == 4
assert list(p) == [b"f", b"o", b"o", b"\x00"]
-# XXX hack
-if sys.version_info >= (3,):
- try:
- import posix, io
- posix.fdopen = io.open
- except ImportError:
- pass # win32
+import io
+fdopen_funcs = [io.open]
+try:
+ import posix
+ fdopen_funcs.append(posix.fdopen)
+except (ImportError, AttributeError): # win32, or py3k
+ pass
def test_FILE():
if sys.platform == "win32":
@@ -2503,22 +2503,22 @@
fputs = ll.load_function(BFunc, "fputs")
fscanf = ll.load_function(BFunc2, "fscanf")
#
- import posix
- fdr, fdw = posix.pipe()
- fr1 = posix.fdopen(fdr, 'rb', 256)
- fw1 = posix.fdopen(fdw, 'wb', 256)
- #
- fw1.write(b"X")
- res = fputs(b"hello world\n", fw1)
- assert res >= 0
- fw1.flush() # should not be needed
- #
- p = newp(new_array_type(BCharP, 100), None)
- res = fscanf(fr1, b"%s\n", p)
- assert res == 1
- assert string(p) == b"Xhello"
- fr1.close()
- fw1.close()
+ for fdopen in fdopen_funcs:
+ fdr, fdw = posix.pipe()
+ fr1 = fdopen(fdr, 'rb', 256)
+ fw1 = fdopen(fdw, 'wb', 256)
+ #
+ fw1.write(b"X")
+ res = fputs(b"hello world\n", fw1)
+ assert res >= 0
+ fw1.flush() # should not be needed
+ #
+ p = newp(new_array_type(BCharP, 100), None)
+ res = fscanf(fr1, b"%s\n", p)
+ assert res == 1
+ assert string(p) == b"Xhello"
+ fr1.close()
+ fw1.close()
def test_FILE_only_for_FILE_arg():
if sys.platform == "win32":
@@ -2533,15 +2533,15 @@
ll = find_and_load_library('c')
fputs = ll.load_function(BFunc, "fputs")
#
- import posix
- fdr, fdw = posix.pipe()
- fr1 = posix.fdopen(fdr, 'r')
- fw1 = posix.fdopen(fdw, 'w')
- #
- e = py.test.raises(TypeError, fputs, b"hello world\n", fw1)
- assert str(e.value).startswith(
- "initializer for ctype 'struct NOT_FILE *' must "
- "be a cdata pointer, not ")
+ for fdopen in fdopen_funcs:
+ fdr, fdw = posix.pipe()
+ fr1 = fdopen(fdr, 'r')
+ fw1 = fdopen(fdw, 'w')
+ #
+ e = py.test.raises(TypeError, fputs, b"hello world\n", fw1)
+ assert str(e.value).startswith(
+ "initializer for ctype 'struct NOT_FILE *' must "
+ "be a cdata pointer, not ")
def test_FILE_object():
if sys.platform == "win32":
@@ -2558,22 +2558,23 @@
fputs = ll.load_function(BFunc, "fputs")
fileno = ll.load_function(BFunc2, "fileno")
#
- import posix
- fdr, fdw = posix.pipe()
- fw1 = posix.fdopen(fdw, 'wb', 256)
- #
- fw1p = cast(BFILEP, fw1)
- fw1.write(b"X")
- fw1.flush()
- res = fputs(b"hello\n", fw1p)
- assert res >= 0
- res = fileno(fw1p)
- assert (res == fdw) == (sys.version_info < (3,))
- fw1.close()
- #
- data = posix.read(fdr, 256)
- assert data == b"Xhello\n"
- posix.close(fdr)
+ for fdopen in fdopen_funcs:
+ fdr, fdw = posix.pipe()
+ fw1 = fdopen(fdw, 'wb', 256)
+ #
+ fw1p = cast(BFILEP, fw1)
+ fw1.write(b"X")
+ fw1.flush()
+ res = fputs(b"hello\n", fw1p)
+ assert res >= 0
+ res = fileno(fw1p)
+ if fdopen is not io.open and 'PY_DOT_PY' not in globals():
+ assert res == fdw
+ fw1.close()
+ #
+ data = posix.read(fdr, 256)
+ assert data == b"Xhello\n"
+ posix.close(fdr)
def test_GetLastError():
if sys.platform != "win32":
diff --git a/pypy/module/_cffi_backend/test/test_c.py b/pypy/module/_cffi_backend/test/test_c.py
--- a/pypy/module/_cffi_backend/test/test_c.py
+++ b/pypy/module/_cffi_backend/test/test_c.py
@@ -36,47 +36,60 @@
testfuncs_w = []
keepalive_funcs = []
- def find_and_load_library_for_test(space, w_name, w_is_global=None):
- if w_is_global is None:
- w_is_global = space.wrap(0)
- if space.is_w(w_name, space.w_None):
- path = None
- else:
- import ctypes.util
- path = ctypes.util.find_library(space.str_w(w_name))
- return space.appexec([space.wrap(path), w_is_global],
- """(path, is_global):
- import _cffi_backend
- return _cffi_backend.load_library(path, is_global)""")
-
test_lib_c = tmpdir.join('_test_lib.c')
src_test_lib_c = py.path.local(__file__).dirpath().join('_test_lib.c')
src_test_lib_c.copy(test_lib_c)
eci = ExternalCompilationInfo()
- test_lib = host.compile([test_lib_c], eci, standalone=False)
+ test_lib = str(host.compile([test_lib_c], eci, standalone=False))
- cdll = ctypes.CDLL(str(test_lib))
+ cdll = ctypes.CDLL(test_lib)
cdll.gettestfunc.restype = ctypes.c_void_p
- def testfunc_for_test(space, w_num):
- if hasattr(space, 'int_w'):
- w_num = space.int_w(w_num)
- addr = cdll.gettestfunc(w_num)
- return space.wrap(addr)
-
space = cls.space
if cls.runappdirect:
- def interp2app(func):
- def run(*args):
- return func(space, *args)
- return run
+ def find_and_load_library_for_test(name, is_global=False):
+ if name is None:
+ path = None
+ else:
+ import ctypes.util
+ path = ctypes.util.find_library(name)
+ import _cffi_backend
+ return _cffi_backend.load_library(path, is_global)
+
+ def w_testfunc_for_test(num):
+ import ctypes
+ cdll = ctypes.CDLL(str(self.test_lib))
+ cdll.gettestfunc.restype = ctypes.c_void_p
+ return cdll.gettestfunc(num)
+
+ cls.w_test_lib = space.wrap(test_lib)
+ cls.w_func = find_and_load_library_for_test
+ cls.w_testfunc = w_testfunc_for_test
else:
- interp2app = gateway.interp2app
+ def find_and_load_library_for_test(space, w_name, w_is_global=None):
+ if w_is_global is None:
+ w_is_global = space.wrap(0)
+ if space.is_w(w_name, space.w_None):
+ path = None
+ else:
+ import ctypes.util
+ path = ctypes.util.find_library(space.str_w(w_name))
+ return space.appexec([space.wrap(path), w_is_global],
+ """(path, is_global):
+ import _cffi_backend
+ return _cffi_backend.load_library(path, is_global)""")
- w_func = space.wrap(interp2app(find_and_load_library_for_test))
- w_testfunc = space.wrap(interp2app(testfunc_for_test))
- space.appexec([space.wrap(str(tmpdir)), w_func, w_testfunc,
- space.wrap(sys.version[:3])],
+ def testfunc_for_test(space, w_num):
+ if hasattr(space, 'int_w'):
+ w_num = space.int_w(w_num)
+ addr = cdll.gettestfunc(w_num)
+ return space.wrap(addr)
+
+ cls.w_func = space.wrap(gateway.interp2app(find_and_load_library_for_test))
+ cls.w_testfunc = space.wrap(gateway.interp2app(testfunc_for_test))
+ cls.w_zz_init = space.appexec(
+ [space.wrap(str(tmpdir)), cls.w_func, cls.w_testfunc,
+ space.wrap(sys.version[:3])],
"""(path, func, testfunc, underlying_version):
import sys
sys.path.append(path)
diff --git a/pypy/module/_cffi_backend/test/test_ztranslation.py b/pypy/module/_cffi_backend/test/test_ztranslation.py
--- a/pypy/module/_cffi_backend/test/test_ztranslation.py
+++ b/pypy/module/_cffi_backend/test/test_ztranslation.py
@@ -6,15 +6,15 @@
from pypy.module._cffi_backend import misc
def test_checkmodule():
- # prepare_file_argument() is not working without translating the _file
- # module too
- def dummy_prepare_file_argument(space, fileobj):
+ # W_CTypePointer.prepare_file() is not working without translating
+ # the _io module too
+ def dummy_prepare_file(self, w_ob):
return lltype.nullptr(rffi.CCHARP.TO)
- old = ctypeptr.prepare_file_argument
+ old = ctypeptr.W_CTypePointer.prepare_file
try:
- ctypeptr.prepare_file_argument = dummy_prepare_file_argument
+ ctypeptr.W_CTypePointer.prepare_file = dummy_prepare_file
#
checkmodule('_cffi_backend')
#
finally:
- ctypeptr.prepare_file_argument = old
+ ctypeptr.W_CTypePointer.prepare_file = old
diff --git a/pypy/module/_io/interp_iobase.py b/pypy/module/_io/interp_iobase.py
--- a/pypy/module/_io/interp_iobase.py
+++ b/pypy/module/_io/interp_iobase.py
@@ -37,6 +37,8 @@
raise unsupported(space, "File or stream is not seekable")
class W_IOBase(Wrappable):
+ cffi_fileobj = None # pypy/module/_cffi_backend
+
def __init__(self, space):
# XXX: IOBase thinks it has to maintain its own internal state in
# `__IOBase_closed` and call flush() by itself, but it is redundant
@@ -106,6 +108,12 @@
def close_w(self, space):
if self._CLOSED():
return
+
+ cffifo = self.cffi_fileobj
+ self.cffi_fileobj = None
+ if cffifo is not None:
+ cffifo.close()
+
try:
space.call_method(self, "flush")
finally:
diff --git a/pypy/module/_socket/interp_func.py b/pypy/module/_socket/interp_func.py
--- a/pypy/module/_socket/interp_func.py
+++ b/pypy/module/_socket/interp_func.py
@@ -1,5 +1,6 @@
from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
-from pypy.module._socket.interp_socket import converted_error, W_RSocket, addr_as_object, ipaddr_from_object
+from pypy.module._socket.interp_socket import (
+ converted_error, W_RSocket, addr_as_object, ipaddr_from_object, get_error)
from rpython.rlib import rsocket
from rpython.rlib.rsocket import SocketError, INVALID_SOCKET
from pypy.interpreter.error import OperationError
@@ -120,7 +121,17 @@
Get host and port for a sockaddr."""
try:
- addr = ipaddr_from_object(space, w_sockaddr)
+ w_host, w_port = space.fixedview(w_sockaddr, 2)
+ host = space.str_w(w_host)
+ port = str(space.int_w(w_port))
+ lst = rsocket.getaddrinfo(host, port, rsocket.AF_UNSPEC,
+ rsocket.SOCK_DGRAM, 0,
+ rsocket.AI_NUMERICHOST)
+ if len(lst) > 1:
+ raise OperationError(
+ get_error(space, 'error'),
+ space.wrap("sockaddr resolved to multiple addresses"))
+ addr = lst[0][4]
host, servport = rsocket.getnameinfo(addr, flags)
except SocketError, e:
raise converted_error(space, e)
diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py
--- a/pypy/module/_socket/interp_socket.py
+++ b/pypy/module/_socket/interp_socket.py
@@ -158,6 +158,16 @@
except SocketError, e:
raise converted_error(space, e)
+ def __del__(self):
+ self.clear_all_weakrefs()
+ if self.space:
+ self.enqueue_for_destruction(self.space, W_RSocket.destructor,
+ 'internal __del__ of ')
+
+ def destructor(self):
+ assert isinstance(self, W_RSocket)
+ RSocket.__del__(self)
+
def _dealloc_warn(self):
space = self.space
if not space:
diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py
--- a/pypy/module/_socket/test/test_sock_app.py
+++ b/pypy/module/_socket/test/test_sock_app.py
@@ -262,12 +262,18 @@
])))
def test_getnameinfo():
+ from pypy.module._socket.interp_socket import get_error
host = "127.0.0.1"
port = 25
info = socket.getnameinfo((host, port), 0)
w_l = space.appexec([w_socket, space.wrap(host), space.wrap(port)],
"(_socket, host, port): return _socket.getnameinfo((host, port), 0)")
assert space.unwrap(w_l) == info
+ sockaddr = space.newtuple([space.wrap('mail.python.org'), space.wrap(0)])
+ space.raises_w(get_error(space, 'error'), space.appexec,
+ [w_socket, sockaddr, space.wrap(0)],
+ "(_socket, sockaddr, flags): return _socket.getnameinfo(sockaddr, flags)")
+
def test_timeout():
space.appexec([w_socket, space.wrap(25.4)],
diff --git a/pypy/tool/pytest/apptest.py b/pypy/tool/pytest/apptest.py
--- a/pypy/tool/pytest/apptest.py
+++ b/pypy/tool/pytest/apptest.py
@@ -24,6 +24,35 @@
self.excinfo = excinfo
+def py3k_repr(value):
+ "return the repr() that py3k would give for an object."""
+ if isinstance(value, str):
+ # python2 string -> Bytes string
+ return "b" + repr(value)
+ elif isinstance(value, unicode):
+ # python2 unicode -> python3 string
+ return repr(value)[1:]
+ elif isinstance(value, list):
+ return '[' + ', '.join(py3k_repr(item) for item in value) + ']'
+ elif isinstance(value, tuple):
+ return '(' + ', '.join(py3k_repr(item) for item in value) + ',)'
+ elif isinstance(value, dict):
+ return '{' + ', '.join('%s: %s' % (py3k_repr(key), py3k_repr(value))
+ for key, value in value.items()) + '}'
+ elif isinstance(value, long):
+ return repr(value)[:-1]
+ elif isinstance(value, float):
+ r = repr(value)
+ if r in ('nan', 'inf', '-inf'):
+ return "float(%r)" % r
+ else:
+ return r
+ elif isinstance(value, type):
+ return type.__name__
+ else:
+ return repr(value)
+
+
def run_with_python(python_, target_, **definitions):
if python_ is None:
py.test.skip("Cannot find the default python3 interpreter to run with -A")
@@ -36,6 +65,8 @@
def skip(message):
print(message)
raise SystemExit(0)
+ __builtins__.skip = skip
+ __builtins__.py3k_skip = skip
class ExceptionWrapper:
pass
def raises(exc, func, *args, **kwargs):
@@ -55,24 +86,25 @@
return res
else:
raise AssertionError("DID NOT RAISE")
+ __builtins__.raises = raises
class Test:
pass
self = Test()
"""
defs = []
- for symbol, value in definitions.items():
+ for symbol, value in sorted(definitions.items()):
if isinstance(value, tuple) and isinstance(value[0], py.code.Source):
code, args = value
defs.append(str(code))
arg_repr = []
for arg in args:
- if isinstance(arg, str):
- arg_repr.append("b%r" % arg)
- elif isinstance(arg, unicode):
- arg_repr.append(repr(arg)[1:])
+ if isinstance(arg, types.FunctionType):
+ arg_repr.append(arg.__name__)
+ elif isinstance(arg, types.MethodType):
+ arg_repr.append(arg.__name__)
else:
- arg_repr.append(repr(arg))
- args = ','.join(arg_repr)
+ arg_repr.append(py3k_repr(arg))
+ args = ', '.join(arg_repr)
defs.append("self.%s = anonymous(%s)\n" % (symbol, args))
elif isinstance(value, types.MethodType):
# "def w_method(self)"
@@ -82,26 +114,24 @@
elif isinstance(value, types.ModuleType):
name = value.__name__
defs.append("import %s; self.%s = %s\n" % (name, symbol, name))
- elif isinstance(value, str):
- # python2 string -> Bytes string
- defs.append("self.%s = b%r\n" % (symbol, value))
- elif isinstance(value, unicode):
- # python2 unicode -> python3 string
- defs.append("self.%s = %s\n" % (symbol, repr(value)[1:]))
- elif isinstance(value, (int, float, list, dict)):
- defs.append("self.%s = %r\n" % (symbol, value))
+ elif isinstance(value, (str, unicode, int, float, list, dict)):
+ defs.append("self.%s = %s\n" % (symbol, py3k_repr(value)))
source = py.code.Source(target_)[1:]
pyfile = udir.join('src.py')
- source = helpers + '\n'.join(defs) + 'if 1:\n' + str(source)
+ target_name = target_.__name__
with pyfile.open('w') as f:
- f.write(source)
+ f.write(helpers)
+ f.write('\n'.join(defs))
+ f.write('def %s():\n' % target_name)
+ f.write(str(source))
+ f.write("\n%s()\n" % target_name)
res, stdout, stderr = runsubprocess.run_subprocess(
python_, [str(pyfile)])
- print source
+ print pyfile.read()
print >> sys.stdout, stdout
print >> sys.stderr, stderr
if res > 0:
- raise AssertionError("Subprocess failed")
+ raise AssertionError("Subprocess failed:\n" + stderr)
def extract_docstring_if_empty_function(fn):
More information about the pypy-commit
mailing list