[前][次][番号順一覧][スレッド一覧]

ruby-changes:39335

From: naruse <ko1@a...>
Date: Wed, 29 Jul 2015 10:39:47 +0900 (JST)
Subject: [ruby-changes:39335] naruse:r51416 (trunk): * io.c (rb_io_extract_modeenc): add option parameter `flags'

naruse	2015-07-29 10:39:14 +0900 (Wed, 29 Jul 2015)

  New Revision: 51416

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=51416

  Log:
    * io.c (rb_io_extract_modeenc): add option parameter `flags'
      to append extra oflags to normal mode.
      [Feature #11253] [ruby-core:69539]

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/io.c
    trunk/test/ruby/test_io.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 51415)
+++ ChangeLog	(revision 51416)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Jul 29 10:36:58 2015  NARUSE, Yui  <naruse@r...>
+
+	* 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@8...>
 
 	* test/rubygems/test_gem_remote_fetcher.rb: pre-generate test key
Index: io.c
===================================================================
--- io.c	(revision 51415)
+++ io.c	(revision 51416)
@@ -173,7 +173,7 @@ static VALUE argf; https://github.com/ruby/ruby/blob/trunk/io.c#L173
 
 #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, VA https://github.com/ruby/ruby/blob/trunk/io.c#L5340
     }
     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, VA https://github.com/ruby/ruby/blob/trunk/io.c#L5371
 	    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) https://github.com/ruby/ruby/blob/trunk/io.c#L7529
  *  :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) https://github.com/ruby/ruby/blob/trunk/io.c#L12504
 
     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"));
Index: NEWS
===================================================================
--- NEWS	(revision 51415)
+++ NEWS	(revision 51416)
@@ -46,6 +46,10 @@ with all sufficient information, see the https://github.com/ruby/ruby/blob/trunk/NEWS#L46
     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]
 
Index: test/ruby/test_io.rb
===================================================================
--- test/ruby/test_io.rb	(revision 51415)
+++ test/ruby/test_io.rb	(revision 51416)
@@ -3230,4 +3230,25 @@ End https://github.com/ruby/ruby/blob/trunk/test/ruby/test_io.rb#L3230
     }
   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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]