ruby-changes:4320
From: ko1@a...
Date: Thu, 20 Mar 2008 00:21:39 +0900 (JST)
Subject: [ruby-changes:4320] nobu - Ruby:r15810 (trunk): * io.c (argf_initialize_copy): get rid of segfault.
nobu 2008-03-20 00:21:15 +0900 (Thu, 20 Mar 2008) New Revision: 15810 Modified files: trunk/ChangeLog trunk/io.c Log: * io.c (argf_initialize_copy): get rid of segfault. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15810&r2=15809&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15810&r2=15809&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15809) +++ ChangeLog (revision 15810) @@ -1,5 +1,7 @@ -Thu Mar 20 00:13:59 2008 Nobuyoshi Nakada <nobu@r...> +Thu Mar 20 00:21:12 2008 Nobuyoshi Nakada <nobu@r...> + * 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, argf_readchar, argf_readbyte, argf_each_line): use receiver. Index: io.c =================================================================== --- io.c (revision 15809) +++ io.c (revision 15810) @@ -138,7 +138,8 @@ 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 @@ 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,11 +4964,26 @@ 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; +} + +static VALUE argf_set_lineno(VALUE argf, VALUE val) { gets_lineno = NUM2INT(val); @@ -6860,13 +6882,13 @@ 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 @@ 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); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/