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

ruby-changes:4728

From: ko1@a...
Date: Mon, 28 Apr 2008 09:12:07 +0900 (JST)
Subject: [ruby-changes:4728] akr - Ruby:r16222 (trunk): * include/ruby/intern.h (rb_exec_arg_init): declared.

akr	2008-04-28 09:11:46 +0900 (Mon, 28 Apr 2008)

  New Revision: 16222

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/intern.h
    trunk/io.c
    trunk/process.c

  Log:
    * include/ruby/intern.h (rb_exec_arg_init): declared.
      (rb_exec_arg_addopt): delared.
      (rb_exec_arg_fix): declared.
      (rb_exec_initarg): removed.
      (rb_exec_getargs): removed.
      (rb_exec_initarg2): removed.
    
    * io.c (struct popen_arg): make execarg as a pointer.
      (popen_exec): follow popen_arg change.
      (pipe_open): add eargp argument.  extract argc and argv from eargp.
      use rb_exec_arg_addopt to add redirect options.
      (pipe_open_v): set up struct rb_exec_arg.
      (pipe_open_s): set up struct rb_exec_arg.
    
    * process.c (rb_exec_arg_addopt): new function extracted from
      check_exec_options_i.
      (check_exec_options_i): use rb_exec_arg_addopt.
      (rb_check_exec_options): opthash is always a hash now.
      (rb_exec_getargs): make it static.
      (rb_exec_fillarg): renamed from rb_exec_initarg2.  don't set up
      redirect_fds.
      (rb_exec_arg_init): new function.
      (rb_exec_arg_fix): new function.
      (rb_f_exec): use rb_exec_arg_init and rb_exec_arg_fix.  use
      rb_exec_arg_addopt to set close_others option.
      (run_exec_options): make close_others by default.
      (rb_spawn_internal): use rb_exec_arg_init and rb_exec_arg_fix.  use
      rb_exec_arg_addopt to set close_others option.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16222&r2=16221&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=16222&r2=16221&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/process.c?r1=16222&r2=16221&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=16222&r2=16221&diff_format=u

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 16221)
+++ include/ruby/intern.h	(revision 16222)
@@ -453,9 +453,9 @@
 };
 int rb_proc_exec_n(int, VALUE*, const char*);
 int rb_proc_exec(const char*);
-VALUE rb_exec_initarg(int argc, VALUE *argv, int accept_shell, struct rb_exec_arg *e);
-VALUE rb_exec_getargs(int *argc_p, VALUE **argv_p, int accept_shell, VALUE *env_ret, VALUE *opthash_ret);
-void rb_exec_initarg2(VALUE prog, int argc, VALUE *argv, VALUE env, VALUE opthash, struct rb_exec_arg *e);
+VALUE rb_exec_arg_init(int argc, VALUE *argv, int accept_shell, struct rb_exec_arg *e);
+int rb_exec_arg_addopt(struct rb_exec_arg *e, VALUE key, VALUE val);
+void rb_exec_arg_fix(struct rb_exec_arg *e);
 int rb_exec(const struct rb_exec_arg*);
 rb_pid_t rb_fork(int*, int (*)(void*), void*, VALUE);
 VALUE rb_f_exec(int,VALUE*);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16221)
+++ ChangeLog	(revision 16222)
@@ -1,3 +1,34 @@
+Mon Apr 28 09:02:43 2008  Tanaka Akira  <akr@f...>
+
+	* include/ruby/intern.h (rb_exec_arg_init): declared.
+	  (rb_exec_arg_addopt): delared.
+	  (rb_exec_arg_fix): declared.
+	  (rb_exec_initarg): removed.
+	  (rb_exec_getargs): removed.
+	  (rb_exec_initarg2): removed.
+
+	* io.c (struct popen_arg): make execarg as a pointer.
+	  (popen_exec): follow popen_arg change.
+	  (pipe_open): add eargp argument.  extract argc and argv from eargp.
+	  use rb_exec_arg_addopt to add redirect options.
+	  (pipe_open_v): set up struct rb_exec_arg.
+	  (pipe_open_s): set up struct rb_exec_arg.
+
+	* process.c (rb_exec_arg_addopt): new function extracted from
+	  check_exec_options_i.
+	  (check_exec_options_i): use rb_exec_arg_addopt.
+	  (rb_check_exec_options): opthash is always a hash now.
+	  (rb_exec_getargs): make it static.
+	  (rb_exec_fillarg): renamed from rb_exec_initarg2.  don't set up
+	  redirect_fds.
+	  (rb_exec_arg_init): new function.
+	  (rb_exec_arg_fix): new function.
+	  (rb_f_exec): use rb_exec_arg_init and rb_exec_arg_fix.  use
+	  rb_exec_arg_addopt to set close_others option.
+	  (run_exec_options): make close_others by default.
+	  (rb_spawn_internal): use rb_exec_arg_init and rb_exec_arg_fix.  use
+	  rb_exec_arg_addopt to set close_others option.
+
 Sun Apr 27 18:59:04 2008  Tadayoshi Funaba  <tadf@d...>
 
 	* rational.c (nurat_expt): use f_rational_new2. [ruby-dev:34524]
