Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.cc

Issue 1690923002: [runtime] Speed up allocating instances in the runtime by having a quick-check for inobject slack t… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 9308 matching lines...) Expand 10 before | Expand all | Expand 10 after
9319 result->set_bit_field2(map->bit_field2()); 9319 result->set_bit_field2(map->bit_field2());
9320 int new_bit_field3 = map->bit_field3(); 9320 int new_bit_field3 = map->bit_field3();
9321 new_bit_field3 = OwnsDescriptors::update(new_bit_field3, true); 9321 new_bit_field3 = OwnsDescriptors::update(new_bit_field3, true);
9322 new_bit_field3 = NumberOfOwnDescriptorsBits::update(new_bit_field3, 0); 9322 new_bit_field3 = NumberOfOwnDescriptorsBits::update(new_bit_field3, 0);
9323 new_bit_field3 = EnumLengthBits::update(new_bit_field3, 9323 new_bit_field3 = EnumLengthBits::update(new_bit_field3,
9324 kInvalidEnumCacheSentinel); 9324 kInvalidEnumCacheSentinel);
9325 new_bit_field3 = Deprecated::update(new_bit_field3, false); 9325 new_bit_field3 = Deprecated::update(new_bit_field3, false);
9326 if (!map->is_dictionary_map()) { 9326 if (!map->is_dictionary_map()) {
9327 new_bit_field3 = IsUnstable::update(new_bit_field3, false); 9327 new_bit_field3 = IsUnstable::update(new_bit_field3, false);
9328 } 9328 }
9329 new_bit_field3 =
9330 ConstructionCounter::update(new_bit_field3, kNoSlackTracking);
9331 result->set_bit_field3(new_bit_field3); 9329 result->set_bit_field3(new_bit_field3);
9332 return result; 9330 return result;
9333 } 9331 }
9334 9332
9335 9333
9336 Handle<Map> Map::Normalize(Handle<Map> fast_map, PropertyNormalizationMode mode, 9334 Handle<Map> Map::Normalize(Handle<Map> fast_map, PropertyNormalizationMode mode,
9337 const char* reason) { 9335 const char* reason) {
9338 DCHECK(!fast_map->is_dictionary_map()); 9336 DCHECK(!fast_map->is_dictionary_map());
9339 9337
9340 Isolate* isolate = fast_map->GetIsolate(); 9338 Isolate* isolate = fast_map->GetIsolate();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
9407 } 9405 }
9408 9406
9409 Handle<Map> result = RawCopy(map, new_instance_size); 9407 Handle<Map> result = RawCopy(map, new_instance_size);
9410 9408
9411 if (mode != CLEAR_INOBJECT_PROPERTIES) { 9409 if (mode != CLEAR_INOBJECT_PROPERTIES) {
9412 result->SetInObjectProperties(map->GetInObjectProperties()); 9410 result->SetInObjectProperties(map->GetInObjectProperties());
9413 } 9411 }
9414 9412
9415 result->set_dictionary_map(true); 9413 result->set_dictionary_map(true);
9416 result->set_migration_target(false); 9414 result->set_migration_target(false);
9415 result->set_construction_counter(kNoSlackTracking);
9417 9416
9418 #ifdef VERIFY_HEAP 9417 #ifdef VERIFY_HEAP
9419 if (FLAG_verify_heap) result->DictionaryMapVerify(); 9418 if (FLAG_verify_heap) result->DictionaryMapVerify();
9420 #endif 9419 #endif
9421 9420
9422 return result; 9421 return result;
9423 } 9422 }
9424 9423
9425 9424
9426 Handle<Map> Map::CopyInitialMap(Handle<Map> map, int instance_size, 9425 Handle<Map> Map::CopyInitialMap(Handle<Map> map, int instance_size,
(...skipping 3295 matching lines...) Expand 10 before | Expand all | Expand 10 after
12722 *reinterpret_cast<int*>(data) = slack; 12721 *reinterpret_cast<int*>(data) = slack;
12723 } 12722 }
12724 } 12723 }
12725 12724
12726 12725
12727 static void ShrinkInstanceSize(Map* map, void* data) { 12726 static void ShrinkInstanceSize(Map* map, void* data) {
12728 int slack = *reinterpret_cast<int*>(data); 12727 int slack = *reinterpret_cast<int*>(data);
12729 map->SetInObjectProperties(map->GetInObjectProperties() - slack); 12728 map->SetInObjectProperties(map->GetInObjectProperties() - slack);
12730 map->set_unused_property_fields(map->unused_property_fields() - slack); 12729 map->set_unused_property_fields(map->unused_property_fields() - slack);
12731 map->set_instance_size(map->instance_size() - slack * kPointerSize); 12730 map->set_instance_size(map->instance_size() - slack * kPointerSize);
12731 map->set_construction_counter(Map::kNoSlackTracking);
12732 12732
12733 // Visitor id might depend on the instance size, recalculate it. 12733 // Visitor id might depend on the instance size, recalculate it.
12734 map->set_visitor_id(Heap::GetStaticVisitorIdForMap(map)); 12734 map->set_visitor_id(Heap::GetStaticVisitorIdForMap(map));
12735 } 12735 }
12736 12736
12737 12737
12738 void Map::CompleteInobjectSlackTracking() { 12738 void Map::CompleteInobjectSlackTracking() {
12739 // Has to be an initial map. 12739 // Has to be an initial map.
12740 DCHECK(GetBackPointer()->IsUndefined()); 12740 DCHECK(GetBackPointer()->IsUndefined());
12741 12741
12742 set_construction_counter(kNoSlackTracking);
12743
12744 int slack = unused_property_fields(); 12742 int slack = unused_property_fields();
12745 TransitionArray::TraverseTransitionTree(this, &GetMinInobjectSlack, &slack); 12743 TransitionArray::TraverseTransitionTree(this, &GetMinInobjectSlack, &slack);
12746 if (slack != 0) { 12744 if (slack != 0) {
12747 // Resize the initial map and all maps in its transition tree. 12745 // Resize the initial map and all maps in its transition tree.
12748 TransitionArray::TraverseTransitionTree(this, &ShrinkInstanceSize, &slack); 12746 TransitionArray::TraverseTransitionTree(this, &ShrinkInstanceSize, &slack);
12749 } 12747 }
12750 } 12748 }
12751 12749
12752 12750
12753 static bool PrototypeBenefitsFromNormalization(Handle<JSObject> object) { 12751 static bool PrototypeBenefitsFromNormalization(Handle<JSObject> object) {
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
13325 &in_object_properties); 13323 &in_object_properties);
13326 13324
13327 int unused_property_fields = in_object_properties - pre_allocated; 13325 int unused_property_fields = in_object_properties - pre_allocated;
13328 Handle<Map> map = 13326 Handle<Map> map =
13329 Map::CopyInitialMap(constructor_initial_map, instance_size, 13327 Map::CopyInitialMap(constructor_initial_map, instance_size,
13330 in_object_properties, unused_property_fields); 13328 in_object_properties, unused_property_fields);
13331 map->set_new_target_is_base(false); 13329 map->set_new_target_is_base(false);
13332 13330
13333 JSFunction::SetInitialMap(function, map, prototype); 13331 JSFunction::SetInitialMap(function, map, prototype);
13334 map->SetConstructor(*constructor); 13332 map->SetConstructor(*constructor);
13333 map->set_construction_counter(Map::kNoSlackTracking);
13335 map->StartInobjectSlackTracking(); 13334 map->StartInobjectSlackTracking();
13336 return map; 13335 return map;
13337 } 13336 }
13338 } 13337 }
13339 13338
13340 // Slow path, new.target is either a proxy or can't cache the map. 13339 // Slow path, new.target is either a proxy or can't cache the map.
13341 // new.target.prototype is not guaranteed to be a JSReceiver, and may need to 13340 // new.target.prototype is not guaranteed to be a JSReceiver, and may need to
13342 // fall back to the intrinsicDefaultProto. 13341 // fall back to the intrinsicDefaultProto.
13343 Handle<Object> prototype; 13342 Handle<Object> prototype;
13344 if (new_target->IsJSFunction()) { 13343 if (new_target->IsJSFunction()) {
(...skipping 6642 matching lines...) Expand 10 before | Expand all | Expand 10 after
19987 if (cell->value() != *new_value) { 19986 if (cell->value() != *new_value) {
19988 cell->set_value(*new_value); 19987 cell->set_value(*new_value);
19989 Isolate* isolate = cell->GetIsolate(); 19988 Isolate* isolate = cell->GetIsolate();
19990 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19989 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19991 isolate, DependentCode::kPropertyCellChangedGroup); 19990 isolate, DependentCode::kPropertyCellChangedGroup);
19992 } 19991 }
19993 } 19992 }
19994 19993
19995 } // namespace internal 19994 } // namespace internal
19996 } // namespace v8 19995 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698