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:
verwaest 2015-02-20 07:29:49 -08:00 committed by Commit bot
parent 9b02dc5b5f
commit 6e346dfc84

View File

@ -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, void JSObject::OptimizeAsPrototype(Handle<JSObject> object,
PrototypeOptimizationMode mode) { PrototypeOptimizationMode mode) {
if (object->IsGlobalObject()) return; if (object->IsGlobalObject()) return;
if (object->IsJSGlobalProxy()) 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. // First normalize to ensure all JSFunctions are DATA_CONSTANT.
JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, 0, JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, 0,
"NormalizeAsPrototype"); "NormalizeAsPrototype");