From: hpayer@chromium.org Date: Fri, 12 Apr 2013 08:42:17 +0000 (+0000) Subject: Separate calculation of double element and object element sizes in IsFastLiteral. X-Git-Tag: upstream/4.7.83~14606 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=66f5c75dabdd4716c499b8cac264fbf15d42befe;p=platform%2Fupstream%2Fv8.git Separate calculation of double element and object element sizes in IsFastLiteral. BUG= Review URL: https://codereview.chromium.org/13985005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14241 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 5e36f68..19edbd0 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -6111,7 +6111,8 @@ static bool LookupSetter(Handle map, static bool IsFastLiteral(Handle 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 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 fast_elements = Handle::cast(elements); int length = elements->length(); @@ -6132,12 +6133,13 @@ static bool IsFastLiteral(Handle 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 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 original_boilerplate(closure->literals()->get( expr->literal_index()), isolate()); @@ -6185,7 +6189,8 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { IsFastLiteral(Handle::cast(original_boilerplate), kMaxFastLiteralDepth, &max_properties, - &total_size)) { + &data_size, + &pointer_size)) { Handle original_boilerplate_object = Handle::cast(original_boilerplate); Handle 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 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 boilerplate_object, Handle 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; } diff --git a/src/hydrogen.h b/src/hydrogen.h index f4f3752..f249af1 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -1508,7 +1508,8 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { HInstruction* BuildFastLiteral(HValue* context, Handle boilerplate_object, Handle original_boilerplate_object, - int size, + int data_size, + int pointer_size, AllocationSiteMode mode, BailoutId id);