Index: src/value-serializer.cc |
diff --git a/src/value-serializer.cc b/src/value-serializer.cc |
index 6c3d7e058c2dbf27d35b2b7d2c02ce5faeb55812..dec5e782c7a0c9febd4a19643d24839fb29e21e8 100644 |
--- a/src/value-serializer.cc |
+++ b/src/value-serializer.cc |
@@ -18,6 +18,7 @@ namespace v8 { |
namespace internal { |
static const uint32_t kLatestVersion = 9; |
+static const int kPretenureThreshold = 100 * KB; |
template <typename T> |
static size_t BytesNeededForVarint(T value) { |
@@ -751,6 +752,7 @@ ValueDeserializer::ValueDeserializer(Isolate* isolate, |
: isolate_(isolate), |
position_(data.start()), |
end_(data.start() + data.length()), |
+ pretenure_(data.length() > kPretenureThreshold ? TENURED : NOT_TENURED), |
id_map_(Handle<SeededNumberDictionary>::cast( |
isolate->global_handles()->Create( |
*SeededNumberDictionary::New(isolate, 0)))) {} |
@@ -920,17 +922,19 @@ MaybeHandle<Object> ValueDeserializer::ReadObjectInternal() { |
case SerializationTag::kInt32: { |
Maybe<int32_t> number = ReadZigZag<int32_t>(); |
if (number.IsNothing()) return MaybeHandle<Object>(); |
- return isolate_->factory()->NewNumberFromInt(number.FromJust()); |
+ return isolate_->factory()->NewNumberFromInt(number.FromJust(), |
+ pretenure_); |
} |
case SerializationTag::kUint32: { |
Maybe<uint32_t> number = ReadVarint<uint32_t>(); |
if (number.IsNothing()) return MaybeHandle<Object>(); |
- return isolate_->factory()->NewNumberFromUint(number.FromJust()); |
+ return isolate_->factory()->NewNumberFromUint(number.FromJust(), |
+ pretenure_); |
} |
case SerializationTag::kDouble: { |
Maybe<double> number = ReadDouble(); |
if (number.IsNothing()) return MaybeHandle<Object>(); |
- return isolate_->factory()->NewNumber(number.FromJust()); |
+ return isolate_->factory()->NewNumber(number.FromJust(), pretenure_); |
} |
case SerializationTag::kUtf8String: |
return ReadUtf8String(); |
@@ -984,7 +988,7 @@ MaybeHandle<String> ValueDeserializer::ReadUtf8String() { |
!ReadRawBytes(utf8_length).To(&utf8_bytes)) |
return MaybeHandle<String>(); |
return isolate_->factory()->NewStringFromUtf8( |
- Vector<const char>::cast(utf8_bytes)); |
+ Vector<const char>::cast(utf8_bytes), pretenure_); |
} |
MaybeHandle<String> ValueDeserializer::ReadTwoByteString() { |
@@ -1000,7 +1004,7 @@ MaybeHandle<String> ValueDeserializer::ReadTwoByteString() { |
// string on the heap (regardless of alignment). |
Handle<SeqTwoByteString> string; |
if (!isolate_->factory() |
- ->NewRawTwoByteString(byte_length / sizeof(uc16)) |
+ ->NewRawTwoByteString(byte_length / sizeof(uc16), pretenure_) |
.ToHandle(&string)) |
return MaybeHandle<String>(); |
@@ -1017,7 +1021,7 @@ MaybeHandle<JSObject> ValueDeserializer::ReadJSObject() { |
uint32_t id = next_id_++; |
HandleScope scope(isolate_); |
Handle<JSObject> object = |
- isolate_->factory()->NewJSObject(isolate_->object_function()); |
+ isolate_->factory()->NewJSObject(isolate_->object_function(), pretenure_); |
AddObjectWithID(id, object); |
uint32_t num_properties; |
@@ -1042,7 +1046,8 @@ MaybeHandle<JSArray> ValueDeserializer::ReadSparseJSArray() { |
uint32_t id = next_id_++; |
HandleScope scope(isolate_); |
- Handle<JSArray> array = isolate_->factory()->NewJSArray(0); |
+ Handle<JSArray> array = isolate_->factory()->NewJSArray( |
+ 0, TERMINAL_FAST_ELEMENTS_KIND, pretenure_); |
JSArray::SetLength(array, length); |
AddObjectWithID(id, array); |
@@ -1071,7 +1076,8 @@ MaybeHandle<JSArray> ValueDeserializer::ReadDenseJSArray() { |
uint32_t id = next_id_++; |
HandleScope scope(isolate_); |
Handle<JSArray> array = isolate_->factory()->NewJSArray( |
- FAST_HOLEY_ELEMENTS, length, length, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ FAST_HOLEY_ELEMENTS, length, length, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE, |
+ pretenure_); |
AddObjectWithID(id, array); |
Handle<FixedArray> elements(FixedArray::cast(array->elements()), isolate_); |
@@ -1116,29 +1122,30 @@ MaybeHandle<JSValue> ValueDeserializer::ReadJSValue(SerializationTag tag) { |
Handle<JSValue> value; |
switch (tag) { |
case SerializationTag::kTrueObject: |
- value = Handle<JSValue>::cast( |
- isolate_->factory()->NewJSObject(isolate_->boolean_function())); |
+ value = Handle<JSValue>::cast(isolate_->factory()->NewJSObject( |
+ isolate_->boolean_function(), pretenure_)); |
value->set_value(isolate_->heap()->true_value()); |
break; |
case SerializationTag::kFalseObject: |
- value = Handle<JSValue>::cast( |
- isolate_->factory()->NewJSObject(isolate_->boolean_function())); |
+ value = Handle<JSValue>::cast(isolate_->factory()->NewJSObject( |
+ isolate_->boolean_function(), pretenure_)); |
value->set_value(isolate_->heap()->false_value()); |
break; |
case SerializationTag::kNumberObject: { |
double number; |
if (!ReadDouble().To(&number)) return MaybeHandle<JSValue>(); |
- value = Handle<JSValue>::cast( |
- isolate_->factory()->NewJSObject(isolate_->number_function())); |
- Handle<Object> number_object = isolate_->factory()->NewNumber(number); |
+ value = Handle<JSValue>::cast(isolate_->factory()->NewJSObject( |
+ isolate_->number_function(), pretenure_)); |
+ Handle<Object> number_object = |
+ isolate_->factory()->NewNumber(number, pretenure_); |
value->set_value(*number_object); |
break; |
} |
case SerializationTag::kStringObject: { |
Handle<String> string; |
if (!ReadUtf8String().ToHandle(&string)) return MaybeHandle<JSValue>(); |
- value = Handle<JSValue>::cast( |
- isolate_->factory()->NewJSObject(isolate_->string_function())); |
+ value = Handle<JSValue>::cast(isolate_->factory()->NewJSObject( |
+ isolate_->string_function(), pretenure_)); |
value->set_value(*string); |
break; |
} |
@@ -1247,7 +1254,8 @@ MaybeHandle<JSArrayBuffer> ValueDeserializer::ReadJSArrayBuffer() { |
return MaybeHandle<JSArrayBuffer>(); |
} |
const bool should_initialize = false; |
- Handle<JSArrayBuffer> array_buffer = isolate_->factory()->NewJSArrayBuffer(); |
+ Handle<JSArrayBuffer> array_buffer = |
+ isolate_->factory()->NewJSArrayBuffer(SharedFlag::kNotShared, pretenure_); |
JSArrayBuffer::SetupAllocatingData(array_buffer, isolate_, byte_length, |
should_initialize); |
memcpy(array_buffer->backing_store(), position_, byte_length); |
@@ -1311,7 +1319,8 @@ MaybeHandle<JSArrayBufferView> ValueDeserializer::ReadJSArrayBufferView( |
return MaybeHandle<JSArrayBufferView>(); |
} |
Handle<JSTypedArray> typed_array = isolate_->factory()->NewJSTypedArray( |
- external_array_type, buffer, byte_offset, byte_length / element_size); |
+ external_array_type, buffer, byte_offset, byte_length / element_size, |
+ pretenure_); |
AddObjectWithID(id, typed_array); |
return typed_array; |
} |
@@ -1415,8 +1424,8 @@ ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { |
size_t begin_properties = |
stack.size() - 2 * static_cast<size_t>(num_properties); |
- Handle<JSObject> js_object = |
- isolate_->factory()->NewJSObject(isolate_->object_function()); |
+ Handle<JSObject> js_object = isolate_->factory()->NewJSObject( |
+ isolate_->object_function(), pretenure_); |
if (num_properties && |
!SetPropertiesFromKeyValuePairs( |
isolate_, js_object, &stack[begin_properties], num_properties) |
@@ -1440,7 +1449,8 @@ ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { |
return MaybeHandle<Object>(); |
} |
- Handle<JSArray> js_array = isolate_->factory()->NewJSArray(0); |
+ Handle<JSArray> js_array = isolate_->factory()->NewJSArray( |
+ 0, TERMINAL_FAST_ELEMENTS_KIND, pretenure_); |
JSArray::SetLength(js_array, length); |
size_t begin_properties = |
stack.size() - 2 * static_cast<size_t>(num_properties); |