[pypy-svn] r76166 - in pypy/branch/unicode_filename-2/pypy: module/_file module/_file/test module/posix rlib

afa at codespeak.net afa at codespeak.net
Mon Jul 12 22:58:56 CEST 2010


Author: afa
Date: Mon Jul 12 22:58:54 2010
New Revision: 76166

Modified:
   pypy/branch/unicode_filename-2/pypy/module/_file/interp_file.py
   pypy/branch/unicode_filename-2/pypy/module/_file/test/test_file.py
   pypy/branch/unicode_filename-2/pypy/module/posix/interp_posix.py
   pypy/branch/unicode_filename-2/pypy/rlib/streamio.py
Log:
Unicode support for __builtin__.open()


Modified: pypy/branch/unicode_filename-2/pypy/module/_file/interp_file.py
==============================================================================
--- pypy/branch/unicode_filename-2/pypy/module/_file/interp_file.py	(original)
+++ pypy/branch/unicode_filename-2/pypy/module/_file/interp_file.py	Mon Jul 12 22:58:54 2010
@@ -4,6 +4,7 @@
 from pypy.rlib.rarithmetic import r_longlong
 from pypy.module._file.interp_stream import W_AbstractStream
 from pypy.module._file.interp_stream import StreamErrors, wrap_streamerror
+from pypy.module.posix.interp_posix import dispatch_filename
 from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.interpreter.gateway import ObjSpace, W_Root, Arguments
 from pypy.interpreter.typedef import TypeDef, GetSetProperty
@@ -81,11 +82,12 @@
     # file lock.  They don't convert StreamErrors to OperationErrors, too.
 
     def direct___init__(self, w_name, mode='r', buffering=-1):
-        name = self.space.str_w(w_name)
         self.direct_close()
         self.w_name = w_name
         self.check_mode_ok(mode)
-        stream = streamio.open_file_as_stream(name, mode, buffering)
+        stream = dispatch_filename(
+            self.space, w_name,
+            lambda name: streamio.open_file_as_stream(name, mode, buffering))
         fd = stream.try_to_find_file_descriptor()
         self.fdopenstream(stream, fd, mode)
 

Modified: pypy/branch/unicode_filename-2/pypy/module/_file/test/test_file.py
==============================================================================
--- pypy/branch/unicode_filename-2/pypy/module/_file/test/test_file.py	(original)
+++ pypy/branch/unicode_filename-2/pypy/module/_file/test/test_file.py	Mon Jul 12 22:58:54 2010
@@ -125,6 +125,10 @@
         assert type(res) is str
         f.close()
 
+    def test_unicode_filename(self):
+        f = self.file(self.temppath + u'\xe9', "w")
+        f.close()
+
     def test_oserror_has_filename(self):
         try:
             f = self.file("file that is clearly not there")

Modified: pypy/branch/unicode_filename-2/pypy/module/posix/interp_posix.py
==============================================================================
--- pypy/branch/unicode_filename-2/pypy/module/posix/interp_posix.py	(original)
+++ pypy/branch/unicode_filename-2/pypy/module/posix/interp_posix.py	Mon Jul 12 22:58:54 2010
@@ -1,5 +1,6 @@
 from pypy.interpreter.gateway import ObjSpace, W_Root, NoneNotWrapped
 from pypy.rlib import rposix
+from pypy.rlib.objectmodel import specialize
 from pypy.rlib.rarithmetic import r_longlong
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.interpreter.error import OperationError, wrap_oserror, wrap_oserror2
@@ -23,16 +24,22 @@
     def gettext(self):
         return self.space.unicode_w(self.w_obj)
 
+ at specialize.arg(1)
+def dispatch_filename(space, w_fname, callable):
+    if space.isinstance_w(w_fname, space.w_unicode):
+        fname = FileEncoder(space, w_fname)
+        return callable(fname)
+    else:
+        fname = space.str_w(w_fname)
+        return callable(fname)
+
 def open(space, w_fname, flag, mode=0777):
     """Open a file (for low level IO).
 Return a file descriptor (a small integer)."""
     try:
-        if space.isinstance_w(w_fname, space.w_unicode):
-            fname = FileEncoder(space, w_fname)
-            fd = rposix.open(fname, flag, mode)
-        else:
-            fname = space.str_w(w_fname)
-            fd = rposix.open(fname, flag, mode)
+        fd = dispatch_filename(
+            space, w_fname,
+            lambda fname: rposix.open(fname, flag, mode))
     except OSError, e: 
         raise wrap_oserror2(space, e, w_fname)
     return space.wrap(fd)

Modified: pypy/branch/unicode_filename-2/pypy/rlib/streamio.py
==============================================================================
--- pypy/branch/unicode_filename-2/pypy/rlib/streamio.py	(original)
+++ pypy/branch/unicode_filename-2/pypy/rlib/streamio.py	Mon Jul 12 22:58:54 2010
@@ -38,7 +38,9 @@
 #
 
 import os, sys
+from pypy.rlib.objectmodel import specialize
 from pypy.rlib.rarithmetic import r_longlong, intmask
+from pypy.rlib import rposix
 
 from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC
 O_BINARY = getattr(os, "O_BINARY", 0)
@@ -71,6 +73,7 @@
     return s.join(string.split(c))
 
 
+ at specialize.argtype(0)
 def open_file_as_stream(path, mode="r", buffering=-1):
     os_flags, universal, reading, writing, basemode, binary = decode_mode(mode)
     stream = open_path_helper(path, os_flags, basemode == "a")
@@ -89,9 +92,10 @@
     return construct_stream_tower(stream, buffering, universal, reading,
                                   writing, binary)
 
+ at specialize.argtype(0)
 def open_path_helper(path, os_flags, append):
     # XXX for now always return DiskFile
-    fd = os.open(path, os_flags, 0666)
+    fd = rposix.open(path, os_flags, 0666)
     if append:
         try:
             os.lseek(fd, 0, 2)



More information about the Pypy-commit mailing list