Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 5e36f68684f28e9556b8e90e2cbbc9d1253c36d4..19edbd0c2efecd25d9ef55dc94d06f94d384ea99 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -6111,7 +6111,8 @@ static bool LookupSetter(Handle<Map> map, |
static bool IsFastLiteral(Handle<JSObject> boilerplate, |
int max_depth, |
int* max_properties, |
- int* total_size) { |
+ int* data_size, |
+ int* pointer_size) { |
ASSERT(max_depth >= 0 && *max_properties >= 0); |
if (max_depth == 0) return false; |
@@ -6120,7 +6121,7 @@ static bool IsFastLiteral(Handle<JSObject> boilerplate, |
if (elements->length() > 0 && |
elements->map() != isolate->heap()->fixed_cow_array_map()) { |
if (boilerplate->HasFastDoubleElements()) { |
- *total_size += FixedDoubleArray::SizeFor(elements->length()); |
+ *data_size += FixedDoubleArray::SizeFor(elements->length()); |
} else if (boilerplate->HasFastObjectElements()) { |
Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); |
int length = elements->length(); |
@@ -6132,12 +6133,13 @@ static bool IsFastLiteral(Handle<JSObject> boilerplate, |
if (!IsFastLiteral(value_object, |
max_depth - 1, |
max_properties, |
- total_size)) { |
+ data_size, |
+ pointer_size)) { |
return false; |
} |
} |
} |
- *total_size += FixedArray::SizeFor(length); |
+ *pointer_size += FixedArray::SizeFor(length); |
} else { |
return false; |
} |
@@ -6156,14 +6158,15 @@ static bool IsFastLiteral(Handle<JSObject> boilerplate, |
if (!IsFastLiteral(value_object, |
max_depth - 1, |
max_properties, |
- total_size)) { |
+ data_size, |
+ pointer_size)) { |
return false; |
} |
} |
} |
} |
- *total_size += boilerplate->map()->instance_size(); |
+ *pointer_size += boilerplate->map()->instance_size(); |
return true; |
} |
@@ -6177,7 +6180,8 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
HInstruction* literal; |
// Check whether to use fast or slow deep-copying for boilerplate. |
- int total_size = 0; |
+ int data_size = 0; |
+ int pointer_size = 0; |
int max_properties = kMaxFastLiteralProperties; |
Handle<Object> original_boilerplate(closure->literals()->get( |
expr->literal_index()), isolate()); |
@@ -6185,7 +6189,8 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
IsFastLiteral(Handle<JSObject>::cast(original_boilerplate), |
kMaxFastLiteralDepth, |
&max_properties, |
- &total_size)) { |
+ &data_size, |
+ &pointer_size)) { |
Handle<JSObject> original_boilerplate_object = |
Handle<JSObject>::cast(original_boilerplate); |
Handle<JSObject> boilerplate_object = |
@@ -6194,7 +6199,8 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
literal = BuildFastLiteral(context, |
boilerplate_object, |
original_boilerplate_object, |
- total_size, |
+ data_size, |
+ pointer_size, |
DONT_TRACK_ALLOCATION_SITE, |
environment()->previous_ast_id()); |
} else { |
@@ -6318,21 +6324,24 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
boilerplate_elements_kind); |
// Check whether to use fast or slow deep-copying for boilerplate. |
- int total_size = 0; |
+ int data_size = 0; |
+ int pointer_size = 0; |
int max_properties = kMaxFastLiteralProperties; |
if (IsFastLiteral(original_boilerplate_object, |
kMaxFastLiteralDepth, |
&max_properties, |
- &total_size)) { |
+ &data_size, |
+ &pointer_size)) { |
if (mode == TRACK_ALLOCATION_SITE) { |
- total_size += AllocationSiteInfo::kSize; |
+ pointer_size += AllocationSiteInfo::kSize; |
} |
Handle<JSObject> boilerplate_object = DeepCopy(original_boilerplate_object); |
literal = BuildFastLiteral(context, |
boilerplate_object, |
original_boilerplate_object, |
- total_size, |
+ data_size, |
+ pointer_size, |
mode, |
environment()->previous_ast_id()); |
} else { |
@@ -10090,15 +10099,18 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
HValue* context, |
Handle<JSObject> boilerplate_object, |
Handle<JSObject> original_boilerplate_object, |
- int size, |
+ int data_size, |
+ int pointer_size, |
AllocationSiteMode mode, |
BailoutId id) { |
Zone* zone = this->zone(); |
+ int total_size = data_size + pointer_size; |
NoObservableSideEffectsScope no_effects(this); |
HValue* size_in_bytes = |
- AddInstruction(new(zone) HConstant(size, Representation::Integer32())); |
+ AddInstruction(new(zone) HConstant(total_size, |
+ Representation::Integer32())); |
HInstruction* result = |
AddInstruction(new(zone) HAllocate(context, |
size_in_bytes, |
@@ -10107,7 +10119,7 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
int offset = 0; |
BuildEmitDeepCopy(boilerplate_object, original_boilerplate_object, result, |
&offset, mode, id); |
- ASSERT_EQ(size, offset); |
+ ASSERT_EQ(total_size, offset); |
return result; |
} |