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

ruby-changes:16036

From: nobu <ko1@a...>
Date: Mon, 24 May 2010 08:16:37 +0900 (JST)
Subject: [ruby-changes:16036] Ruby:r27985 (trunk, ruby_1_9_2): * process.c (rb_f_spawn): use correct command name for the error

nobu	2010-05-24 08:16:09 +0900 (Mon, 24 May 2010)

  New Revision: 27985

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

  Log:
    * process.c (rb_f_spawn): use correct command name for the error
      message.  [ruby-dev:41395]

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/process.c
    branches/ruby_1_9_2/test/ruby/test_process.rb
    branches/ruby_1_9_2/version.h
    trunk/ChangeLog
    trunk/process.c
    trunk/test/ruby/test_process.rb
    trunk/version.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 27984)
+++ ChangeLog	(revision 27985)
@@ -1,3 +1,8 @@
+Mon May 24 08:16:02 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (rb_f_spawn): use correct command name for the error
+	  message.  [ruby-dev:41395]
+
 Sun May 23 17:48:39 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/openssl/lib/openssl/x509-internal.rb, lib/forwardable.rb,
Index: process.c
===================================================================
--- process.c	(revision 27984)
+++ process.c	(revision 27985)
@@ -2850,37 +2850,40 @@
     }
 }
 
+static VALUE
+rb_exec_arg_prepare(struct rb_exec_arg *earg, int argc, VALUE *argv, int default_close_others)
+{
+    VALUE prog = rb_exec_arg_init(argc, argv, TRUE, earg);
+    if (NIL_P(rb_ary_entry(earg->options, EXEC_OPTION_CLOSE_OTHERS))) {
+        VALUE v = default_close_others ? Qtrue : Qfalse;
+        rb_exec_arg_addopt(earg, ID2SYM(rb_intern("close_others")), v);
+    }
+    rb_exec_arg_fixup(earg);
+    return prog;
+}
+
 static rb_pid_t
