[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