Author: andrewjlawrence
Branch: winconsoleio
Changeset: r97510:5b5a1bf2f5af
Date: 2019-09-17 11:56 +0100
http://bitbucket.org/pypy/pypy/changeset/5b5a1bf2f5af/

Log:    Fixed a few more things and implemented another test.

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
@@ -19,9 +19,6 @@
 SMALLBUF = 4
 BUFMAX = (32*1024*1024)
 BUFSIZ = platform.ConstantInteger("BUFSIZ")
-CONIN = rffi.unicode2wcharp(u"CONIN$")
-CONOUT = rffi.unicode2wcharp(u"CONOUT$")
-CON = rffi.unicode2wcharp(u"CON")
 
 def err_closed(space):
     raise oefmt(space.w_ValueError,
@@ -130,10 +127,6 @@
     decoded = space.fsdecode_w(w_path_or_fd)
     if not decoded:
         return '\0'
-    
-    decoded_wstr = rffi.cast(rffi.CWCHARP, decoded)
-    if not decoded_wstr:
-        return '\0'
  
     m = '\0'
 
@@ -146,39 +139,18 @@
     elif dlower == 'CON'.lower():
         m = 'x'
 
-
     if m != '\0':
         return m
 
-    length = 0
-    
-    pname_buf = lltype.malloc(rffi.CWCHARP.TO, rwin32.MAX_PATH, flavor='raw')
-
-    uni_decoded_wstr = rffi.wcharp2unicode(decoded_wstr)
-    traits = _preferred_traits(uni_decoded_wstr)
-    win32traits = make_win32_traits(traits)
-    str_nullptr = lltype.nullptr(win32traits.LPSTRP.TO)
-    length = win32traits.GetFullPathName(decoded_wstr, rwin32.MAX_PATH, 
pname_buf, str_nullptr)
-    
-    if length > rwin32.MAX_PATH:
-        lltype.free(pname_buf, flavor='raw')
-        pname_buf = lltype.malloc(rffi.CWCHARP.TO, length, flavor='raw')
-        if pname_buf:
-            length = win32traits.GetFullPathName(decoded_wstr, length, 
pname_buf, str_nullptr)
-        else:
-            length = 0
-
-    dlower = space.wcharp2unicode(pname_buf).lower()
     if len(dlower) >=4:
-        if dlower[:4] == u'\\\\.\\' or dlower[:4] == u'\\\\?\\':
+        if dlower[:4] == '\\\\.\\' or dlower[:4] == '\\\\?\\':
             dlower = dlower[4:]
-            if  dlower == u'CONIN$'.lower():
-                m = 'r'
-            elif dlower == u'CONOUT$'.lower():
-                m = 'w'
-            elif dlower == u'CON'.lower():
-                m = 'x'
-    lltype.free(pname_buf, flavor='raw')
+            if  dlower == 'CONIN$'.lower():
+                 m = 'r'
+            elif dlower == 'CONOUT$'.lower():
+                 m = 'w'
+            elif dlower == 'CON'.lower():
+                 m = 'x'
     return m
 
 
@@ -190,7 +162,7 @@
         self.created = 0
         self.readable = False
         self.writable = False
-        self.closehandle = 0
+        self.closehandle = False
         self.blksize = 0
 
     # def _internal_close(self, space):
@@ -215,7 +187,9 @@
 
     @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):
-        name = None
+        name = rffi.cast(rffi.CWCHARP, 0)
+        self.fd = -1
+        self.handle = rwin32.INVALID_HANDLE_VALUE
         self.readable = False
         self.writable = False
         self.blksize = 0
@@ -223,16 +197,15 @@
         console_type = '\0'
         self.buf = lltype.malloc(rffi.CCHARPP.TO,SMALLBUF,flavor='raw')
 
-        if w_mode == None:
-            w_mode = space.newtext("r")
-
         try:
-            self.fd = space.int_w(w_nameobj)
+            if space.isinstance_w(w_nameobj, space.w_int): 
+                self.fd = space.int_w(w_nameobj)
             closefd = space.bool_w(w_closefd)
 
             if self.fd < 0:
+                
                 w_decodedname = space.fsdecode(w_nameobj)
-                name = rffi.cast(rffi.CWCHARP, space.text_w(w_decodedname))
+                name = space.unicode2wcharp(w_decodedname)
                 console_type = _pyio_get_console_type(space, w_decodedname)
                 if not console_type:
                     raise oefmt(space.w_ValueError,
@@ -281,7 +254,7 @@
                 if self.writable:
                     access = rwin32.GENERIC_WRITE
             
-                traits = _preferred_traits(name)
+                traits = _preferred_traits(space.wcharp2unicode(name))
                 if not (traits.str is unicode):
                     raise oefmt(space.w_ValueError,
                                 "Non-unicode string name %s", traits.str)
@@ -319,8 +292,6 @@
             rffi.c_memset(self.buf, 0, SMALLBUF)
         finally:
            lltype.free(self.buf, flavor='raw')
-        
-        return None
     
     def readable_w(self, space):
         if self.handle == rwin32.INVALID_HANDLE_VALUE:
@@ -400,6 +371,7 @@
                 
             u8n = 0
             
+            
             if len < 4:
                 if rwin32.WideCharToMultiByte(rwin32.CP_UTF8,
                                            0, wbuf, n, self.buf,
@@ -551,7 +523,7 @@
         
         wlen = rwin32.MultiByteToWideChar(rwin32.CP_UTF8, 0 , buffer, buflen, 
rffi.NULL, 0)
         
-        while wlen > (32766 / rffi.sizeof(rffi.CWCHARP.TO)):
+        while wlen > (32766 / rffi.sizeof(rffi.CWCHARP)):
             buflen /= 2
             wlen = rwin32.MultiByteToWideChar(rwin32.CP_UTF8, 0 , buffer, 
buflen, rffi.NULL, 0)
             
diff --git a/pypy/module/_io/test/test_win32consoleio.py 
b/pypy/module/_io/test/test_win32consoleio.py
--- a/pypy/module/_io/test/test_win32consoleio.py
+++ b/pypy/module/_io/test/test_win32consoleio.py
@@ -7,6 +7,55 @@
         cls.w_INT_MAX = space.wrap(INT_MAX)
         cls.w_UINT_MAX = space.wrap(UINT_MAX)
 
+    def test_open_fd(self):
+        self.assertRaisesRegex(ValueError,
+            "negative file descriptor", _io._WindowsConsoleIO, -1)
+
+        fd, _ = tempfile.mkstemp()
+        try:
+            # Windows 10: "Cannot open non-console file"
+            # Earlier: "Cannot open console output buffer for reading"
+            self.assertRaisesRegex(ValueError,
+                "Cannot open (console|non-console file)", 
_io._WindowsConsoleIO, fd)
+        finally:
+            os.close(fd)
+
+        try:
+            f = _io._WindowsConsoleIO(0)
+        except ValueError:
+            # cannot open console because it's not a real console
+            pass
+        else:
+            self.assertTrue(f.readable())
+            self.assertFalse(f.writable())
+            self.assertEqual(0, f.fileno())
+            f.close()   # multiple close should not crash
+            f.close()
+
+        try:
+            f = _io._WindowsConsoleIO(1, 'w')
+        except ValueError:
+            # cannot open console because it's not a real console
+            pass
+        else:
+            self.assertFalse(f.readable())
+            self.assertTrue(f.writable())
+            self.assertEqual(1, f.fileno())
+            f.close()
+            f.close()
+
+        try:
+            f = _io._WindowsConsoleIO(2, 'w')
+        except ValueError:
+            # cannot open console because it's not a real console
+            pass
+        else:
+            self.assertFalse(f.readable())
+            self.assertTrue(f.writable())
+            self.assertEqual(2, f.fileno())
+            f.close()
+            f.close()
+
     def test_constructor(self):
         import _io
-        t = _io._WindowsConsoleIO(u"CONIN$")
+        t = _io._WindowsConsoleIO("CONIN$")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to