-rb_spawn_internal(int argc, VALUE *argv, int default_close_others,
-                  char *errmsg, size_t errmsg_buflen)
+rb_spawn_process(struct rb_exec_arg *earg, VALUE prog, char *errmsg, size_t errmsg_buflen)
 {
     rb_pid_t pid;
 #if defined HAVE_FORK || !defined HAVE_SPAWNV
     int status;
 #endif
-    VALUE prog;
-    struct rb_exec_arg earg;
 #if !defined HAVE_FORK
     struct rb_exec_arg sarg;
+    int argc;
+    VALUE *argv;
 #endif
 
-    prog = rb_exec_arg_init(argc, argv, TRUE, &earg);
-    if (NIL_P(rb_ary_entry(earg.options, EXEC_OPTION_CLOSE_OTHERS))) {
-        VALUE v = default_close_others ? Qtrue : Qfalse;
-        rb_exec_arg_addopt(&earg, ID2SYM(rb_intern("close_others")), v);
-    }
-    rb_exec_arg_fixup(&earg);
-
 #if defined HAVE_FORK
-    pid = rb_fork_err(&status, rb_exec_atfork, &earg, earg.redirect_fds, errmsg, errmsg_buflen);
-    if (prog && earg.argc) earg.argv[0] = prog;
+    pid = rb_fork_err(&status, rb_exec_atfork, earg, earg->redirect_fds, errmsg, errmsg_buflen);
 #else
-    if (rb_run_exec_options_err(&earg, &sarg, errmsg, errmsg_buflen) < 0) {
+    if (rb_run_exec_options_err(earg, &sarg, errmsg, errmsg_buflen) < 0) {
         return -1;
     }
 
-    argc = earg.argc;
-    argv = earg.argv;
+    argc = earg->argc;
+    argv = earg->argv;
     if (prog && argc) argv[0] = prog;
 # if defined HAVE_SPAWNV
     if (!argc) {
@@ -2904,6 +2907,15 @@
     return pid;
 }
 
+static rb_pid_t
+rb_spawn_internal(int argc, VALUE *argv, int default_close_others,
+                  char *errmsg, size_t errmsg_buflen)
+{
+    struct rb_exec_arg earg;
+    VALUE prog = rb_exec_arg_prepare(&earg, argc, argv, default_close_others);
+    return rb_spawn_process(&earg, prog, errmsg, errmsg_buflen);
+}
+
 rb_pid_t
 rb_spawn_err(int argc, VALUE *argv, char *errmsg, size_t errmsg_buflen)
 {
@@ -3218,12 +3230,15 @@
 {
     rb_pid_t pid;
     char errmsg[CHILD_ERRMSG_BUFLEN] = { '\0' };
+    struct rb_exec_arg earg;
 
-    pid = rb_spawn_err(argc, argv, errmsg, sizeof(errmsg));
+    pid = rb_spawn_process(&earg, rb_exec_arg_prepare(&earg, argc, argv, TRUE), errmsg, sizeof(errmsg));
     if (pid == -1) {
-        if (errmsg[0] == '\0')
-            rb_sys_fail(RSTRING_PTR(argv[0]));
-        rb_sys_fail(errmsg);
+	const char *prog = errmsg;
+	if (!prog[0] && !(prog = earg.prog) && earg.argc) {
+	    prog = RSTRING_PTR(earg.argv[0]);
+	}
+	rb_sys_fail(prog);
     }
 #if defined(HAVE_FORK) || defined(HAVE_SPAWNV)
     return PIDT2NUM(pid);
Index: version.h
===================================================================
--- version.h	(revision 27984)
+++ version.h	(revision 27985)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.3"
-#define RUBY_RELEASE_DATE "2010-05-23"
+#define RUBY_RELEASE_DATE "2010-05-24"
 #define RUBY_PATCHLEVEL -1
 #define RUBY_BRANCH_NAME "trunk"
 
@@ -8,7 +8,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2010
 #define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 23
+#define RUBY_RELEASE_DAY 24
 
 #include "ruby/version.h"
 
Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb	(revision 27984)
+++ test/ruby/test_process.rb	(revision 27985)
@@ -236,6 +236,17 @@
       system({"F=O"=>"BAR"}, *TRUECOMMAND)
     }
 
+    with_tmpchdir {|d|
+      prog = "#{d}/notexist"
+      e = assert_raise(Errno::ENOENT) {
+        Process.wait Process.spawn({"FOO"=>"BAR"}, prog)
+      }
+      assert_equal(prog, e.message.sub(/.* - /, ''))
+      e = assert_raise(Errno::ENOENT) {
+        Process.wait Process.spawn({"FOO"=>"BAR"}, [prog, "blar"])
+      }
+      assert_equal(prog, e.message.sub(/.* - /, ''))
+    }
     h = {}
     cmd = [h, RUBY]
     (ENV.keys + MANDATORY_ENVS).each do |k|
Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 27984)
+++ ruby_1_9_2/ChangeLog	(revision 27985)
@@ -1,3 +1,8 @@
+Mon May 24 08:16:02 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (rb_f_spawn): use correct command name for the error
+	  message.  [ruby-dev:41395]
+
 Fri May 21 01:06:05 2010  NAKAMURA Usaku  <usa@r...>
 
 	* thread.c (subtract_tv): if the rest is zero, should finish waiting
Index: ruby_1_9_2/process.c
===================================================================
--- ruby_1_9_2/process.c	(revision 27984)
+++ ruby_1_9_2/process.c	(revision 27985)
@@ -2850,37 +2850,40 @@
     }
 }
 
+static VALUE
+rb_exec_arg_prepare(struct rb_exec_arg *earg, int argc, VALUE *argv, int default_close_others)
+{
+    VALUE prog = rb_exec_arg_init(argc, argv, TRUE, earg);
+    if (NIL_P(rb_ary_entry(earg->options, EXEC_OPTION_CLOSE_OTHERS))) {
+        VALUE v = default_close_others ? Qtrue : Qfalse;
+        rb_exec_arg_addopt(earg, ID2SYM(rb_intern("close_others")), v);
+    }
+    rb_exec_arg_fixup(earg);
+    return prog;
+}
+
 static rb_pid_t
