# Code Review: Fix for File.print misbehavior

**URL:** <https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086>\
**Category:** IronRuby\
**Created:** [May 15, 2009, 5:20pm UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086 "2009-05-15T17:20:22Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 15, 2009, 5:20pm UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/1 "2009-05-15T17:20:22Z")

</div>

Commit Description:  
Using the File.print method after the global input record separator had  
been changed generated a different output than the MRI.

For example, consider the next code block:  
$\ = “\>\>”  
file = File.open(“a.txt”,“w”)  
file.print "One ", 1, ", Two ", 2  
file.close

Output file on MRI: One 1, Two 2\>\>  
Output file on IronRuby: One \>\>1\>\>, Two \>\>2\>\>

This commit fixes this behavior.

Commit site:

> <https://github.com/shayfriedman/ironruby/commit/0ccacf09b53c231f21851391d616b0fa53026197>

Files changed:  
Merlin/Main/Languages/Ruby/Libraries.LCA\_RESTRICTED/Builtins/IoOps.cs

Thanks,  
Shay.

---

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 15, 2009, 8:48pm UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/2 "2009-05-15T20:48:00Z")

</div>

Thanks for the first patch, Shay! Couple of questions and comments.

Have you signed the contributor agreement mentioned at the top of  
[http://wiki.github.com/ironruby/ironruby/contributing](http://wiki.github.com/ironruby/ironruby/contributing)?

Please see  
[http://wiki.github.com/ironruby/ironruby/modifying-the-sources](http://wiki.github.com/ironruby/ironruby/modifying-the-sources) for  
coding conventions. Opening braces should go on the same line as the  
“if” statement.

You should make sure that there is a RubySpec spec for your fixes. In  
this case, there should be a spec in  
Merlin\External.LCA\_RESTRICTED\Languages\IronRuby\mspec\rubyspec\core\io\print\_spec.rb.  
It does look like the example “writes each obj.to\_s to the stream and  
appends $\ (if any) given multiple objects” corresponds to your fix. If  
there is an existing spec, you should delete the corresponding tag from  
Merlin\External.LCA\_RESTRICTED\Languages\IronRuby\mspec\ironruby-tags\core\io\print\_tags.txt.  
Please delete the print\_tags.txt file since there are not more tags left  
in that file.

You did run irtests.bat, right? There are currently 5 known failures  
from run.bat and 19 from the RubySpec specs (all of which should go away  
with the next push from Microsoft TFS to GIT).

Thanks again!

Shri

---

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 16, 2009, 7:50am UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/3 "2009-05-16T07:50:41Z")

</div>

Hi Shri,

Regarding the contributor agreement - yes, I’ve signed that (Jim D.  
helped me with that).

Regarding the coding conventions - I didn’t notice the “modifying the  
sources” page, sorrry for that… I would pay attention to that next  
time.

About RubySpec - “writes each obj.to\_s to the stream and  
appends $\ (if any) given multiple objects” really seems like the  
corresponding test to my fix. What are the tags for?  
The test mentioned on print\_tags.txt should also pass after this commit.

About irtests - I ran it. I saw the 5 failures from run.bat but I  
couldn’t find the place where the RubySpec specs failures were  
presented. What am I doing wrong?

Thanks!  
Shay.

---

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 16, 2009, 9:45am UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/4 "2009-05-16T09:45:34Z")

</div>

I couldn’t follow the code exactly but what I did find, was that this  
test never reached the code inside IOOps.Print.  
The behavior is really strange, I tried to print the value on the screen  
and the value were really incorrect (the $\ delimiter is added after  
each argument) but the $stdout.print call inside the lambda expression  
got it correctly…

I did that:

it "writes each obj.to\_s to the stream and appends $\ (if any) given  
multiple

objects" do  
o, o2 = Object.new, Object.new  
def o.to\_s(); ‘o’; end  
def o2.to\_s(); ‘o2’; end

```
puts $stdout.print(o, o2)

lambda { $stdout.print(o, o2) }.should 

```

output("#{o.to\_s}#{o2.to\_s}#{$}")  
end

And it wrote “o-\>o2-\>nil” on the screen… But when I changed the output  
it to “123” the test failed and told me:  
Expected:  
$stdout: “123”  
got:  
$stdout: “oo2-\>”

So I’m really confused… like I said, my breakpoint inside the print  
method never gets hit so I can’t really tell which “print” method is  
invoked…

Shay.

---

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 17, 2009, 12:10am UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/5 "2009-05-17T00:10:05Z")

</div>

The problem is because of mspec itself. In  
External.LCA\_RESTRICTED\Languages\IronRuby\mspec\mspec\lib\mspec\matchers\output.rb,  
the code sets $stdout to a helper class (IOStub) so that it can capture  
the output. However, what this means is that calls to $stdout.print that  
the test makes now go to IOStub#print rather than to the real  
implementation of IO#print, and this masks the bug.

A better solution would be to use StringIO in matchers\output.rb rather  
than IOStub. If you are included to pursue this (which would be great),  
you could try the change and/or send email to  
[http://groups.google.com/group/rubyspec](http://groups.google.com/group/rubyspec) to discuss the change. However,  
since this is a preexisting issue, you could leave it for another day if  
you want.

So consider your change code-reviewed, and you can chose separately to  
pursue (or not) the issue with matchers\output.rb.

---

<div class="post-metadata">

**Author:** ![shayfriedman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/bbe5ce/32.png) [@shayfriedman](https://www.ruby-forum.com/u/shayfriedman)\
**Post date:** [May 16, 2009, 8:32am UTC](https://www.ruby-forum.com/t/code-review-fix-for-file-print-misbehavior/168086/6 "2009-05-16T08:32:17Z")

</div>

“writes each obj.to\_s to the stream and appends $\ (if any) given  
multiple objects” does not have a tag for it. If it did, it would be in  
Merlin\External.LCA\_RESTRICTED\Languages\IronRuby\mspec\ironruby-tags\core\io\print\_tags.txt,  
but that file only has a tag for “writes $\_.to\_s followed by $\ (if any)  
to the stream if no arguments given”. I incorrectly thought that these  
were the same test name, but clearly they are not.

It’s a mystery how “writes each obj.to\_s to the stream and appends $\  
(if any) given multiple objects” works, but your example below fails.  
Could you could step into IoOps.Print for this test without your fix and  
see how it works? Else, I can try it next week.

Shri
