From 693a42b5d490569360d0f997b9d756ab9ccf2d16 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 16 Oct 2009 09:55:18 -0500 Subject: [PATCH] add testcases for buffering logic in string coversions. preallocate entire ruby string beforehand. --- spec/therubyracer_spec.rb | 9 +++++++++ v8_data.h | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spec/therubyracer_spec.rb b/spec/therubyracer_spec.rb index 74cc196..ac1733c 100644 --- a/spec/therubyracer_spec.rb +++ b/spec/therubyracer_spec.rb @@ -21,6 +21,15 @@ describe "The Ruby Racer" do eval("'Hello World'").should == "Hello World" end + it "can pass large strings back to ruby" do + lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis faucibus, diam vel pellentesque aliquet, nisl sapien molestie eros, vitae vehicula libero massa vel neque. Phasellus tempor pharetra ipsum vel venenatis. Quisque vitae nisl vitae quam mattis pellentesque et in sapien. Sed at lectus quis eros pharetra feugiat non ac neque. Vivamus lacus eros, feugiat at volutpat at, viverra id nisl. Vivamus ac dolor eleifend libero venenatis pharetra ut iaculis arcu. Donec neque nibh, vehicula non porta a, consectetur eu erat. Sed eleifend, metus vel euismod placerat, lectus lectus sollicitudin nisl, ac elementum sem quam nec dolor. In hac habitasse platea dictumst. Proin vitae suscipit orci. Suspendisse a ipsum vel lorem tempus scelerisque et vitae neque. Proin sodales, tellus sit amet consequat cursus, odio massa ultricies enim, eu fermentum velit lectus in lacus. Quisque eu porttitor diam. Nunc felis purus, facilisis non tristique ac, pulvinar nec nulla. Duis dolor risus, egestas nec tristique ac, ullamcorper cras amet." + eval("'#{lorem}'").should == lorem + end + + it "can pass the empty string back to ruby" do + eval("''").should == "" + end + it "can pass doubles back to ruby" do eval("2.5").should == 2.5 end diff --git a/v8_data.h b/v8_data.h index bc2e93b..dd2c083 100644 --- a/v8_data.h +++ b/v8_data.h @@ -34,10 +34,10 @@ template class V8HandleSource { v8::Local str = value->ToString(); char buffer[1024]; int strlen = str->Length(); - std::string output; + std::string output(strlen, 0); for (int total = 0; total < strlen;) { - int written = str->WriteAscii(buffer, 0, 1024); - output.append(buffer, written); + int written = str->WriteAscii(buffer, total, 1024); + output.replace(total, written, buffer); total += written; } return dest.pushString(output, name);