Author: Brian Kearns <[email protected]>
Branch: py3k
Changeset: r62246:15f23fecd782
Date: 2013-03-08 15:27 -0500
http://bitbucket.org/pypy/pypy/changeset/15f23fecd782/
Log: reapply py3k modifications to _cffi_backend that were lost in the
delete/backout
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
@@ -253,10 +253,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._io.interp_iobase import W_IOBase
from pypy.module._cffi_backend import ctypefunc
ob = self.space.interpclass_w(w_ob)
- if isinstance(ob, W_File):
+ if isinstance(ob, W_IOBase):
return prepare_file_argument(self.space, ob)
else:
return lltype.nullptr(rffi.CCHARP.TO)
@@ -364,15 +364,20 @@
rffi_fclose(self.llf)
-def prepare_file_argument(space, fileobj):
- fileobj.direct_flush()
+def prepare_file_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/misc.py
b/pypy/module/_cffi_backend/misc.py
--- a/pypy/module/_cffi_backend/misc.py
+++ b/pypy/module/_cffi_backend/misc.py
@@ -210,9 +210,7 @@
ovf_msg = "long too big to convert"
def is_zero(space, w_ob):
- return ((space.isinstance_w(w_ob, space.w_int) or
- space.isinstance_w(w_ob, space.w_long))
- and not space.is_true(w_ob))
+ return space.isinstance_w(w_ob, space.w_int) and not space.is_true(w_ob)
# ____________________________________________________________
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:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit