зеркало из https://github.com/github/ruby.git
* io.c (rb_io_extract_modeenc): add option parameter `flags'
to append extra oflags to normal mode. [Feature #11253] [ruby-core:69539] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51416 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
de81665009
Коммит
6a5dda00d8
|
@ -1,3 +1,9 @@
|
|||
Wed Jul 29 10:36:58 2015 NARUSE, Yui <naruse@ruby-lang.org>
|
||||
|
||||
* io.c (rb_io_extract_modeenc): add option parameter `flags'
|
||||
to append extra oflags to normal mode.
|
||||
[Feature #11253] [ruby-core:69539]
|
||||
|
||||
Wed Jul 29 04:54:47 2015 Eric Wong <e@80x24.org>
|
||||
|
||||
* test/rubygems/test_gem_remote_fetcher.rb: pre-generate test key
|
||||
|
|
4
NEWS
4
NEWS
|
@ -46,6 +46,10 @@ with all sufficient information, see the ChangeLog file.
|
|||
this flag means to permit deleting opened file on Windows, but currently
|
||||
this affect only files opened as binary. [Feature #11218]
|
||||
|
||||
* new option parameter `flags' is added.
|
||||
this parameter is bitwise-ORed to oflags generated by normal mode argument.
|
||||
[Feature #11253]
|
||||
|
||||
* Thread
|
||||
* Thread#name, Thread#name= are added to handle thread names [Feature #11251]
|
||||
|
||||
|
|
36
io.c
36
io.c
|
@ -173,7 +173,7 @@ static VALUE argf;
|
|||
|
||||
#define id_exception idException
|
||||
static ID id_write, id_read, id_getc, id_flush, id_readpartial, id_set_encoding;
|
||||
static VALUE sym_mode, sym_perm, sym_extenc, sym_intenc, sym_encoding, sym_open_args;
|
||||
static VALUE sym_mode, sym_perm, sym_flags, sym_extenc, sym_intenc, sym_encoding, sym_open_args;
|
||||
static VALUE sym_textmode, sym_binmode, sym_autoclose;
|
||||
static VALUE sym_SET, sym_CUR, sym_END;
|
||||
static VALUE sym_wait_readable, sym_wait_writable;
|
||||
|
@ -5340,6 +5340,24 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash,
|
|||
}
|
||||
else {
|
||||
VALUE v;
|
||||
if (!has_vmode) {
|
||||
v = rb_hash_aref(opthash, sym_mode);
|
||||
if (!NIL_P(v)) {
|
||||
if (!NIL_P(vmode)) {
|
||||
rb_raise(rb_eArgError, "mode specified twice");
|
||||
}
|
||||
has_vmode = 1;
|
||||
vmode = v;
|
||||
goto vmode_handle;
|
||||
}
|
||||
}
|
||||
v = rb_hash_aref(opthash, sym_flags);
|
||||
if (!NIL_P(v)) {
|
||||
v = rb_to_int(v);
|
||||
oflags |= NUM2INT(v);
|
||||
vmode = INT2NUM(oflags);
|
||||
fmode = rb_io_oflags_fmode(oflags);
|
||||
}
|
||||
extract_binmode(opthash, &fmode);
|
||||
if (fmode & FMODE_BINMODE) {
|
||||
#ifdef O_BINARY
|
||||
|
@ -5353,17 +5371,6 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash,
|
|||
fmode |= DEFAULT_TEXTMODE;
|
||||
}
|
||||
#endif
|
||||
if (!has_vmode) {
|
||||
v = rb_hash_aref(opthash, sym_mode);
|
||||
if (!NIL_P(v)) {
|
||||
if (!NIL_P(vmode)) {
|
||||
rb_raise(rb_eArgError, "mode specified twice");
|
||||
}
|
||||
has_vmode = 1;
|
||||
vmode = v;
|
||||
goto vmode_handle;
|
||||
}
|
||||
}
|
||||
v = rb_hash_aref(opthash, sym_perm);
|
||||
if (!NIL_P(v)) {
|
||||
if (vperm_p) {
|
||||
|
@ -7522,6 +7529,10 @@ rb_io_make_open_file(VALUE obj)
|
|||
* :mode ::
|
||||
* Same as +mode+ parameter
|
||||
*
|
||||
* :flags ::
|
||||
* Specifies file open flags as integer.
|
||||
* If +mode+ parameter is given, this parameter will be bitwise-ORed.
|
||||
*
|
||||
* :\external_encoding ::
|
||||
* External encoding for the IO. "-" is a synonym for the default external
|
||||
* encoding.
|
||||
|
@ -12493,6 +12504,7 @@ Init_IO(void)
|
|||
|
||||
sym_mode = ID2SYM(rb_intern("mode"));
|
||||
sym_perm = ID2SYM(rb_intern("perm"));
|
||||
sym_flags = ID2SYM(rb_intern("flags"));
|
||||
sym_extenc = ID2SYM(rb_intern("external_encoding"));
|
||||
sym_intenc = ID2SYM(rb_intern("internal_encoding"));
|
||||
sym_encoding = ID2SYM(rb_intern("encoding"));
|
||||
|
|
|
@ -3230,4 +3230,25 @@ End
|
|||
}
|
||||
end if /mswin|mingw|bccwin/ !~ RUBY_PLATFORM
|
||||
|
||||
def test_open_flag
|
||||
make_tempfile do |t|
|
||||
assert_raise(Errno::EEXIST){ open(t, File::WRONLY|File::CREAT, flags: File::EXCL){} }
|
||||
assert_raise(Errno::EEXIST){ open(t, 'w', flags: File::EXCL){} }
|
||||
assert_raise(Errno::EEXIST){ open(t, mode: 'w', flags: File::EXCL){} }
|
||||
end
|
||||
end
|
||||
|
||||
def test_open_flag_binar
|
||||
make_tempfile do |t|
|
||||
open(t, File::RDONLY, flags: File::BINARY) do |f|
|
||||
assert_equal true, f.binmode
|
||||
end
|
||||
open(t, 'r', flags: File::BINARY) do |f|
|
||||
assert_equal true, f.binmode
|
||||
end
|
||||
open(t, mode: 'r', flags: File::BINARY) do |f|
|
||||
assert_equal true, f.binmode
|
||||
end
|
||||
end
|
||||
end if File::BINARY != 0
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче