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

ruby-changes:2573

From: ko1@a...
Date: 1 Dec 2007 14:22:35 +0900
Subject: [ruby-changes:2573] matz - Ruby:r14064 (trunk): * io.c (rb_f_open): use to_open for every non-string object. path

matz	2007-12-01 14:22:15 +0900 (Sat, 01 Dec 2007)

  New Revision: 14064

  Modified files:
    trunk/ChangeLog
    trunk/io.c

  Log:
    * io.c (rb_f_open): use to_open for every non-string object.  path
      object may use method_missing.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14064&r2=14063
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14064&r2=14063

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14063)
+++ ChangeLog	(revision 14064)
@@ -13,6 +13,11 @@
 
 	* bootstraptest/test_block.rb: ditto.
 
+Sat Dec  1 10:45:56 2007  Yukihiro Matsumoto  <matz@r...>
+
+	* io.c (rb_f_open): use to_open for every non-string object.  path
+	  object may use method_missing.
+
 Sat Dec  1 09:44:32 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* insns.def (concatarray, splatarray): use to_a instead of
Index: io.c
===================================================================
--- io.c	(revision 14063)
+++ io.c	(revision 14064)
@@ -3782,20 +3782,20 @@
 static VALUE
 rb_f_open(int argc, VALUE *argv)
 {
+    ID to_open;
+    int redirect = Qfalse;
+
     if (argc >= 1) {
-	ID to_open = rb_intern("to_open");
-
+	to_open = rb_intern("to_open");
 	if (rb_respond_to(argv[0], to_open)) {
-	    VALUE io = rb_funcall2(argv[0], to_open, argc-1, argv+1);
-
-	    if (rb_block_given_p()) {
-		return rb_ensure(rb_yield, io, io_close, io);
-	    }
-	    return io;
+	    redirect = Qtrue;
 	}
 	else {
 	    VALUE tmp = rb_check_string_type(argv[0]);
-	    if (!NIL_P(tmp)) {
+	    if (NIL_P(tmp)) {
+		redirect = Qtrue;
+	    }
+	    else {
 		char *str = StringValuePtr(tmp);
 		if (str && str[0] == '|') {
 		    argv[0] = rb_str_new(str+1, RSTRING_LEN(tmp)-1);
@@ -3805,6 +3805,14 @@
 	    }
 	}
     }
+    if (redirect) {
+	VALUE io = rb_funcall2(argv[0], to_open, argc-1, argv+1);
+
+	if (rb_block_given_p()) {
+	    return rb_ensure(rb_yield, io, io_close, io);
+	}
+	return io;
+    }
     return rb_io_s_open(argc, argv, rb_cFile);
 }
 

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

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