[pypy-commit] pypy winconsoleio: Added a few more functions

andrewjlawrence pypy.commits at gmail.com
Sun Aug 11 18:19:14 EDT 2019


Author: andrewjlawrence
Branch: winconsoleio
Changeset: r97157:d892abac55ac
Date: 2019-08-11 23:17 +0100
http://bitbucket.org/pypy/pypy/changeset/d892abac55ac/

Log:	Added a few more functions

diff --git a/pypy/module/_io/__init__.py b/pypy/module/_io/__init__.py
--- a/pypy/module/_io/__init__.py
+++ b/pypy/module/_io/__init__.py
@@ -23,7 +23,7 @@
         'BufferedRWPair': 'interp_bufferedio.W_BufferedRWPair',
         'BufferedRandom': 'interp_bufferedio.W_BufferedRandom',
         'TextIOWrapper': 'interp_textio.W_TextIOWrapper',
-        '_WindowsConsoleIO': 'interp_win32consoleio.W_WinConsoleIO',
+        'WindowsConsoleIO': 'interp_win32consoleio.W_WinConsoleIO',
 
         'open': 'interp_io.open',
         'IncrementalNewlineDecoder': 'interp_textio.W_IncrementalNewlineDecoder',
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
@@ -95,7 +95,8 @@
         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':
+            type = _pyio_get_console_type(space, w_file)
+            if type != '\0':
                 rawclass = W_WinConsoleIO
                 encoding = "utf-8"
                 
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
@@ -16,6 +16,10 @@
 
 SMALLBUF = 4
 
+def err_closed(space):
+    raise oefmt(space.w_ValueError,
+                "I/O operation on closed file")
+
 def _get_console_type(handle):
     mode = lltype.malloc(rwin32.LPDWORD.TO,0,flavor='raw')
     peek_count = lltype.malloc(rwin32.LPDWORD.TO,0,flavor='raw')
@@ -42,7 +46,7 @@
             return '\0'
         return _get_console_type(handle)
 
-
+    return None
     decoded = space.fsdecode_w(w_path_or_fd)
     if not decoded:
         return '\0'
@@ -54,14 +58,15 @@
     m = '\0'
     
     # In CPython the _wcsicmp function is used to perform case insensitive comparison
-    normdecoded = unicodedata.normalize("NFKD", decoded.lower())
-    if normdecoded == unicodedata.normalize("NFKD", "CONIN$".lower()):
+    decoded.lower()
+    if not rwin32.wcsicmp(decoded_wstr, "CONIN$"):
         m = 'r'
-    elif normdecoded == unicodedata.normalize("NFKD", "CONOUT$".lower()):
+    elif not rwin32.wcsicmp(decoded_wstr, "CONOUT$"):
         m = 'w'
-    elif normdecoded == unicodedata.normalize("NFKD", "CON".lower()):
+    elif not rwin32.wcsicmp(decoded_wstr, "CON"):
         m = 'x'
 
+
     if m != '\0':
         return m
 
@@ -85,15 +90,13 @@
         if length >= 4 and pname_buf[3] == '\\' and \
            (pname_buf[2] == '.' or pname_buf[2] == '?') and \
            pname_buf[1] == '\\' and pname_buf[0] == '\\':
-           pname_buf += 4
-        normdecoded = unicodedata.normalize("NFKD", decoded.lower())
-        if normdecoded == unicodedata.normalize("NFKD", "CONIN$".lower()):
-            m = 'r'
-        elif normdecoded == unicodedata.normalize("NFKD", "CONOUT$".lower()):
-            m = 'w'
-        elif normdecoded == unicodedata.normalize("NFKD", "CON".lower()):
-            m = 'x'
-           
+            pname_buf += 4
+            if not rwin32.wcsicmp(decoded_wstr, "CONIN$"):
+                m = 'r'
+            elif not rwin32.wcsicmp(decoded_wstr, "CONOUT$"):
+                m = 'w'
+            elif not rwin32.wcsicmp(decoded_wstr, "CON"):
+                m = 'x'
     lltype.free(pname_buf, flavor='raw')
     return m
 
@@ -109,11 +112,12 @@
         self.closehandle = 0
         self.blksize = 0
 
-    def _internal_close(self, space):
-        pass
+    # def _internal_close(self, space):
+        # pass
         
     @unwrap_spec(w_mode=WrappedDefault("r"), w_closefd=WrappedDefault(True), w_opener=WrappedDefault(None))
     def descr_init(self, space, w_nameobj, w_mode, w_closefd, w_opener):
+        return None
         #self.fd = -1
         #self.created = 0
         name = None
@@ -220,7 +224,22 @@
            lltype.free(self.buf, flavor='raw')
         
         return None
-        
+    
+    def readable_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            return err_closed(space)
+        return space.newbool(self.readable)
+    
+    def writable_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            return err_closed(space)
+        return space.newbool(self.writable)
+    
+    def isatty_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            return err_closed(space)
+        return space.newbool(True)
+    
     def repr_w(self, space):
         typename = space.type(self).name
         try:
@@ -241,12 +260,26 @@
                 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)
-
+        
+    def readinto_w(self, space):
+        if self.handle == rwin32.INVALID_HANDLE_VALUE:
+            return err_closed(space)
+            
+       
+    def get_blksize(self,space):
+        return space.newint(self.blksize)
+        
 W_WinConsoleIO.typedef = TypeDef(
-    '_io._WinConsoleIO', W_WinConsoleIO.typedef,
+    '_io.WinConsoleIO', W_RawIOBase.typedef,
     __new__  = generic_new_descr(W_WinConsoleIO),
     __init__  = interp2app(W_WinConsoleIO.descr_init),
     __repr__ = interp2app(W_WinConsoleIO.repr_w),
+    
+    readable = interp2app(W_WinConsoleIO.readable_w),
+    writable = interp2app(W_WinConsoleIO.writable_w),
+    isatty = interp2app(W_WinConsoleIO.isatty_w),
+    readinto = interp2app(W_WinConsoleIO.readinto_w),
+    
+    _blksize = GetSetProperty(W_WinConsoleIO.get_blksize),
     )
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -255,6 +255,8 @@
         fd = _open_osfhandle(handle, flags)
         with FdValidator(fd):
             return fd
+  
+    wcsicmp = rffi.llexternal('_wcsicmp', [rffi.CWCHARP, rffi.CWCHARP], rffi.INT)
 
     def build_winerror_to_errno():
         """Build a dictionary mapping windows error numbers to POSIX errno.


More information about the pypy-commit mailing list