mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
io.c: write a newline together
* io.c (rb_io_puts): write a newline together at once for each argument. based on the patch by rohitpaulk (Rohit Kuruvilla) at [ruby-core:83508]. [Feature #14042] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60417 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
50a99a7679
commit
635d0822cd
3 changed files with 32 additions and 10 deletions
20
io.c
20
io.c
|
@ -1686,6 +1686,16 @@ rb_io_write(VALUE io, VALUE str)
|
||||||
return rb_funcallv(io, id_write, 1, &str);
|
return rb_funcallv(io, id_write, 1, &str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_io_writev(VALUE io, int argc, VALUE *argv)
|
||||||
|
{
|
||||||
|
if (argc > 1 && rb_obj_method_arity(io, id_write) == 1) {
|
||||||
|
do rb_io_write(io, *argv++); while (--argc);
|
||||||
|
return argv[0]; /* unused right now */
|
||||||
|
}
|
||||||
|
return rb_funcallv(io, id_write, argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* ios << obj -> ios
|
* ios << obj -> ios
|
||||||
|
@ -7572,8 +7582,8 @@ io_puts_ary(VALUE ary, VALUE out, int recur)
|
||||||
VALUE
|
VALUE
|
||||||
rb_io_puts(int argc, const VALUE *argv, VALUE out)
|
rb_io_puts(int argc, const VALUE *argv, VALUE out)
|
||||||
{
|
{
|
||||||
int i;
|
int i, n;
|
||||||
VALUE line;
|
VALUE line, args[2];
|
||||||
|
|
||||||
/* if no argument given, print newline. */
|
/* if no argument given, print newline. */
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
|
@ -7590,11 +7600,13 @@ rb_io_puts(int argc, const VALUE *argv, VALUE out)
|
||||||
}
|
}
|
||||||
line = rb_obj_as_string(argv[i]);
|
line = rb_obj_as_string(argv[i]);
|
||||||
string:
|
string:
|
||||||
rb_io_write(out, line);
|
n = 0;
|
||||||
|
args[n++] = line;
|
||||||
if (RSTRING_LEN(line) == 0 ||
|
if (RSTRING_LEN(line) == 0 ||
|
||||||
!rb_str_end_with_asciichar(line, '\n')) {
|
!rb_str_end_with_asciichar(line, '\n')) {
|
||||||
rb_io_write(out, rb_default_rs);
|
args[n++] = rb_default_rs;
|
||||||
}
|
}
|
||||||
|
rb_io_writev(out, n, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
|
|
@ -43,18 +43,16 @@ describe "IO#puts" do
|
||||||
object.should_receive(:method_missing).with(:to_ary)
|
object.should_receive(:method_missing).with(:to_ary)
|
||||||
object.should_receive(:to_s).and_return("#<Object:0x...>")
|
object.should_receive(:to_s).and_return("#<Object:0x...>")
|
||||||
|
|
||||||
@io.should_receive(:write).with("#<Object:0x...>")
|
|
||||||
@io.should_receive(:write).with("\n")
|
|
||||||
@io.puts(object).should == nil
|
@io.puts(object).should == nil
|
||||||
|
ScratchPad.recorded.should == "#<Object:0x...>\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "calls :to_ary before writing non-string objects" do
|
it "calls :to_ary before writing non-string objects" do
|
||||||
object = mock('hola')
|
object = mock('hola')
|
||||||
object.should_receive(:to_ary).and_return(["hola"])
|
object.should_receive(:to_ary).and_return(["hola"])
|
||||||
|
|
||||||
@io.should_receive(:write).with("hola")
|
|
||||||
@io.should_receive(:write).with("\n")
|
|
||||||
@io.puts(object).should == nil
|
@io.puts(object).should == nil
|
||||||
|
ScratchPad.recorded.should == "hola\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "calls :to_s before writing non-string objects that don't respond to :to_ary" do
|
it "calls :to_s before writing non-string objects that don't respond to :to_ary" do
|
||||||
|
@ -69,9 +67,8 @@ describe "IO#puts" do
|
||||||
object = mock('hola')
|
object = mock('hola')
|
||||||
object.should_receive(:to_s).and_return(false)
|
object.should_receive(:to_s).and_return(false)
|
||||||
|
|
||||||
@io.should_receive(:write).with(object.inspect.split(" ")[0] + ">")
|
|
||||||
@io.should_receive(:write).with("\n")
|
|
||||||
@io.puts(object).should == nil
|
@io.puts(object).should == nil
|
||||||
|
ScratchPad.recorded.should == object.inspect.split(" ")[0] + ">\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "writes each arg if given several" do
|
it "writes each arg if given several" do
|
||||||
|
|
|
@ -2445,6 +2445,19 @@ End
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_puts_parallel
|
||||||
|
pipe(proc do |w|
|
||||||
|
threads = []
|
||||||
|
100.times do
|
||||||
|
threads << Thread.new { w.puts "hey" }
|
||||||
|
end
|
||||||
|
threads.each(&:join)
|
||||||
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
|
assert_equal("hey\n" * 100, r.read)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
def test_display
|
def test_display
|
||||||
pipe(proc do |w|
|
pipe(proc do |w|
|
||||||
"foo".display(w)
|
"foo".display(w)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue