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

ruby-changes:4173

From: ko1@a...
Date: Sat, 1 Mar 2008 17:59:19 +0900 (JST)
Subject: [ruby-changes:4173] nobu - Ruby:r15663 (trunk): * io.c (struct argf): packed ARGF stuffs.

nobu	2008-03-01 17:59:04 +0900 (Sat, 01 Mar 2008)

  New Revision: 15663

  Modified files:
    trunk/ChangeLog
    trunk/io.c
    trunk/ruby.c

  Log:
    * io.c (struct argf): packed ARGF stuffs.
    
    * ruby.c (proc_options): use ruby_set_inplace_mode().


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ruby.c?r1=15663&r2=15662&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15663&r2=15662&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15663&r2=15662&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15662)
+++ ChangeLog	(revision 15663)
@@ -1,3 +1,9 @@
+Sat Mar  1 17:59:01 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* io.c (struct argf): packed ARGF stuffs.
+
+	* ruby.c (proc_options): use ruby_set_inplace_mode().
+
 Sat Mar  1 17:51:34 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/test/unit/collector/dir.rb (recursive_collect): do not always
Index: io.c
===================================================================
--- io.c	(revision 15662)
+++ io.c	(revision 15663)
@@ -125,15 +125,21 @@
 
 static ID id_write, id_read, id_getc, id_flush, id_encode;
 
-extern char *ruby_inplace_mode;
-
 struct timeval rb_time_interval(VALUE);
 
-static VALUE filename, current_file;
-static int gets_lineno;
-static int init_p = 0, next_p = 0;
-static VALUE lineno = INT2FIX(0);
+struct argf {
+    VALUE filename, current_file;
+    int gets_lineno;
+    int init_p, next_p;
+    VALUE lineno;
+    VALUE argv;
+    char *inplace;
+    int binmode;
+    rb_encoding *enc, *enc2;
+};
 
+#define ARGF (*(struct argf *)DATA_PTR(argf))
+
 #ifdef _STDIO_USES_IOSTREAM  /* GNU libc */
 #  ifdef _IO_fpos_t
 #    define STDIO_READ_DATA_PENDING(fp) ((fp)->_IO_read_ptr != (fp)->_IO_read_end)
@@ -235,7 +241,7 @@
 
 static int io_fflush(rb_io_t *);
 
-static VALUE
+VALUE
 rb_io_get_io(VALUE io)
 {
     return rb_convert_type(io, T_FILE, "IO", "to_io");
@@ -691,9 +697,8 @@
         fptr->wbuf_capa = 8192;
         fptr->wbuf = ALLOC_N(char, fptr->wbuf_capa);
     }