Index: io.c
===================================================================
--- io.c	(revision 16221)
+++ io.c	(revision 16222)
@@ -3608,7 +3608,7 @@
 
 #ifdef HAVE_FORK
 struct popen_arg {
-    struct rb_exec_arg exec;
+    struct rb_exec_arg *execp;
     int modef;
     int pair[2];
     int write_pair[2];
@@ -3673,13 +3673,12 @@
     struct popen_arg *p = (struct popen_arg*)pp;
 
     rb_thread_atfork();
-    return rb_exec(&p->exec);
+    return rb_exec(p->execp);
 }
 #endif
 
 static VALUE
-pipe_open(VALUE prog, int argc, VALUE *argv,
-    VALUE env, VALUE opthash, const char *mode)
+pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 {
     int modef = rb_io_mode_flags(mode);
     int pid = 0;
@@ -3690,7 +3689,6 @@
 #if defined(HAVE_FORK)
     int status;
     struct popen_arg arg;
-    VALUE env2 = 0;
 #elif defined(_WIN32)
     int openmode = rb_io_mode_modenum(mode);
     const char *exename = NULL;
@@ -3700,15 +3698,30 @@
     int fd = -1;
     int write_fd = -1;
     const char *cmd = 0;
+    int argc;
+    VALUE *argv;
 
     if (prog)
         cmd = StringValueCStr(prog);
 
+    if (!eargp) {
+        /* fork : IO.popen("-") */
+        argc = 0;
+        argv = 0;
+    }
+    else if (eargp->argc) {
+        /* no shell : IO.popen([prog, arg0], arg1, ...) */
+        argc = eargp->argc;
+        argv = eargp->argv;
+    }
+    else {
+        /* with shell : IO.popen(prog) */
+        argc = 0;
+        argv = 0;
+    }
+
 #if defined(HAVE_FORK)
-    if (prog) {
-        env2 = rb_hash_new();
-        RBASIC(env2)->klass = 0;
-    }
+    arg.execp = eargp;
     arg.modef = modef;
     arg.pair[0] = arg.pair[1] = -1;
     arg.write_pair[0] = arg.write_pair[1] = -1;
@@ -3725,40 +3738,31 @@
             rb_sys_fail(cmd);
         }
         UPDATE_MAXFD_PIPE(arg.pair);
-        if (env2) {
-            rb_hash_aset(env2, INT2FIX(0), INT2FIX(arg.write_pair[0]));
-            rb_hash_aset(env2, INT2FIX(1), INT2FIX(arg.pair[1]));
+        if (eargp) {
+            rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(arg.write_pair[0]));
+            rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(arg.pair[1]));
         }
 	break;
       case FMODE_READABLE:
         if (pipe(arg.pair) < 0)
             rb_sys_fail(cmd);
         UPDATE_MAXFD_PIPE(arg.pair);
-        if (env2)
-            rb_hash_aset(env2, INT2FIX(1), INT2FIX(arg.pair[1]));
+        if (eargp)
+            rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(arg.pair[1]));
 	break;
       case FMODE_WRITABLE:
         if (pipe(arg.pair) < 0)
             rb_sys_fail(cmd);
         UPDATE_MAXFD_PIPE(arg.pair);
-        if (env2)
-            rb_hash_aset(env2, INT2FIX(0), INT2FIX(arg.pair[0]));
+        if (eargp)
+            rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(arg.pair[0]));
 	break;
       default:
         rb_sys_fail(cmd);
     }
-    if (prog) {
-        VALUE close_others = ID2SYM(rb_intern("close_others"));
-        if (NIL_P(opthash) || !st_lookup(RHASH_TBL(opthash), close_others, 0))
-            rb_hash_aset(env2, close_others, Qtrue);
-        if (NIL_P(opthash))
-            opthash = env2;
-        else {
-            opthash = rb_assoc_new(env2, opthash);
-            RBASIC(opthash)->klass = 0;
-        }
-        rb_exec_initarg2(prog, argc, argv, env, opthash, &arg.exec);
-	pid = rb_fork(&status, popen_exec, &arg, arg.exec.redirect_fds);
+    if (eargp) {
+        rb_exec_arg_fix(arg.execp);
+	pid = rb_fork(&status, popen_exec, &arg, arg.execp->redirect_fds);
     }
     else {
 	fflush(stdin);		/* is it really needed? */
@@ -3871,9 +3875,10 @@
 static VALUE
 pipe_open_v(int argc, VALUE *argv, const char *mode)
 {
-    VALUE prog, env=Qnil, opthash=Qnil;
-    prog = rb_exec_getargs(&argc, &argv, Qfalse, &env, &opthash);
-    return pipe_open(prog, argc, argv, env, opthash, mode);
+    VALUE prog;
+    struct rb_exec_arg earg;
+    prog = rb_exec_arg_init(argc, argv, Qfalse, &earg);
+    return pipe_open(&earg, prog, mode);
 }
 
 static VALUE
@@ -3882,18 +3887,18 @@
     const char *cmd = RSTRING_PTR(prog);
     int argc = 1;
     VALUE *argv = &prog;
-    VALUE env=Qnil, opthash=Qnil;
+    struct rb_exec_arg earg;
 
     if (RSTRING_LEN(prog) == 1 && cmd[0] == '-') {
 #if !defined(HAVE_FORK)
 	rb_raise(rb_eNotImpError,
 		 "fork() function is unimplemented on this machine");
 #endif
-        return pipe_open(0, 0, 0, Qnil, Qnil, mode);
+        return pipe_open(0, 0, mode);
     }
 
-    rb_exec_getargs(&argc, &argv, Qtrue, &env, &opthash);
-    return pipe_open(prog, 0, 0, Qnil, Qnil, mode);
+    rb_exec_arg_init(argc, argv, Qtrue, &earg);
+    return pipe_open(&earg, prog, mode);
 }
 
 /*
Index: process.c
===================================================================
--- process.c	(revision 16221)
+++ process.c	(revision 16222)
@@ -1349,12 +1349,10 @@
 static int rlimit_type_by_lname(const char *name);
 #endif
 
-static int
-check_exec_options_i(st_data_t st_key, st_data_t st_val, st_data_t arg)
+int
+rb_exec_arg_addopt(struct rb_exec_arg *e, VALUE key, VALUE val)
 {
-    VALUE key = (VALUE)st_key;
-    VALUE val = (VALUE)st_val;
-    VALUE options = (VALUE)arg;
+    VALUE options = e->options;
     ID id;
 #ifdef RLIM2NUM
     int rtype;
@@ -1477,6 +1475,15 @@
     return ST_CONTINUE;
 }
 
+static int
+check_exec_options_i(st_data_t st_key, st_data_t st_val, st_data_t arg)
+{
+    VALUE key = (VALUE)st_key;
+    VALUE val = (VALUE)st_val;
+    struct rb_exec_arg *e = (struct rb_exec_arg *)arg;
+    return rb_exec_arg_addopt(e, key, val);
+}
+
 static VALUE
 check_exec_fds(VALUE options)
 {
@@ -1513,29 +1520,12 @@
     return h;
 }
 
-static VALUE
-rb_check_exec_options(VALUE opthash, VALUE *fds)
+static void
+rb_check_exec_options(VALUE opthash, struct rb_exec_arg *e)
 {
-    VALUE options, h;
-    int i;
-
-    options = hide_obj(rb_ary_new());
-
-    if (TYPE(opthash) == T_ARRAY) {
-        for (i = 0; i < RARRAY_LEN(opthash); i++) {
-            VALUE hash = RARRAY_PTR(opthash)[i];
-            st_foreach(RHASH_TBL(hash), check_exec_options_i, (st_data_t)options);
-        }
-    }
-    else {
-        st_foreach(RHASH_TBL(opthash), check_exec_options_i, (st_data_t)options);
-    }
-
-    h = check_exec_fds(options);
-    if (fds)
-        *fds = h;
-
-    return options;
+    if (RHASH_EMPTY_P(opthash))
+        return;
+    st_foreach(RHASH_TBL(opthash), check_exec_options_i, (st_data_t)e);
 }
 
 static int
@@ -1602,15 +1592,15 @@
     return prog;
 }
 
-VALUE
-rb_exec_getargs(int *argc_p, VALUE **argv_p, int accept_shell, VALUE *env_ret, VALUE *options_ret)
+static VALUE
+rb_exec_getargs(int *argc_p, VALUE **argv_p, int accept_shell, VALUE *env_ret, VALUE *opthash_ret, struct rb_exec_arg *e)
 {
     VALUE hash, prog;
 
     if (0 < *argc_p) {
         hash = rb_check_convert_type((*argv_p)[*argc_p-1], T_HASH, "Hash", "to_hash");
         if (!NIL_P(hash)) {
-            *options_ret = hash;
+            *opthash_ret = hash;
             (*argc_p)--;
         }
     }
@@ -1634,41 +1624,43 @@
     return prog;
 }
 
-void
-rb_exec_initarg2(VALUE prog, int argc, VALUE *argv,
-    VALUE env, VALUE opthash, struct rb_exec_arg *e)
+static void
+rb_exec_fillarg(VALUE prog, int argc, VALUE *argv, VALUE env, VALUE opthash, struct rb_exec_arg *e)
 {
-    VALUE options=Qnil, fds=Qnil;
-
+    VALUE options;
     MEMZERO(e, struct rb_exec_arg, 1);
+    options = hide_obj(rb_ary_new());
+    e->options = options;
 
     if (!NIL_P(opthash)) {
-        options = rb_check_exec_options(opthash, &fds);
+        rb_check_exec_options(opthash, e);
     }
     if (!NIL_P(env)) {
         env = rb_check_exec_env(env);
-        if (NIL_P(options))
-            options = hide_obj(rb_ary_new());
         rb_ary_store(options, EXEC_OPTION_ENV, env);
     }
 
     e->argc = argc;
     e->argv = argv;
     e->prog = prog ? RSTRING_PTR(prog) : 0;
-    e->options = options;
-    e->redirect_fds = fds;
 }
 
-
 VALUE
-rb_exec_initarg(int argc, VALUE *argv, int accept_shell, struct rb_exec_arg *e)
+rb_exec_arg_init(int argc, VALUE *argv, int accept_shell, struct rb_exec_arg *e)
 {
-    VALUE prog, env=Qnil, opthash=Qnil;
-    prog = rb_exec_getargs(&argc, &argv, accept_shell, &env, &opthash);
-    rb_exec_initarg2(prog, argc, argv, env, opthash, e);
+    VALUE prog;
+    VALUE env = Qnil, opthash = Qnil;
+    prog = rb_exec_getargs(&argc, &argv, accept_shell, &env, &opthash, e);
+    rb_exec_fillarg(prog, argc, argv, env, opthash, e);
     return prog;
 }
 
+void
+rb_exec_arg_fix(struct rb_exec_arg *e)
+{
+    e->redirect_fds = check_exec_fds(e->options);
+}
+
 /*
  *  call-seq:
  *     exec([env,] command [, arg, ...] [,options])
@@ -1704,12 +1696,15 @@
 VALUE
 rb_f_exec(int argc, VALUE *argv)
 {
-    struct rb_exec_arg e;
+    struct rb_exec_arg earg;
 
-    rb_exec_initarg(argc, argv, Qtrue, &e);
+    rb_exec_arg_init(argc, argv, Qtrue, &earg);
+    if (NIL_P(rb_ary_entry(earg.options, EXEC_OPTION_CLOSE_OTHERS)))
+        rb_exec_arg_addopt(&earg, ID2SYM(rb_intern("close_others")), Qfalse);
+    rb_exec_arg_fix(&earg);
 
-    rb_exec(&e);
-    rb_sys_fail(e.prog);
+    rb_exec(&earg);
+    rb_sys_fail(earg.prog);
     return Qnil;		/* dummy */
 }
 
@@ -2055,7 +2050,7 @@
 
 #ifdef HAVE_FORK
     obj = rb_ary_entry(options, EXEC_OPTION_CLOSE_OTHERS);
-    if (RTEST(obj)) {
+    if (obj != Qfalse) {
         rb_close_before_exec(3, FIX2INT(obj), e->redirect_fds);
     }
 #endif
@@ -2550,24 +2545,13 @@
     rb_pid_t status;
     VALUE prog;
     struct rb_exec_arg earg;
-    int argc2 = argc;
-    VALUE *argv2 = argv, env = Qnil, opthash = Qnil;
-    VALUE close_others = ID2SYM(rb_intern("close_others"));
 
-    prog = rb_exec_getargs(&argc2, &argv2, Qtrue, &env, &opthash);
-    if (default_close_others) {
-        if (NIL_P(opthash)) {
-            opthash = rb_hash_new();
-            RBASIC(opthash)->klass = 0;
-        }
-        if (RBASIC(opthash)->klass) {
-            opthash = rb_hash_dup(opthash);
-            RBASIC(opthash)->klass = 0;
-        }
-        if (!st_lookup(RHASH_TBL(opthash), close_others, 0))
-            rb_hash_aset(opthash, close_others, Qtrue);
+    prog = rb_exec_arg_init(argc, argv, Qtrue, &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_initarg2(prog, argc2, argv2, env, opthash, &earg);
+    rb_exec_arg_fix(&earg);
 
 #if defined HAVE_FORK
     status = rb_fork(&status, rb_exec_atfork, &earg, earg.redirect_fds);

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

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