# ARGF.dup.rewind do not rewind lineno

**URL:** <https://www.ruby-forum.com/t/argf-dup-rewind-do-not-rewind-lineno/135077>\
**Category:** Development\
**Created:** [April 17, 2008, 5:21pm UTC](https://www.ruby-forum.com/t/argf-dup-rewind-do-not-rewind-lineno/135077 "2008-04-17T17:21:33Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [April 17, 2008, 5:21pm UTC](https://www.ruby-forum.com/t/argf-dup-rewind-do-not-rewind-lineno/135077/1 "2008-04-17T17:21:33Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

ARGF.dup e$B$re(B rewind e$B$9$k$He(B lineno e$B$,$\*$+$7$/$J$j$^$9!#e(B

$ cat foobarbaz.txt  
foo  
bar  
baz

$ ./ruby -ve ’  
a = ARGF.dup  
p [a.gets, a.lineno]  
p [a.gets, a.lineno]  
a.rewind  
p [a.gets, a.lineno]  
p [a.gets, a.lineno]  
’ foobarbaz.txt  
ruby 1.9.0 (2008-04-17 revision 16058) [i686-linux]  
[“foo\n”, 1]  
[“bar\n”, 2]  
[“foo\n”, 1]  
[“bar\n”, 2]

rb\_io\_t e$B$Ke(B argf e$B$r\<($9%U%#!\<%k%I$rDI2C$7$FBP1~$7$F$\_$^$7$?!#e(B

# Index: include/ruby/io.h

— include/ruby/io.h (revision 16062)  
+++ include/ruby/io.h (working copy)  
@@ -47,6 +47,7 @@  
VALUE tied\_io\_for\_writing;  
rb\_encoding \*enc;  
rb\_encoding \*enc2;

- VALUE argf;  
} rb\_io\_t;

#define HAVE\_RB\_IO\_T 1  
@@ -92,6 +93,7 @@  
fp-\>tied\_io\_for\_writing = 0;  
fp-\>enc = 0;  
fp-\>enc2 = 0;\

- fp-\>argf = 0;  
} while (0)

# FILE \*rb\_io\_stdio\_file(rb\_io\_t \*fptr); Index: io.c

— io.c (revision 16062)  
+++ io.c (working copy)  
@@ -994,10 +994,12 @@  
rb\_io\_rewind(VALUE io)  
{  
rb\_io\_t \*fptr;

- VALUE argf;

- argf = fptr-\>argf;  
if (io\_seek(fptr, 0L, 0) \< 0) rb\_sys\_fail(fptr-\>path);

- if (io == ARGF.current\_file) {

- if (argf && io == ARGF.current\_file) {  
ARGF.gets\_lineno -= fptr-\>lineno;  
}  
fptr-\>lineno = 0;  
@@ -5209,6 +5211,8 @@  
if (stdout\_binmode) rb\_io\_binmode(rb\_stdout);  
}  
current\_file = prep\_io(fr, FMODE\_READABLE, rb\_cFile, fn);

- GetOpenFile(current\_file, fptr);

- fptr-\>argf = argf;  
}  
if (argf\_binmode) rb\_io\_binmode(current\_file);  
if (argf\_enc) {  
Index: gc.c  
===================================================================  
— gc.c (revision 16062)  
+++ gc.c (working copy)  
@@ -1113,8 +1113,10 @@  
break;

- 

```
   if (obj->as.file.fptr)

```

- 

```
   if (obj->as.file.fptr) {
       gc_mark(obj->as.file.fptr->tied_io_for_writing, lev);

```

- 

```
 gc_mark(obj->as.file.fptr->argf, lev);

```

- }  
break;

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [April 17, 2008, 5:24pm UTC](https://www.ruby-forum.com/t/argf-dup-rewind-do-not-rewind-lineno/135077/2 "2008-04-17T17:24:30Z")

</div>

e$B1sF#$G$9!#D{@5$G$9!#e(B

08/04/18 e$B$Ke(B Yusuke ENDOH[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) e$B$5$s$O=q$-$^$7$?e(B:

> p [a.gets, a.lineno]  
> a.rewind  
> p [a.gets, a.lineno]  
> p [a.gets, a.lineno]  
> ’ foobarbaz.txt  
> ruby 1.9.0 (2008-04-17 revision 16058) [i686-linux]  
> [“foo\n”, 1]  
> [“bar\n”, 2]  
> [“foo\n”, 1]  
> [“bar\n”, 2]

e$B$9$\_$^$;$s!"$3$l$O=$@58e$N%m%0$G$7$?!#e(B  
e$B8=\>u$G$O$3$&$J$j$^$9!#e(B

$ ./ruby -ve ’  
a = ARGF.dup  
p [a.gets, a.lineno]  
p [a.gets, a.lineno]  
a.rewind  
p [a.gets, a.lineno]  
p [a.gets, a.lineno]  
’ foobarbaz.txt  
ruby 1.9.0 (2008-04-17 revision 16058) [i686-linux]  
[“foo\n”, 1]  
[“bar\n”, 2]  
[“foo\n”, 3]  
[“bar\n”, 4]

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [April 17, 2008, 6:26pm UTC](https://www.ruby-forum.com/t/argf-dup-rewind-do-not-rewind-lineno/135077/3 "2008-04-17T18:26:45Z")

</div>

e$B$J$+$@$G$9!#e(B

At Fri, 18 Apr 2008 00:20:54 +0900,  
Yusuke ENDOH wrote in [ruby-dev:34445]:

> ARGF.dup e$B$re(B rewind e$B$9$k$He(B lineno e$B$,$\*$+$7$/$J$j$^$9!#e(B

> rb\_io\_t e$B$Ke(B argf e$B$r\<($9%U%#!\<%k%I$rDI2C$7$FBP1~$7$F$\_$^$7$?!#e(B

e$B$3$3$^$G$9$k$s$G$"$l$Pe(Brb\_io\_getline\_fast()e$B$de(Brb\_io\_getline\_1()e$B$Ge(B  
e$B$b$=$C$A$r;H$&$h$&$K$7$?$[$&$,$$$$$h$&$J!#$7$+$7!"$=$3$^$G$9$kI,e(B  
e$BMW\<+BN$"$k$+$I$&$+!#$"$k$$$O$d$C$Q$je(BARGF.dupe$B$O6X;\_$9$k$+!D!#e(B
