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/