Index: src/json-parser.cc |
=================================================================== |
--- src/json-parser.cc (revision 8071) |
+++ src/json-parser.cc (working copy) |
@@ -380,7 +380,7 @@ |
while (c0_ != '"') { |
// Create new seq string |
if (count >= kInitialSpecialStringSize * allocation_count) { |
- allocation_count++; |
+ allocation_count = allocation_count * 2; |
int new_size = allocation_count * kInitialSpecialStringSize; |
Handle<String> new_two_byte = |
isolate()->factory()->NewRawTwoByteString(new_size, |
@@ -443,10 +443,18 @@ |
Advance(); |
// Shrink the the string to our length. |
- isolate()->heap()-> |
- new_space()-> |
- ShrinkStringAtAllocationBoundary<SeqTwoByteString>(*seq_two_byte, |
- count); |
+ if (isolate()->heap()->InNewSpace(*seq_two_byte)) { |
+ isolate()->heap()->new_space()-> |
+ ShrinkStringAtAllocationBoundary<SeqTwoByteString>(*seq_two_byte, |
+ count); |
+ } else { |
+ int string_size = SeqTwoByteString::SizeFor(count); |
+ int allocated_string_size = |
+ SeqTwoByteString::SizeFor(kInitialSpecialStringSize * allocation_count); |
+ int delta = allocated_string_size - string_size; |
+ Address start_filler_object = seq_two_byte->address() + string_size; |
+ isolate()->heap()->CreateFillerObjectAt(start_filler_object, delta); |
+ } |
string_val_ = isolate()->factory()->NewConsString(ascii, seq_two_byte); |
return Token::STRING; |
} |