[pypy-commit] pypy winconsoleio: Implemented a couple more methods.

andrewjlawrence pypy.commits at gmail.com
Sat Jun 8 18:13:22 EDT 2019


Author: andrewjlawrence
Branch: winconsoleio
Changeset: r96779:a89938555d38
Date: 2019-06-08 23:12 +0100
http://bitbucket.org/pypy/pypy/changeset/a89938555d38/

Log:	Implemented a couple more methods.

diff --git a/pypy/module/_io/interp_io.py b/pypy/module/_io/interp_io.py
--- a/pypy/module/_io/interp_io.py
+++ b/pypy/module/_io/interp_io.py
@@ -1,4 +1,5 @@
 import os
+import sys
 
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import interp2app, unwrap_spec
@@ -8,6 +9,7 @@
 from pypy.module._io.interp_textio import W_TextIOWrapper
 from pypy.module.posix import interp_posix
 
+_WIN32 = sys.platform == 'win32'
 
 class Cache:
     def __init__(self, space):
@@ -90,8 +92,15 @@
 
     w_result = None
     try:
+        rawclass = W_FileIO
+        if _WIN32:
+            from pypy.module._io.interp_win32consoleio import W_WinConsoleIO, _pyio_get_console_type
+            if _pyio_get_console_type(space, w_file) != '\0':
+                rawclass = W_WinConsoleIO
+                encoding = "utf-8"
+                
         w_raw = space.call_function(
-            space.gettypefor(W_FileIO), w_file, space.newtext(rawmode),
+            space.gettypefor(rawclass), w_file, space.newtext(rawmode),
             space.newbool(bool(closefd)), w_opener)
         w_result = w_raw
 
diff --git a/pypy/module/_io/interp_win32consoleio.py b/pypy/module/_io/interp_win32consoleio.py
--- a/pypy/module/_io/interp_win32consoleio.py
+++ b/pypy/module/_io/interp_win32consoleio.py
@@ -1,8 +1,9 @@
 import sys
 import os
 
-from pypy.interpreter.error import oefmt
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.error import OperationError, oefmt
+from pypy.interpreter.typedef import (
+    TypeDef, generic_new_descr, GetSetProperty)
 from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
 from pypy.module._io.interp_iobase import (W_RawIOBase, DEFAULT_BUFFER_SIZE)
 from pypy.interpreter.unicodehelper import fsdecode
@@ -219,9 +220,33 @@
            lltype.free(self.buf, flavor='raw')
         
         return None
+        
+    def repr_w(self, space):
+        typename = space.type(self).name
+        try:
+            w_name = space.getattr(self, space.newtext("name"))
+        except OperationError as e:
+            if not e.match(space, space.w_Exception):
+                raise
+            return space.newtext("<%s>" % (typename,))
+        else:
+            name_repr = space.text_w(space.repr(w_name))
+            return space.newtext("<%s name=%s>" % (typename, name_repr))
+            
+    def fileno_w(self, space):
+        if self.fd < 0 and self.handle != rwin32.INVALID_HANDLE_VALUE:
+            if self.writable:
+                self.fd = rwin32.open_osfhandle(self.handle, rwin32._O_WRONLY | rwin32._O_BINARY)
+            else:
+                self.fd = rwin32.open_osfhandle(self.handle, rwin32._O_RDONLY | rwin32._O_BINARY)
+        if self.fd < 0:
+            return err_mode("fileno")
+         
+        return space.newint(self.fd)
 
 W_WinConsoleIO.typedef = TypeDef(
     '_io._WinConsoleIO', W_WinConsoleIO.typedef,
-    #__new__  = interp2app(W_FileIO.descr_new.im_func),
+    __new__  = generic_new_descr(W_WinConsoleIO),
     __init__  = interp2app(W_WinConsoleIO.descr_init),
+    __repr__ = interp2app(W_WinConsoleIO.repr_w),
     )
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -249,6 +249,13 @@
             raise WindowsError(ERROR_INVALID_HANDLE, "Invalid file handle")
         return handle
 
+    _open_osfhandle = rffi.llexternal('_open_osfhandle', [rffi.INTP, rffi.INT], rffi.INT)
+
+    def open_osfhandle(handle, flags):
+        fd = _open_osfhandle(handle, flags)
+        with FdValidator(fd):
+            return fd
+
     def build_winerror_to_errno():
         """Build a dictionary mapping windows error numbers to POSIX errno.
         The function returns the dict, and the default value for codes not
diff --git a/rpython/rlib/rwin32file.py b/rpython/rlib/rwin32file.py
--- a/rpython/rlib/rwin32file.py
+++ b/rpython/rlib/rwin32file.py
@@ -14,7 +14,7 @@
 
     class CConfigGlobal:
         _compilation_info_ = ExternalCompilationInfo(
-            includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
+            includes = ['windows.h', 'winbase.h', 'sys/stat.h', 'fcntl.h'],
         )
         ERROR_FILE_NOT_FOUND = platform.ConstantInteger(
             'ERROR_FILE_NOT_FOUND')
@@ -39,6 +39,13 @@
         _S_IFREG = platform.ConstantInteger('_S_IFREG')
         _S_IFCHR = platform.ConstantInteger('_S_IFCHR')
         _S_IFIFO = platform.ConstantInteger('_S_IFIFO')
+        _O_APPEND = platform.ConstantInteger('_O_APPEND')
+        _O_CREAT  = platform.ConstantInteger('_O_CREAT')
+        _O_EXCL   = platform.ConstantInteger('_O_EXCL')
+        _O_RDONLY = platform.ConstantInteger('_O_RDONLY')
+        _O_RDWR   = platform.ConstantInteger('_O_RDWR')
+        _O_TRUNC  = platform.ConstantInteger('_O_TRUNC')
+        _O_WRONLY = platform.ConstantInteger('_O_WRONLY')
         FILE_TYPE_UNKNOWN = platform.ConstantInteger('FILE_TYPE_UNKNOWN')
         FILE_TYPE_CHAR = platform.ConstantInteger('FILE_TYPE_CHAR')
         FILE_TYPE_PIPE = platform.ConstantInteger('FILE_TYPE_PIPE')


More information about the pypy-commit mailing list