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,
|
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");
|
||||||
|
Loading…
Reference in New Issue
Block a user