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

Side by Side Diff: src/objects.cc

Issue 2525573002: [runtime] Always normalize prototype maps that aren't marked as 'should be fast' yet (Closed)
Patch Set: minor cleanup Created 4 years 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 | « no previous file | test/mjsunit/fast-prototype.js » ('j') | 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 <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 12521 matching lines...) Expand 10 before | Expand all | Expand 10 after
12532 TransitionArray::TraverseTransitionTree(this, &ShrinkInstanceSize, &slack); 12532 TransitionArray::TraverseTransitionTree(this, &ShrinkInstanceSize, &slack);
12533 } else { 12533 } else {
12534 TransitionArray::TraverseTransitionTree(this, &StopSlackTracking, nullptr); 12534 TransitionArray::TraverseTransitionTree(this, &StopSlackTracking, nullptr);
12535 } 12535 }
12536 } 12536 }
12537 12537
12538 12538
12539 static bool PrototypeBenefitsFromNormalization(Handle<JSObject> object) { 12539 static bool PrototypeBenefitsFromNormalization(Handle<JSObject> object) {
12540 DisallowHeapAllocation no_gc; 12540 DisallowHeapAllocation no_gc;
12541 if (!object->HasFastProperties()) return false; 12541 if (!object->HasFastProperties()) return false;
12542 Map* map = object->map(); 12542 if (object->IsJSGlobalProxy()) return false;
12543 if (map->is_prototype_map()) return false; 12543 if (object->GetIsolate()->bootstrapper()->IsActive()) return false;
12544 DescriptorArray* descriptors = map->instance_descriptors(); 12544 return !object->map()->is_prototype_map() ||
12545 for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) { 12545 !object->map()->should_be_fast_prototype_map();
12546 PropertyDetails details = descriptors->GetDetails(i);
12547 if (details.location() == kDescriptor) continue;
12548 if (details.representation().IsHeapObject() ||
12549 details.representation().IsTagged()) {
12550 FieldIndex index = FieldIndex::ForDescriptor(map, i);
12551 if (object->RawFastPropertyAt(index)->IsJSFunction()) return true;
12552 }
12553 }
12554 return false;
12555 } 12546 }
12556 12547
12557 // static 12548 // static
12558 void JSObject::MakePrototypesFast(Handle<Object> receiver, 12549 void JSObject::MakePrototypesFast(Handle<Object> receiver,
12559 WhereToStart where_to_start, 12550 WhereToStart where_to_start,
12560 Isolate* isolate) { 12551 Isolate* isolate) {
12561 if (!receiver->IsJSReceiver()) return; 12552 if (!receiver->IsJSReceiver()) return;
12562 for (PrototypeIterator iter(isolate, Handle<JSReceiver>::cast(receiver), 12553 for (PrototypeIterator iter(isolate, Handle<JSReceiver>::cast(receiver),
12563 where_to_start); 12554 where_to_start);
12564 !iter.IsAtEnd(); iter.Advance()) { 12555 !iter.IsAtEnd(); iter.Advance()) {
12565 Handle<Object> current = PrototypeIterator::GetCurrent(iter); 12556 Handle<Object> current = PrototypeIterator::GetCurrent(iter);
12566 if (!current->IsJSObject()) return; 12557 if (!current->IsJSObject()) return;
12567 Handle<JSObject> current_obj = Handle<JSObject>::cast(current); 12558 Handle<JSObject> current_obj = Handle<JSObject>::cast(current);
12568 Map* current_map = current_obj->map(); 12559 Map* current_map = current_obj->map();
12569 if (current_map->is_prototype_map() && 12560 if (current_map->is_prototype_map()) {
12570 !current_map->should_be_fast_prototype_map()) { 12561 // If the map is already marked as should be fast, we're done. Its
12562 // prototypes will have been marked already as well.
12563 if (current_map->should_be_fast_prototype_map()) return;
12571 Handle<Map> map(current_map); 12564 Handle<Map> map(current_map);
12572 Map::SetShouldBeFastPrototypeMap(map, true, isolate); 12565 Map::SetShouldBeFastPrototypeMap(map, true, isolate);
12573 JSObject::OptimizeAsPrototype(current_obj, FAST_PROTOTYPE); 12566 JSObject::OptimizeAsPrototype(current_obj, FAST_PROTOTYPE);
12574 } 12567 }
12575 } 12568 }
12576 } 12569 }
12577 12570
12578 // static 12571 // static
12579 void JSObject::OptimizeAsPrototype(Handle<JSObject> object, 12572 void JSObject::OptimizeAsPrototype(Handle<JSObject> object,
12580 PrototypeOptimizationMode mode) { 12573 PrototypeOptimizationMode mode) {
(...skipping 7846 matching lines...) Expand 10 before | Expand all | Expand 10 after
20427 // depend on this. 20420 // depend on this.
20428 return DICTIONARY_ELEMENTS; 20421 return DICTIONARY_ELEMENTS;
20429 } 20422 }
20430 DCHECK_LE(kind, LAST_ELEMENTS_KIND); 20423 DCHECK_LE(kind, LAST_ELEMENTS_KIND);
20431 return kind; 20424 return kind;
20432 } 20425 }
20433 } 20426 }
20434 20427
20435 } // namespace internal 20428 } // namespace internal
20436 } // namespace v8 20429 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/fast-prototype.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698