-rb_spawn_internal(int argc, VALUE *argv, int default_close_others,
-                  char *errmsg, size_t errmsg_buflen)
+rb_spawn_process(struct rb_exec_arg *earg, VALUE prog, char *errmsg, size_t errmsg_buflen)
 {
     rb_pid_t pid;
 #if defined HAVE_FORK || !defined HAVE_SPAWNV
     int status;
 #endif
-    VALUE prog;
-    struct rb_exec_arg earg;
 #if !defined HAVE_FORK
     struct rb_exec_arg sarg;
+    int argc;
+    VALUE *argv;
 #endif
 
-    prog = rb_exec_arg_init(argc, argv, TRUE, &earg);
-    if (NIL_P(rb_ary_entry(earg.options, EXEC_OPTION_CLOSE_OTHERS))) {
-        VALUE v = default_close_others ? Qtrue : Qfalse;
-        rb_exec_arg_addopt(&earg, ID2SYM(rb_intern("close_others")), v);
-    }
-    rb_exec_arg_fixup(&earg);
-
 #if defined HAVE_FORK
-    pid = rb_fork_err(&status, rb_exec_atfork, &earg, earg.redirect_fds, errmsg, errmsg_buflen);
-    if (prog && earg.argc) earg.argv[0] = prog;
+    pid = rb_fork_err(&status, rb_exec_atfork, earg, earg->redirect_fds, errmsg, errmsg_buflen);
 #else
-    if (rb_run_exec_options_err(&earg, &sarg, errmsg, errmsg_buflen) < 0) {
+    if (rb_run_exec_options_err(earg, &sarg, errmsg, errmsg_buflen) < 0) {
         return -1;
     }
 
-    argc = earg.argc;
-    argv = earg.argv;
+    argc = earg->argc;
+    argv = earg->argv;
     if (prog && argc) argv[0] = prog;
 # if defined HAVE_SPAWNV
     if (!argc) {
@@ -2904,6 +2907,15 @@
     return pid;
 }
 
+static rb_pid_t
+rb_spawn_internal(int argc, VALUE *argv, int default_close_others,
+                  char *errmsg, size_t errmsg_buflen)
+{
+    struct rb_exec_arg earg;
+    VALUE prog = rb_exec_arg_prepare(&earg, argc, argv, default_close_others);
+    return rb_spawn_process(&earg, prog, errmsg, errmsg_buflen);
+}
+
 rb_pid_t
 rb_spawn_err(int argc, VALUE *argv, char *errmsg, size_t errmsg_buflen)
 {
@@ -3218,12 +3230,15 @@
 {
     rb_pid_t pid;
     char errmsg[CHILD_ERRMSG_BUFLEN] = { '\0' };
+    struct rb_exec_arg earg;
 
-    pid = rb_spawn_err(argc, argv, errmsg, sizeof(errmsg));
+    pid = rb_spawn_process(&earg, rb_exec_arg_prepare(&earg, argc, argv, TRUE), errmsg, sizeof(errmsg));
     if (pid == -1) {
-        if (errmsg[0] == '\0')
-            rb_sys_fail(RSTRING_PTR(argv[0]));
-        rb_sys_fail(errmsg);
+	const char *prog = errmsg;
+	if (!prog[0] && !(prog = earg.prog) && earg.argc) {
+	    prog = RSTRING_PTR(earg.argv[0]);
+	}
+	rb_sys_fail(prog);
     }
 #if defined(HAVE_FORK) || defined(HAVE_SPAWNV)
     return PIDT2NUM(pid);
Index: ruby_1_9_2/version.h
===================================================================
--- ruby_1_9_2/version.h	(revision 27984)
+++ ruby_1_9_2/version.h	(revision 27985)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2010-05-23"
+#define RUBY_RELEASE_DATE "2010-05-24"
 #define RUBY_PATCHLEVEL -1
 
 #define RUBY_VERSION_MAJOR 1
@@ -7,7 +7,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2010
 #define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 23
+#define RUBY_RELEASE_DAY 24
 
 #include "ruby/version.h"
 
Index: ruby_1_9_2/test/ruby/test_process.rb
===================================================================
--- ruby_1_9_2/test/ruby/test_process.rb	(revision 27984)
+++ ruby_1_9_2/test/ruby/test_process.rb	(revision 27985)
@@ -236,6 +236,17 @@
       system({"F=O"=>"BAR"}, *TRUECOMMAND)
     }
 
+    with_tmpchdir {|d|
+      prog = "#{d}/notexist"
+      e = assert_raise(Errno::ENOENT) {
+        Process.wait Process.spawn({"FOO"=>"BAR"}, prog)
+      }
+      assert_equal(prog, e.message.sub(/.* - /, ''))
+      e = assert_raise(Errno::ENOENT) {
+        Process.wait Process.spawn({"FOO"=>"BAR"}, [prog, "blar"])
+      }
+      assert_equal(prog, e.message.sub(/.* - /, ''))
+    }
     h = {}
     cmd = [h, RUBY]
     (ENV.keys + MANDATORY_ENVS).each do |k|

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

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