-    if ((fptr->mode & FMODE_SYNC) ||
-        (fptr->wbuf && fptr->wbuf_capa <= fptr->wbuf_len + len) ||
-        (fptr->mode & FMODE_TTY)) {
+    if ((fptr->mode & (FMODE_SYNC|FMODE_TTY)) ||
+        (fptr->wbuf && fptr->wbuf_capa <= fptr->wbuf_len + len)) {
         /* xxx: use writev to avoid double write if available */
         if (fptr->wbuf_len && fptr->wbuf_len+len <= fptr->wbuf_capa) {
             if (fptr->wbuf_capa < fptr->wbuf_off+fptr->wbuf_len+len) {
@@ -990,8 +995,8 @@
 
     GetOpenFile(io, fptr);
     if (io_seek(fptr, 0L, 0) < 0) rb_sys_fail(fptr->path);
-    if (io == current_file) {
-	gets_lineno -= fptr->lineno;
+    if (io == ARGF.current_file) {
+	ARGF.gets_lineno -= fptr->lineno;
     }
     fptr->lineno = 0;
 
@@ -1841,7 +1846,7 @@
     str = io_enc_str(str, fptr);
     if (!fptr->enc2) ENC_CODERANGE_SET(str, cr);
     fptr->lineno++;
-    lineno = INT2FIX(fptr->lineno);
+    ARGF.lineno = INT2FIX(fptr->lineno);
     return str;
 }
 
@@ -1972,7 +1977,7 @@
     if (!NIL_P(str)) {
 	if (!nolimit) {
 	    fptr->lineno++;
-	    lineno = INT2FIX(fptr->lineno);
+	    ARGF.lineno = INT2FIX(fptr->lineno);
 	}
     }
 
@@ -2088,27 +2093,6 @@
     return lineno;
 }
 
-static void
-lineno_setter(VALUE val, ID id, VALUE *var)
-{
-    gets_lineno = NUM2INT(val);
-    *var = INT2FIX(gets_lineno);
-}
-
-static VALUE
-argf_set_lineno(VALUE argf, VALUE val)
-{
-    gets_lineno = NUM2INT(val);
-    lineno = INT2FIX(gets_lineno);
-    return Qnil;
-}
-
-static VALUE
-argf_lineno(void)
-{
-    return lineno;
-}
-
 /*
  *  call-seq:
  *     ios.readline(sep=$/)     => string
@@ -4727,7 +4711,8 @@
     return io;
 }
 
-FILE *rb_io_stdio_file(rb_io_t *fptr)
+FILE *
+rb_io_stdio_file(rb_io_t *fptr)
 {
     if (!fptr->stdio_file) {
         fptr->stdio_file = rb_fdopen(fptr->fd, rb_io_flags_mode(fptr->mode));
@@ -4903,22 +4888,85 @@
     return io;
 }
 
-static int argf_binmode = 0;
-static rb_encoding *argf_enc, *argf_enc2;
+static void
+argf_mark(void *ptr)
+{
+    struct argf *p = ptr;
+    rb_gc_mark(p->filename);
+    rb_gc_mark(p->current_file);
+    rb_gc_mark(p->lineno);
+    rb_gc_mark(p->argv);
+}
 
+static void
+argf_free(void *ptr)
+{
+    struct argf *p = ptr;
+    free(p->inplace);
+}
+
 static VALUE
-argf_forward(int argc, VALUE *argv)
+argf_alloc(VALUE klass)
 {
+    struct argf *p;
+    VALUE argf = Data_Make_Struct(klass, struct argf, argf_mark, argf_free, p);
+
+    p->filename = Qnil;
+    p->current_file = Qnil;
+    p->lineno = Qnil;
+    p->argv = Qnil;
+    return argf;
+}
+
+#define filename          ARGF.filename
+#define current_file      ARGF.current_file
+#define gets_lineno       ARGF.gets_lineno
+#define init_p            ARGF.init_p
+#define next_p            ARGF.next_p
+#define lineno            ARGF.lineno
+#define ruby_inplace_mode ARGF.inplace
+#define argf_binmode      ARGF.binmode
+#define argf_enc          ARGF.enc
+#define argf_enc2         ARGF.enc2
+#define rb_argv           ARGF.argv
+
+static VALUE
+argf_initialize(VALUE argf, VALUE argv)
+{
+    rb_argv = argv;
+    return argf;
+}
+
+static VALUE
+argf_set_lineno(VALUE argf, VALUE val)
+{
+    gets_lineno = NUM2INT(val);
+    lineno = INT2FIX(gets_lineno);
+    return Qnil;
+}
+
+static VALUE
+argf_lineno(VALUE argf)
+{
+    return lineno;
+}
+
+static VALUE
+argf_forward(int argc, VALUE *argv, VALUE argf)
+{
     return rb_funcall3(current_file, rb_frame_this_func(), argc, argv);
 }
 
+#define next_argv() argf_next_argv(argf)
+#define ARGF_GENERIC_INPUT_P() \
+    (current_file == rb_stdin && TYPE(current_file) != T_FILE)
 #define ARGF_FORWARD(argc, argv) do {\
-  if (current_file == rb_stdin && TYPE(current_file) != T_FILE)\
-     return argf_forward(argc, argv);\
+    if (ARGF_GENERIC_INPUT_P())\
+	return argf_forward(argc, argv, argf);\
 } while (0)
 #define NEXT_ARGF_FORWARD(argc, argv) do {\
-     if (!next_argv()) return Qnil;\
-     ARGF_FORWARD(argc, argv);\
+    if (!next_argv()) return Qnil;\
+    ARGF_FORWARD(argc, argv);\
 } while (0)
 
 static void
@@ -4928,9 +4976,8 @@
 }
 
 static int
-next_argv(void)
+argf_next_argv(VALUE argf)
 {
-    extern VALUE rb_argv;
     char *fn;
     rb_io_t *fptr;
     int stdout_binmode = 0;
@@ -4942,7 +4989,7 @@
     }
 
     if (init_p == 0) {
-	if (RARRAY_LEN(rb_argv) > 0) {
+	if (!NIL_P(rb_argv) && RARRAY_LEN(rb_argv) > 0) {
 	    next_p = 1;
 	}
 	else {
@@ -5062,7 +5109,7 @@
 
   retry:
     if (!next_argv()) return Qnil;
-    if (current_file == rb_stdin && TYPE(current_file) != T_FILE) {
+    if (ARGF_GENERIC_INPUT_P()) {
 	line = rb_funcall3(current_file, rb_intern("gets"), argc, argv);
     }
     else {
@@ -5085,6 +5132,22 @@
     return line;
 }
 
+static VALUE
+argf_lineno_getter(ID id, VALUE *var)
+{
+    VALUE argf = *var;
+    return lineno;
+}
+
+static void
+argf_lineno_setter(VALUE val, ID id, VALUE *var)
+{
+    VALUE argf = *var;
+    int n = NUM2INT(val);
+    gets_lineno = n;
+    lineno = INT2FIX(n);
+}
+
 /*
  *  call-seq:
  *     gets(sep=$/)    => string or nil
@@ -6101,19 +6164,19 @@
 }
 
 static VALUE
-argf_external_encoding(void)
+argf_external_encoding(VALUE argf)
 {
     return rb_io_external_encoding(current_file);
 }
 
 static VALUE
-argf_internal_encoding(void)
+argf_internal_encoding(VALUE argf)
 {
     return rb_io_internal_encoding(current_file);
 }
 
 static VALUE
-argf_set_encoding(int argc, VALUE *argv, VALUE io)
+argf_set_encoding(int argc, VALUE *argv, VALUE argf)
 {
     rb_io_t *fptr;
 
@@ -6124,7 +6187,7 @@
     GetOpenFile(current_file, fptr);
     argf_enc = fptr->enc;
     argf_enc2 = fptr->enc2;
-    return io;
+    return argf;
 }
 
 static VALUE
@@ -6199,7 +6262,7 @@
 }
 
 static VALUE
-argf_read(int argc, VALUE *argv)
+argf_read(int argc, VALUE *argv, VALUE argf)
 {
     VALUE tmp, str, length;
     long len = 0;
@@ -6218,8 +6281,8 @@
     if (!next_argv()) {
 	return str;
     }
-    if (current_file == rb_stdin && TYPE(current_file) != T_FILE) {
-	tmp = argf_forward(argc, argv);
+    if (ARGF_GENERIC_INPUT_P()) {
+	tmp = argf_forward(argc, argv, argf);
     }
     else {
 	tmp = io_read(argc, argv, current_file);
@@ -6246,18 +6309,19 @@
 struct argf_call_arg {
     int argc;
     VALUE *argv;
+    VALUE argf;
 };
 
 static VALUE
 argf_forward_call(VALUE arg)
 {
     struct argf_call_arg *p = (struct argf_call_arg *)arg;
-    argf_forward(p->argc, p->argv);
+    argf_forward(p->argc, p->argv, p->argf);
     return Qnil;
 }
 
 static VALUE
-argf_readpartial(int argc, VALUE *argv)
+argf_readpartial(int argc, VALUE *argv, VALUE argf)
 {
     VALUE tmp, str, length;
 
@@ -6271,10 +6335,11 @@
         rb_str_resize(str, 0);
         rb_eof_error();
     }
-    if (current_file == rb_stdin && TYPE(current_file) != T_FILE) {
+    if (ARGF_GENERIC_INPUT_P()) {
 	struct argf_call_arg arg;
 	arg.argc = argc;
 	arg.argv = argv;
+	arg.argf = argf;
 	tmp = rb_rescue2(argf_forward_call, (VALUE)&arg,
 			 RUBY_METHOD_FUNC(0), Qnil, rb_eEOFError, (VALUE)0);
     }
@@ -6303,7 +6368,7 @@
 
   retry:
     if (!next_argv()) return Qnil;
-    if (current_file == rb_stdin && TYPE(current_file) != T_FILE) {
+    if (ARGF_GENERIC_INPUT_P()) {
 	ch = rb_funcall3(current_file, rb_intern("getc"), 0, 0);
     }
     else {
@@ -6388,9 +6453,9 @@
 }
 
 static VALUE
-argf_each_byte(VALUE self)
+argf_each_byte(VALUE argf)
 {
-    RETURN_ENUMERATOR(self, 0, 0);
+    RETURN_ENUMERATOR(argf, 0, 0);
     for (;;) {
 	if (!next_argv()) return Qnil;
 	rb_block_call(current_file, rb_intern("each_byte"), 0, 0, rb_yield, 0);
@@ -6399,21 +6464,27 @@
 }
 
 static VALUE
-argf_filename(void)
+argf_filename(VALUE argf)
 {
     next_argv();
     return filename;
 }
 
 static VALUE
-argf_file(void)
+argf_filename_getter(ID id, VALUE *var)
 {
+    return argf_filename(*var);
+}
+
+static VALUE
+argf_file(VALUE argf)
+{
     next_argv();
     return current_file;
 }
 
 static VALUE
-argf_binmode_m(void)
+argf_binmode_m(VALUE argf)
 {
     argf_binmode = 1;
     next_argv();
@@ -6423,7 +6494,7 @@
 }
 
 static VALUE
-argf_skip(void)
+argf_skip(VALUE argf)
 {
     if (next_p != -1) {
 	argf_close(current_file);
@@ -6433,7 +6504,7 @@
 }
 
 static VALUE
-argf_close_m(void)
+argf_close_m(VALUE argf)
 {
     next_argv();
     argf_close(current_file);
@@ -6445,7 +6516,7 @@
 }
 
 static VALUE
-argf_closed(void)
+argf_closed(VALUE argf)
 {
     next_argv();
     ARGF_FORWARD(0, 0);
@@ -6453,32 +6524,80 @@
 }
 
 static VALUE
-argf_to_s(void)
+argf_to_s(VALUE argf)
 {
     return rb_str_new2("ARGF");
 }
 
 static VALUE
-opt_i_get(void)
+argf_inplace_mode_get(VALUE argf)
 {
     if (!ruby_inplace_mode) return Qnil;
     return rb_str_new2(ruby_inplace_mode);
 }
 
-static void
-opt_i_set(VALUE val)
+static VALUE
+opt_i_get(ID id, VALUE *var)
 {
+    return argf_inplace_mode_get(*var);
+}
+
+static VALUE
+argf_inplace_mode_set(VALUE argf, VALUE val)
+{
     if (!RTEST(val)) {
 	if (ruby_inplace_mode) free(ruby_inplace_mode);
 	ruby_inplace_mode = 0;
-	return;
     }
-    StringValue(val);
+    else {
+	StringValue(val);
+	if (ruby_inplace_mode) free(ruby_inplace_mode);
+	ruby_inplace_mode = 0;
+	ruby_inplace_mode = strdup(RSTRING_PTR(val));
+    }
+    return argf;
+}
+
+static void
+opt_i_set(VALUE val, ID id, VALUE *var)
+{
+    argf_inplace_mode_set(*var, val);
+}
+
+const char *
+ruby_get_inplace_mode(void)
+{
+    return ruby_inplace_mode;
+}
+
+void
+ruby_set_inplace_mode(const char *suffix)
+{
     if (ruby_inplace_mode) free(ruby_inplace_mode);
     ruby_inplace_mode = 0;
-    ruby_inplace_mode = strdup(StringValueCStr(val));
+    if (suffix) ruby_inplace_mode = strdup(suffix);
 }
 
+static VALUE
+argf_argv(VALUE argf)
+{
+    return rb_argv;
+}
+
+static VALUE
+argf_argv_getter(ID id, VALUE *var)
+{
+    return argf_argv(*var);
+}
+
+VALUE
+rb_get_argv(void)
+{
+    return rb_argv;
+}
+
+#undef rb_argv
+
 /*
  *  Class <code>IO</code> is the basis for all input and output in Ruby.
  *  An I/O stream may be <em>duplexed</em> (that is, bidirectional), and
@@ -6558,6 +6677,7 @@
 void
 Init_IO(void)
 {
+    VALUE rb_cARGF;
 #ifdef __CYGWIN__
 #include <sys/cygwin.h>
     static struct __cygwin_perfile pf[] =
@@ -6627,7 +6747,6 @@
     rb_define_hooked_variable("$-0", &rb_rs, 0, rb_str_setter);
     rb_define_hooked_variable("$\\", &rb_output_rs, 0, rb_str_setter);
 
-    rb_define_hooked_variable("$.", &lineno, 0, lineno_setter);
     rb_define_virtual_variable("$_", rb_lastline_get, rb_lastline_set);
 
     rb_define_method(rb_cIO, "initialize_copy", rb_io_init_copy, 1);
@@ -6722,58 +6841,68 @@
     rb_define_global_const("STDOUT", rb_stdout);
     rb_define_global_const("STDERR", rb_stderr);
 
-    rb_define_readonly_variable("$<", &argf);
-    argf = rb_obj_alloc(rb_cObject);
-    rb_extend_object(argf, rb_mEnumerable);
-    rb_define_global_const("ARGF", argf);
+    argf = argf_alloc(rb_cObject);
+    argf_initialize(argf, rb_ary_new());
+    rb_cARGF = rb_singleton_class(argf);
 
-    rb_define_singleton_method(argf, "to_s", argf_to_s, 0);
+    rb_include_module(rb_cARGF, rb_mEnumerable);
 
-    rb_define_singleton_method(argf, "fileno", argf_fileno, 0);
-    rb_define_singleton_method(argf, "to_i", argf_fileno, 0);
-    rb_define_singleton_method(argf, "to_io", argf_to_io, 0);
-    rb_define_singleton_method(argf, "each",  argf_each_line, -1);
-    rb_define_singleton_method(argf, "each_line",  argf_each_line, -1);
-    rb_define_singleton_method(argf, "each_byte",  argf_each_byte, 0);
+    rb_define_method(rb_cARGF, "initialize", argf_initialize, 1);
+    rb_define_method(rb_cARGF, "to_s", argf_to_s, 0);
+    rb_define_method(rb_cARGF, "argv", argf_argv, 0);
 
-    rb_define_singleton_method(argf, "read",  argf_read, -1);
-    rb_define_singleton_method(argf, "readpartial",  argf_readpartial, -1);
-    rb_define_singleton_method(argf, "readlines", rb_f_readlines, -1);
-    rb_define_singleton_method(argf, "to_a", rb_f_readlines, -1);
-    rb_define_singleton_method(argf, "gets", rb_f_gets, -1);
-    rb_define_singleton_method(argf, "readline", rb_f_readline, -1);
-    rb_define_singleton_method(argf, "getc", argf_getc, 0);
-    rb_define_singleton_method(argf, "getbyte", argf_getbyte, 0);
-    rb_define_singleton_method(argf, "readchar", argf_readchar, 0);
-    rb_define_singleton_method(argf, "readbyte", argf_readbyte, 0);
-    rb_define_singleton_method(argf, "tell", argf_tell, 0);
-    rb_define_singleton_method(argf, "seek", argf_seek_m, -1);
-    rb_define_singleton_method(argf, "rewind", argf_rewind, 0);
-    rb_define_singleton_method(argf, "pos", argf_tell, 0);
-    rb_define_singleton_method(argf, "pos=", argf_set_pos, 1);
-    rb_define_singleton_method(argf, "eof", argf_eof, 0);
-    rb_define_singleton_method(argf, "eof?", argf_eof, 0);
-    rb_define_singleton_method(argf, "binmode", argf_binmode_m, 0);
+    rb_define_method(rb_cARGF, "fileno", argf_fileno, 0);
+    rb_define_method(rb_cARGF, "to_i", argf_fileno, 0);
+    rb_define_method(rb_cARGF, "to_io", argf_to_io, 0);
+    rb_define_method(rb_cARGF, "each",  argf_each_line, -1);
+    rb_define_method(rb_cARGF, "each_line",  argf_each_line, -1);
+    rb_define_method(rb_cARGF, "each_byte",  argf_each_byte, 0);
 
-    rb_define_singleton_method(argf, "filename", argf_filename, 0);
-    rb_define_singleton_method(argf, "path", argf_filename, 0);
-    rb_define_singleton_method(argf, "file", argf_file, 0);
-    rb_define_singleton_method(argf, "skip", argf_skip, 0);
-    rb_define_singleton_method(argf, "close", argf_close_m, 0);
-    rb_define_singleton_method(argf, "closed?", argf_closed, 0);
+    rb_define_method(rb_cARGF, "read",  argf_read, -1);
+    rb_define_method(rb_cARGF, "readpartial",  argf_readpartial, -1);
+    rb_define_method(rb_cARGF, "readlines", rb_f_readlines, -1);
+    rb_define_method(rb_cARGF, "to_a", rb_f_readlines, -1);
+    rb_define_method(rb_cARGF, "gets", rb_f_gets, -1);
+    rb_define_method(rb_cARGF, "readline", rb_f_readline, -1);
+    rb_define_method(rb_cARGF, "getc", argf_getc, 0);
+    rb_define_method(rb_cARGF, "getbyte", argf_getbyte, 0);
+    rb_define_method(rb_cARGF, "readchar", argf_readchar, 0);
+    rb_define_method(rb_cARGF, "readbyte", argf_readbyte, 0);
+    rb_define_method(rb_cARGF, "tell", argf_tell, 0);
+    rb_define_method(rb_cARGF, "seek", argf_seek_m, -1);
+    rb_define_method(rb_cARGF, "rewind", argf_rewind, 0);
+    rb_define_method(rb_cARGF, "pos", argf_tell, 0);
+    rb_define_method(rb_cARGF, "pos=", argf_set_pos, 1);
+    rb_define_method(rb_cARGF, "eof", argf_eof, 0);
+    rb_define_method(rb_cARGF, "eof?", argf_eof, 0);
+    rb_define_method(rb_cARGF, "binmode", argf_binmode_m, 0);
 
-    rb_define_singleton_method(argf, "lineno",   argf_lineno, 0);
-    rb_define_singleton_method(argf, "lineno=",  argf_set_lineno, 1);
+    rb_define_method(rb_cARGF, "filename", argf_filename, 0);
+    rb_define_method(rb_cARGF, "path", argf_filename, 0);
+    rb_define_method(rb_cARGF, "file", argf_file, 0);
+    rb_define_method(rb_cARGF, "skip", argf_skip, 0);
+    rb_define_method(rb_cARGF, "close", argf_close_m, 0);
+    rb_define_method(rb_cARGF, "closed?", argf_closed, 0);
 
-    rb_define_singleton_method(argf, "external_encoding", argf_external_encoding, 0);
-    rb_define_singleton_method(argf, "internal_encoding", argf_internal_encoding, 0);
-    rb_define_singleton_method(argf, "set_encoding", argf_set_encoding, -1);
+    rb_define_method(rb_cARGF, "lineno",   argf_lineno, 0);
+    rb_define_method(rb_cARGF, "lineno=",  argf_set_lineno, 1);
 
-    rb_global_variable(&current_file);
-    rb_define_readonly_variable("$FILENAME", &filename);
+    rb_define_method(rb_cARGF, "inplace_mode", argf_inplace_mode_get, 0);
+    rb_define_method(rb_cARGF, "inplace_mode=", argf_inplace_mode_set, 1);
+
+    rb_define_method(rb_cARGF, "external_encoding", argf_external_encoding, 0);
+    rb_define_method(rb_cARGF, "internal_encoding", argf_internal_encoding, 0);
+    rb_define_method(rb_cARGF, "set_encoding", argf_set_encoding, -1);
+
+    rb_define_readonly_variable("$<", &argf);
+    rb_define_global_const("ARGF", argf);
+
+    rb_define_hooked_variable("$.", &argf, argf_lineno_getter, argf_lineno_setter);
+    rb_define_hooked_variable("$FILENAME", &argf, argf_filename_getter, 0);
     filename = rb_str_new2("-");
 
-    rb_define_virtual_variable("$-i", opt_i_get, opt_i_set);
+    rb_define_hooked_variable("$-i", &argf, opt_i_get, opt_i_set);
+    rb_define_hooked_variable("$*", &argf, argf_argv_getter, 0);
 
 #if defined (_WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__)
     atexit(pipe_atexit);
Index: ruby.c
===================================================================
--- ruby.c	(revision 15662)
+++ ruby.c	(revision 15663)
@@ -63,8 +63,12 @@
 VALUE rb_parser_get_yydebug(VALUE);
 VALUE rb_parser_set_yydebug(VALUE, VALUE);
 
-char *ruby_inplace_mode = 0;
+const char *ruby_get_inplace_mode(void);
+void ruby_set_inplace_mode(const char *);
 
+extern VALUE rb_get_argv(void);
+#define rb_argv rb_get_argv()
+
 #define DISABLE_BIT(bit) (1U << disable_##bit)
 enum disable_flag_bits {
     disable_gems,
@@ -461,9 +465,10 @@
     if (opt->sflag) {
 	long n;
 	VALUE *args;
+	VALUE argv = rb_argv;
 
-	n = RARRAY_LEN(rb_argv);
-	args = RARRAY_PTR(rb_argv);
+	n = RARRAY_LEN(argv);
+	args = RARRAY_PTR(argv);
 	while (n > 0) {
 	    VALUE v = *args++;
 	    char *s = StringValuePtr(v);
@@ -510,9 +515,9 @@
 	    }
 	    rb_gv_set(s, v);
 	}
-	n = RARRAY_LEN(rb_argv) - n;
+	n = RARRAY_LEN(argv) - n;
 	while (n--) {
-	    rb_ary_shift(rb_argv);
+	    rb_ary_shift(argv);
 	}
     }
     opt->sflag = 0;
@@ -720,9 +725,7 @@
 
 	  case 'i':
 	    forbid_setid("-i");
-	    if (ruby_inplace_mode)
-		free(ruby_inplace_mode);
-	    ruby_inplace_mode = strdup(s + 1);
+	    ruby_set_inplace_mode(s + 1);
 	    break;
 
 	  case 'x':
@@ -1272,7 +1275,6 @@
 }
 
 VALUE rb_progname;
-VALUE rb_argv;
 VALUE rb_argv0;
 
 #if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE)
@@ -1436,8 +1438,6 @@
     rb_define_hooked_variable("$0", &rb_progname, 0, set_arg0);
     rb_define_hooked_variable("$PROGRAM_NAME", &rb_progname, 0, set_arg0);
 
-    rb_define_readonly_variable("$*", &rb_argv);
-    rb_argv = rb_ary_new();
     rb_define_global_const("ARGV", rb_argv);
     rb_global_variable(&rb_argv0);
 
@@ -1455,6 +1455,7 @@
 ruby_set_argv(int argc, char **argv)
 {
     int i;
+    VALUE av = rb_argv;
 
 #if defined(USE_DLN_A_OUT)
     if (origarg.argv)
@@ -1462,12 +1463,12 @@
     else
 	dln_argv0 = argv[0];
 #endif
-    rb_ary_clear(rb_argv);
+    rb_ary_clear(av);
     for (i = 0; i < argc; i++) {
 	VALUE arg = rb_tainted_str_new2(argv[i]);
 
 	OBJ_FREEZE(arg);
-	rb_ary_push(rb_argv, arg);
+	rb_ary_push(av, arg);
     }
 }
 

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

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