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

Reply via email to