Only normalize prototypes in OptimizeAsPrototype if it would benefit.
BUG= Review URL: https://codereview.chromium.org/942833002 Cr-Commit-Position: refs/heads/master@{#26781}
This commit is contained in:
parent
9b02dc5b5f
commit
6e346dfc84
@ -10068,11 +10068,30 @@ void JSFunction::CompleteInobjectSlackTracking() {
|
||||
}
|
||||
|
||||
|
||||
static bool PrototypeBenefitsFromNormalization(Handle<JSObject> object) {
|
||||
DisallowHeapAllocation no_gc;
|
||||
if (!object->HasFastProperties()) return false;
|
||||
Map* map = object->map();
|
||||
if (map->is_prototype_map()) return false;
|
||||
DescriptorArray* descriptors = map->instance_descriptors();
|
||||
for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) {
|
||||
PropertyDetails details = descriptors->GetDetails(i);
|
||||
if (details.location() == kDescriptor) continue;
|
||||
if (details.representation().IsHeapObject() ||
|
||||
details.representation().IsTagged()) {
|
||||
FieldIndex index = FieldIndex::ForDescriptor(map, i);
|
||||
if (object->RawFastPropertyAt(index)->IsJSFunction()) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void JSObject::OptimizeAsPrototype(Handle<JSObject> object,
|
||||
PrototypeOptimizationMode mode) {
|
||||
if (object->IsGlobalObject()) return;
|
||||
if (object->IsJSGlobalProxy()) return;
|
||||
if (mode == FAST_PROTOTYPE && !object->map()->is_prototype_map()) {
|
||||
if (mode == FAST_PROTOTYPE && PrototypeBenefitsFromNormalization(object)) {
|
||||
// First normalize to ensure all JSFunctions are DATA_CONSTANT.
|
||||
JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, 0,
|
||||
"NormalizeAsPrototype");
|
||||
|
Loading…
Reference in New Issue
Block a user