Author: Alex Gaynor <alex.gay...@gmail.com> Branch: stdlib-2.7.8 Changeset: r73104:96013c5bad15 Date: 2014-08-27 14:12 -0700 http://bitbucket.org/pypy/pypy/changeset/96013c5bad15/
Log: merged upstream diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py --- a/pypy/module/_file/interp_file.py +++ b/pypy/module/_file/interp_file.py @@ -8,7 +8,7 @@ from rpython.rlib.rstring import StringBuilder from pypy.module._file.interp_stream import W_AbstractStream, StreamErrors from pypy.module.posix.interp_posix import dispatch_filename -from pypy.interpreter.error import OperationError, oefmt +from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.typedef import (TypeDef, GetSetProperty, interp_attrproperty, make_weakref_descr, interp_attrproperty_w) from pypy.interpreter.gateway import interp2app, unwrap_spec @@ -299,8 +299,8 @@ def file_fdopen(self, fd, mode="r", buffering=-1): try: self.direct_fdopen(fd, mode, buffering) - except StreamErrors, e: - raise wrap_streamerror(self.space, e, self.w_name) + except OSError as e: + raise wrap_oserror(self.space, e) _exposed_method_names = [] diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py --- a/pypy/module/posix/test/test_posix2.py +++ b/pypy/module/posix/test/test_posix2.py @@ -320,7 +320,8 @@ path = self.path posix = self.posix fd = posix.open(path, posix.O_RDONLY) - raises(OSError, posix.fdopen, fd, 'w') + exc = raises(OSError, posix.fdopen, fd, 'w') + assert str(exc.value) == "[Errno 22] Invalid argument" posix.close(fd) # fd should not be closed def test_getcwd(self): diff --git a/pypy/module/thread/test/test_fork.py b/pypy/module/thread/test/test_fork.py --- a/pypy/module/thread/test/test_fork.py +++ b/pypy/module/thread/test/test_fork.py @@ -13,16 +13,17 @@ skip("No fork on this platform") def busy_thread(): + print 'sleep' while run: time.sleep(0) done.append(None) - for i in range(1): + for i in range(5): run = True done = [] try: + print 'sleep' thread.start_new(busy_thread, ()) - print 'sleep' pid = os.fork() if pid == 0: diff --git a/pypy/objspace/std/newformat.py b/pypy/objspace/std/newformat.py --- a/pypy/objspace/std/newformat.py +++ b/pypy/objspace/std/newformat.py @@ -428,7 +428,7 @@ def _parse_spec(self, default_type, default_align): space = self.space - self._fill_char = self._lit("\0")[0] + self._fill_char = self._lit(" ")[0] self._align = default_align self._alternate = False self._sign = "\0" @@ -441,9 +441,11 @@ length = len(spec) i = 0 got_align = True + got_fill_char = False if length - i >= 2 and self._is_alignment(spec[i + 1]): self._align = spec[i + 1] self._fill_char = spec[i] + got_fill_char = True i += 2 elif length - i >= 1 and self._is_alignment(spec[i]): self._align = spec[i] @@ -456,7 +458,7 @@ if length - i >= 1 and spec[i] == "#": self._alternate = True i += 1 - if self._fill_char == "\0" and length - i >= 1 and spec[i] == "0": + if not got_fill_char and length - i >= 1 and spec[i] == "0": self._fill_char = self._lit("0")[0] if not got_align: self._align = "=" @@ -569,8 +571,6 @@ assert precision >= 0 length = precision string = string[:precision] - if self._fill_char == "\0": - self._fill_char = self._lit(" ")[0] self._calc_padding(string, length) return space.wrap(self._pad(string)) @@ -811,7 +811,7 @@ self._get_locale(tp) spec = self._calc_num_width(n_prefix, sign_char, to_numeric, n_digits, n_remainder, False, result) - fill = self._lit(" ") if self._fill_char == "\0" else self._fill_char + fill = self._fill_char upper = self._type == "X" return self.space.wrap(self._fill_number(spec, result, to_numeric, to_prefix, fill, to_remainder, upper)) @@ -957,7 +957,7 @@ digits = result spec = self._calc_num_width(0, sign, to_number, n_digits, n_remainder, have_dec_point, digits) - fill = self._lit(" ") if self._fill_char == "\0" else self._fill_char + fill = self._fill_char return self.space.wrap(self._fill_number(spec, digits, to_number, 0, fill, to_remainder, False)) @@ -1092,8 +1092,6 @@ out = self._builder() fill = self._fill_char - if fill == "\0": - fill = self._lit(" ")[0] #compose the string #add left padding diff --git a/pypy/objspace/std/test/test_newformat.py b/pypy/objspace/std/test/test_newformat.py --- a/pypy/objspace/std/test/test_newformat.py +++ b/pypy/objspace/std/test/test_newformat.py @@ -184,6 +184,20 @@ format_string = self.s("{{{}:.6f}}").format(sys.maxsize + 1) raises(ValueError, "format(2.34, format_string)") + def test_format_null_fill_char(self): + assert self.s('{0:\x00<6s}').format('foo') == 'foo' + '\x00' * 3 + assert self.s('{0:\x01<6s}').format('foo') == 'foo' + '\x01' * 3 + assert self.s('{0:\x00^6s}').format('foo') == '\x00foo\x00\x00' + + assert self.s('{0:\x00<6}').format(3) == '3' + '\x00' * 5 + assert self.s('{0:\x01<6}').format(3) == '3' + '\x01' * 5 + + assert self.s('{0:\x00<6}').format(3.14) == '3.14' + '\x00' * 2 + assert self.s('{0:\x01<6}').format(3.14) == '3.14' + '\x01' * 2 + + assert self.s('{0:\x00<12}').format(3+2.0j) == '(3+2j)' + '\x00' * 6 + assert self.s('{0:\x01<12}').format(3+2.0j) == '(3+2j)' + '\x01' * 6 + class AppTestUnicodeFormat(BaseStringFormatTests): def setup_class(cls): diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py --- a/rpython/rlib/_rsocket_rffi.py +++ b/rpython/rlib/_rsocket_rffi.py @@ -105,6 +105,9 @@ linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') + O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') + O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') + O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') @@ -406,6 +409,9 @@ locals().update(constants) +O_RDONLY = cConfig.O_RDONLY +O_WRONLY = cConfig.O_WRONLY +O_RDWR = cConfig.O_RDWR O_NONBLOCK = cConfig.O_NONBLOCK F_GETFL = cConfig.F_GETFL F_SETFL = cConfig.F_SETFL diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py --- a/rpython/rlib/streamio.py +++ b/rpython/rlib/streamio.py @@ -37,7 +37,7 @@ import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated from rpython.rlib.rarithmetic import r_longlong, intmask -from rpython.rlib import rposix, nonconst +from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c from rpython.rlib.rstring import StringBuilder from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND @@ -85,10 +85,26 @@ def _setfd_binary(fd): pass +if hasattr(_c, 'fcntl'): + def _check_fd_mode(fd, reading, writing): + flags = intmask(_c.fcntl(fd, _c.F_GETFL, 0)) + if flags & _c.O_RDWR: + return + elif flags & _c.O_WRONLY: + if not reading: + return + else: # O_RDONLY + if not writing: + return + raise OSError(22, "Invalid argument") +else: + def _check_fd_mode(fd, reading, writing): + # XXX + pass + def fdopen_as_stream(fd, mode, buffering=-1, signal_checker=None): - # XXX XXX XXX you want do check whether the modes are compatible - # otherwise you get funny results os_flags, universal, reading, writing, basemode, binary = decode_mode(mode) + _check_fd_mode(fd, reading, writing) _setfd_binary(fd) stream = DiskFile(fd, signal_checker) return construct_stream_tower(stream, buffering, universal, reading, _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit