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

ruby-changes:24144

From: akr <ko1@a...>
Date: Sat, 23 Jun 2012 15:23:49 +0900 (JST)
Subject: [ruby-changes:24144] akr:r36195 (trunk): * internal.h (rb_execarg): add chdir_given and chdir_dir fields.

akr	2012-06-23 15:23:35 +0900 (Sat, 23 Jun 2012)

  New Revision: 36195

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

  Log:
    * internal.h (rb_execarg): add chdir_given and chdir_dir fields.
    
    * process.c (EXEC_OPTION_CHDIR): removed.
      (mark_exec_arg): mark chdir_dir field.
      (rb_execarg_addopt): update the new fields, instead of options array.
      (rb_execarg_run_options): use the new fields.

  Modified files:
    trunk/ChangeLog
    trunk/internal.h
    trunk/process.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36194)
+++ ChangeLog	(revision 36195)
@@ -1,3 +1,12 @@
+Sat Jun 23 14:29:25 2012  Tanaka Akira  <akr@f...>
+
+	* internal.h (rb_execarg): add chdir_given and chdir_dir fields.
+
+	* process.c (EXEC_OPTION_CHDIR): removed.
+	  (mark_exec_arg): mark chdir_dir field.
+	  (rb_execarg_addopt): update the new fields, instead of options array.
+	  (rb_execarg_run_options): use the new fields.
+
 Sat Jun 23 13:20:47 2012  Tanaka Akira  <akr@f...>
 
 	* internal.h (rb_execarg): add close_others_given, close_others_do and
Index: process.c
===================================================================
--- process.c	(revision 36194)
+++ process.c	(revision 36195)
@@ -1256,7 +1256,6 @@
 enum {
     EXEC_OPTION_RLIMIT,
     EXEC_OPTION_ENV,
-    EXEC_OPTION_CHDIR,
     EXEC_OPTION_DUP2,
     EXEC_OPTION_CLOSE,
     EXEC_OPTION_OPEN,
@@ -1281,6 +1280,7 @@
     rb_gc_mark(eargp->envp_str);
     rb_gc_mark(eargp->envp_buf);
     rb_gc_mark(eargp->dup2_tmpbuf);
+    rb_gc_mark(eargp->chdir_dir);
 }
 
 static void
@@ -1622,12 +1622,12 @@
             eargp->unsetenv_others_do = RTEST(val) ? 1 : 0;
         }
         else if (id == rb_intern("chdir")) {
-            if (!NIL_P(rb_ary_entry(options, EXEC_OPTION_CHDIR))) {
+            if (eargp->chdir_given) {
                 rb_raise(rb_eArgError, "chdir option specified twice");
             }
             FilePathValue(val);
-            rb_ary_store(options, EXEC_OPTION_CHDIR,
-                                  hide_obj(rb_str_dup(val)));
+            eargp->chdir_given = 1;
+            eargp->chdir_dir = hide_obj(rb_str_dup(val));
         }
         else if (id == rb_intern("umask")) {
 	    mode_t cmask = NUM2MODET(val);
@@ -2818,15 +2818,14 @@
             return -1;
     }
 
-    obj = rb_ary_entry(options, EXEC_OPTION_CHDIR);
-    if (!NIL_P(obj)) {
+    if (eargp->chdir_given) {
         if (sargp) {
             char *cwd = my_getcwd();
-            rb_ary_store(sargp->options, EXEC_OPTION_CHDIR,
-                         hide_obj(rb_str_new2(cwd)));
+            sargp->chdir_given = 1;
+            sargp->chdir_dir = hide_obj(rb_str_new2(cwd));
             xfree(cwd);
         }
-        if (chdir(RSTRING_PTR(obj)) == -1) { /* async-signal-safe */
+        if (chdir(RSTRING_PTR(eargp->chdir_dir)) == -1) { /* async-signal-safe */
             ERRMSG("chdir");
             return -1;
         }
Index: internal.h
===================================================================
--- internal.h	(revision 36194)
+++ internal.h	(revision 36195)
@@ -182,9 +182,11 @@
     unsigned unsetenv_others_do : 1;
     unsigned close_others_given : 1;
     unsigned close_others_do : 1;
+    unsigned chdir_given : 1;
     pid_t pgroup_pgid; /* asis(-1), new pgroup(0), specified pgroup (0<V). */
     mode_t umask_mask;
     int close_others_maxhint;
+    VALUE chdir_dir;
 };
 
 /* argv_str contains extra two elements.

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

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