From 917286208cdccf52c49186c23568ec6b9f45cb56 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 26 Jun 2009 18:10:12 +0000 Subject: * io.c (argf_rewind): need to rewind $. and ARGF.lineno. [ruby-core:24046] * io.c (struct argf): refactoring on $. and ARGF.lineno behavior. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23862 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- io.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) (limited to 'io.c') diff --git a/io.c b/io.c index c6630fcd73..8b5db0e066 100644 --- a/io.c +++ b/io.c @@ -134,9 +134,9 @@ struct timeval rb_time_interval(VALUE); struct argf { VALUE filename, current_file; - int gets_lineno; + int last_lineno; /* $. */ + int lineno; int init_p, next_p; - VALUE lineno; VALUE argv; char *inplace; int binmode; @@ -1142,7 +1142,7 @@ rb_io_rewind(VALUE io) GetOpenFile(io, fptr); if (io_seek(fptr, 0L, 0) < 0) rb_sys_fail_path(fptr->pathv); if (io == ARGF.current_file) { - ARGF.gets_lineno -= fptr->lineno; + ARGF.lineno -= fptr->lineno; } fptr->lineno = 0; if (fptr->readconv) { @@ -2273,7 +2273,8 @@ rb_io_getline_fast(rb_io_t *fptr, rb_encoding *enc) str = io_enc_str(str, fptr); ENC_CODERANGE_SET(str, cr); fptr->lineno++; - ARGF.lineno = INT2FIX(fptr->lineno); + ARGF.last_lineno = fptr->lineno; + return str; } @@ -2410,7 +2411,7 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io) if (!NIL_P(str)) { if (!nolimit) { fptr->lineno++; - ARGF.lineno = INT2FIX(fptr->lineno); + ARGF.last_lineno = fptr->lineno; } } @@ -6334,7 +6335,6 @@ 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); rb_gc_mark(p->encs.ecopts); } @@ -6351,7 +6351,7 @@ argf_init(struct argf *p, VALUE v) { p->filename = Qnil; p->current_file = Qnil; - p->lineno = INT2FIX(0); + p->lineno = 0; p->argv = v; } @@ -6392,15 +6392,15 @@ argf_initialize_copy(VALUE argf, VALUE orig) static VALUE argf_set_lineno(VALUE argf, VALUE val) { - ARGF.gets_lineno = NUM2INT(val); - ARGF.lineno = INT2FIX(ARGF.gets_lineno); + ARGF.lineno = NUM2INT(val); + ARGF.last_lineno = ARGF.lineno; return Qnil; } static VALUE argf_lineno(VALUE argf) { - return ARGF.lineno; + return INT2FIX(ARGF.lineno); } static VALUE @@ -6448,7 +6448,6 @@ argf_next_argv(VALUE argf) ARGF.next_p = -1; } ARGF.init_p = 1; - ARGF.gets_lineno = 0; } if (ARGF.next_p == 1) { @@ -6582,8 +6581,8 @@ argf_getline(int argc, VALUE *argv, VALUE argf) } } if (!NIL_P(line)) { - ARGF.gets_lineno++; - ARGF.lineno = INT2FIX(ARGF.gets_lineno); + ARGF.lineno++; + ARGF.last_lineno = ARGF.lineno; } return line; } @@ -6592,7 +6591,7 @@ static VALUE argf_lineno_getter(ID id, VALUE *var) { VALUE argf = *var; - return ARGF.lineno; + return INT2FIX(ARGF.last_lineno); } static void @@ -6600,8 +6599,7 @@ argf_lineno_setter(VALUE val, ID id, VALUE *var) { VALUE argf = *var; int n = NUM2INT(val); - ARGF.gets_lineno = n; - ARGF.lineno = INT2FIX(n); + ARGF.last_lineno = ARGF.lineno = n; } static VALUE argf_gets(int, VALUE *, VALUE); @@ -6655,6 +6653,7 @@ argf_gets(int argc, VALUE *argv, VALUE argf) line = argf_getline(argc, argv, argf); rb_lastline_set(line); + return line; } @@ -6677,8 +6676,8 @@ rb_gets(void) } rb_lastline_set(line); if (!NIL_P(line)) { - ARGF.gets_lineno++; - ARGF.lineno = INT2FIX(ARGF.gets_lineno); + ARGF.lineno++; + ARGF.last_lineno = ARGF.lineno; } return line; @@ -8633,7 +8632,7 @@ argf_close_m(VALUE argf) if (ARGF.next_p != -1) { ARGF.next_p = 1; } - ARGF.gets_lineno = 0; + ARGF.lineno = 0; return argf; } -- cgit v1.2.3