Index: src/json-parser.h |
diff --git a/src/json-parser.h b/src/json-parser.h |
index 40116fa59ab9594c578d5467ac5330cf3509dd37..0c26c184ee806e84ced0ff011d6e5a087770cc2d 100644 |
--- a/src/json-parser.h |
+++ b/src/json-parser.h |
@@ -154,6 +154,7 @@ class JsonParser BASE_EMBEDDED { |
inline Zone* zone() const { return zone_; } |
static const int kInitialSpecialStringLength = 1024; |
+ static const int kPretenureTreshold = 100 * 1024; |
private: |
@@ -161,6 +162,7 @@ class JsonParser BASE_EMBEDDED { |
int source_length_; |
Handle<SeqAsciiString> seq_source_; |
+ PretenureFlag pretenure_; |
Isolate* isolate_; |
Factory* factory_; |
Handle<JSFunction> object_constructor_; |
@@ -180,6 +182,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJson(Handle<String> source, |
FlattenString(source); |
source_ = source; |
source_length_ = source_->length(); |
+ pretenure_ = (source_length_ >= kPretenureTreshold) ? TENURED : NOT_TENURED; |
// Optimized fast case where we only have ASCII characters. |
if (seq_ascii) { |
@@ -281,7 +284,7 @@ template <bool seq_ascii> |
Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() { |
Handle<Object> prototype; |
Handle<JSObject> json_object = |
- factory()->NewJSObject(object_constructor()); |
+ factory()->NewJSObject(object_constructor(), pretenure_); |
ASSERT_EQ(c0_, '{'); |
AdvanceSkipWhitespace(); |
@@ -365,11 +368,12 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonArray() { |
AdvanceSkipWhitespace(); |
// Allocate a fixed array with all the elements. |
Handle<FixedArray> fast_elements = |
- factory()->NewFixedArray(elements.length()); |
+ factory()->NewFixedArray(elements.length(), pretenure_); |
for (int i = 0, n = elements.length(); i < n; i++) { |
fast_elements->set(i, *elements[i]); |
} |
- return factory()->NewJSArrayWithElements(fast_elements); |
+ return factory()->NewJSArrayWithElements( |
+ fast_elements, FAST_ELEMENTS, pretenure_); |
} |
@@ -436,7 +440,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() { |
buffer.Dispose(); |
} |
SkipWhitespace(); |
- return factory()->NewNumber(number); |
+ return factory()->NewNumber(number, pretenure_); |
} |
@@ -454,16 +458,22 @@ inline void SeqStringSet(Handle<SeqAsciiString> seq_str, int i, uc32 c) { |
} |
template <typename StringType> |
-inline Handle<StringType> NewRawString(Factory* factory, int length); |
+inline Handle<StringType> NewRawString(Factory* factory, |
+ int length, |
+ PretenureFlag pretenure); |
template <> |
-inline Handle<SeqTwoByteString> NewRawString(Factory* factory, int length) { |
- return factory->NewRawTwoByteString(length, NOT_TENURED); |
+inline Handle<SeqTwoByteString> NewRawString(Factory* factory, |
+ int length, |
+ PretenureFlag pretenure) { |
+ return factory->NewRawTwoByteString(length, pretenure); |
} |
template <> |
-inline Handle<SeqAsciiString> NewRawString(Factory* factory, int length) { |
- return factory->NewRawAsciiString(length, NOT_TENURED); |
+inline Handle<SeqAsciiString> NewRawString(Factory* factory, |
+ int length, |
+ PretenureFlag pretenure) { |
+ return factory->NewRawAsciiString(length, pretenure); |
} |
@@ -477,7 +487,8 @@ Handle<String> JsonParser<seq_ascii>::SlowScanJsonString( |
int count = end - start; |
int max_length = count + source_length_ - position_; |
int length = Min(max_length, Max(kInitialSpecialStringLength, 2 * count)); |
- Handle<StringType> seq_str = NewRawString<StringType>(factory(), length); |
+ Handle<StringType> seq_str = |
+ NewRawString<StringType>(factory(), length, pretenure_); |
// Copy prefix into seq_str. |
SinkChar* dest = seq_str->GetChars(); |
String::WriteToFlat(*prefix, dest, start, end); |
@@ -656,10 +667,10 @@ Handle<String> JsonParser<seq_ascii>::ScanJsonString() { |
Handle<String> result; |
if (seq_ascii && is_symbol) { |
result = factory()->LookupAsciiSymbol(seq_source_, |
- beg_pos, |
- length); |
+ beg_pos, |
+ length); |
} else { |
- result = factory()->NewRawAsciiString(length); |
+ result = factory()->NewRawAsciiString(length, pretenure_); |
char* dest = SeqAsciiString::cast(*result)->GetChars(); |
String::WriteToFlat(*source_, dest, beg_pos, position_); |
} |