summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-19 15:21:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-19 15:21:15 +0000
commita130e925822508b887170365cfa3799708dda302 (patch)
treebb0883e1e64354f3df8ce8d5763154cd17b7eb66
parent42522ee2a61259f907fd20585c6aa06d6223a2a1 (diff)
* io.c (argf_initialize_copy): get rid of segfault.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15810 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--io.c44
2 files changed, 37 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 8cf51c866b..907b60daae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,6 @@
-Thu Mar 20 00:13:59 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Mar 20 00:21:12 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (argf_initialize_copy): get rid of segfault.
* io.c (argf_tell, argf_seek_m, argf_set_pos, argf_rewind,
argf_fileno, argf_to_io, argf_eofl, argf_getc, argf_getbyte,
diff --git a/io.c b/io.c
index 06393f1d2f..9e9e8f60fb 100644
--- a/io.c
+++ b/io.c
@@ -138,7 +138,8 @@ struct argf {
rb_encoding *enc, *enc2;
};
-#define ARGF (*(struct argf *)DATA_PTR(argf))
+#define argf_of(obj) (*(struct argf *)DATA_PTR(obj))
+#define ARGF argf_of(argf)
#ifdef _STDIO_USES_IOSTREAM /* GNU libc */
# ifdef _IO_fpos_t
@@ -4929,16 +4930,22 @@ argf_free(void *ptr)
free(p->inplace);
}
+static inline void
+argf_init(struct argf *p, VALUE v)
+{
+ p->filename = Qnil;
+ p->current_file = Qnil;
+ p->lineno = Qnil;
+ p->argv = v;
+}
+
static VALUE
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;
+ argf_init(p, Qnil);
return argf;
}
@@ -4957,7 +4964,22 @@ argf_alloc(VALUE klass)
static VALUE
argf_initialize(VALUE argf, VALUE argv)
{
- rb_argv = argv;
+ memset(&ARGF, 0, sizeof(ARGF));
+ argf_init(&ARGF, argv);
+
+ return argf;
+}
+
+static VALUE
+argf_initialize_copy(VALUE argf, VALUE orig)
+{
+ ARGF = argf_of(orig);
+ rb_argv = rb_obj_dup(rb_argv);
+ if (ARGF.inplace) {
+ const char *inplace = ARGF.inplace;
+ ARGF.inplace = 0;
+ ARGF.inplace = ruby_strdup(inplace);
+ }
return argf;
}
@@ -6860,13 +6882,13 @@ Init_IO(void)
rb_define_global_const("STDOUT", rb_stdout);
rb_define_global_const("STDERR", rb_stderr);
- argf = argf_alloc(rb_cObject);
- argf_initialize(argf, rb_ary_new());
- rb_cARGF = rb_singleton_class(argf);
+ rb_cARGF = rb_class_new(rb_cObject);
+ rb_define_alloc_func(rb_cARGF, argf_alloc);
rb_include_module(rb_cARGF, rb_mEnumerable);
- rb_define_method(rb_cARGF, "initialize", argf_initialize, 1);
+ rb_define_method(rb_cARGF, "initialize", argf_initialize, -2);
+ rb_define_method(rb_cARGF, "initialize_copy", argf_initialize_copy, 1);
rb_define_method(rb_cARGF, "to_s", argf_to_s, 0);
rb_define_method(rb_cARGF, "argv", argf_argv, 0);
@@ -6913,6 +6935,8 @@ Init_IO(void)
rb_define_method(rb_cARGF, "internal_encoding", argf_internal_encoding, 0);
rb_define_method(rb_cARGF, "set_encoding", argf_set_encoding, -1);
+ argf = rb_class_new_instance(0, 0, rb_cARGF);
+
rb_define_readonly_variable("$<", &argf);
rb_define_global_const("ARGF", argf);