| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index b3ac81a8aa9cc97ea280ab7fa78705d1c1adc251..100cbf90b3493860d8bd0c5c5b4246d8f57e495d 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -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");
|
|
|