| Index: src/objects.cc
 | 
| diff --git a/src/objects.cc b/src/objects.cc
 | 
| index a4bcc7986b2accc4cd575ba4886e733a260b7fad..bf657a2254be64bd731ff861ab85d546758d91da 100644
 | 
| --- a/src/objects.cc
 | 
| +++ b/src/objects.cc
 | 
| @@ -219,7 +219,7 @@ bool FunctionTemplateInfo::IsTemplateFor(Map* map) {
 | 
|    // There is a constraint on the object; check.
 | 
|    if (!map->IsJSObjectMap()) return false;
 | 
|    // Fetch the constructor function of the object.
 | 
| -  Object* cons_obj = map->constructor();
 | 
| +  Object* cons_obj = map->GetConstructor();
 | 
|    if (!cons_obj->IsJSFunction()) return false;
 | 
|    JSFunction* fun = JSFunction::cast(cons_obj);
 | 
|    // Iterate through the chain of inheriting function templates to
 | 
| @@ -1208,7 +1208,7 @@ void JSObject::JSObjectShortPrint(StringStream* accumulator) {
 | 
|      default: {
 | 
|        Map* map_of_this = map();
 | 
|        Heap* heap = GetHeap();
 | 
| -      Object* constructor = map_of_this->constructor();
 | 
| +      Object* constructor = map_of_this->GetConstructor();
 | 
|        bool printed = false;
 | 
|        if (constructor->IsHeapObject() &&
 | 
|            !heap->Contains(HeapObject::cast(constructor))) {
 | 
| @@ -1671,8 +1671,9 @@ String* JSReceiver::class_name() {
 | 
|    if (IsJSFunction() || IsJSFunctionProxy()) {
 | 
|      return GetHeap()->Function_string();
 | 
|    }
 | 
| -  if (map()->constructor()->IsJSFunction()) {
 | 
| -    JSFunction* constructor = JSFunction::cast(map()->constructor());
 | 
| +  Object* maybe_constructor = map()->GetConstructor();
 | 
| +  if (maybe_constructor->IsJSFunction()) {
 | 
| +    JSFunction* constructor = JSFunction::cast(maybe_constructor);
 | 
|      return String::cast(constructor->shared()->instance_class_name());
 | 
|    }
 | 
|    // If the constructor is not present, return "Object".
 | 
| @@ -1681,8 +1682,9 @@ String* JSReceiver::class_name() {
 | 
|  
 | 
|  
 | 
|  String* Map::constructor_name() {
 | 
| -  if (constructor()->IsJSFunction()) {
 | 
| -    JSFunction* constructor = JSFunction::cast(this->constructor());
 | 
| +  Object* maybe_constructor = GetConstructor();
 | 
| +  if (maybe_constructor->IsJSFunction()) {
 | 
| +    JSFunction* constructor = JSFunction::cast(maybe_constructor);
 | 
|      String* name = String::cast(constructor->shared()->name());
 | 
|      if (name->length() > 0) return name;
 | 
|      String* inferred_name = constructor->shared()->inferred_name();
 | 
| @@ -1784,7 +1786,7 @@ void JSObject::AddSlowProperty(Handle<JSObject> object,
 | 
|  
 | 
|  
 | 
|  Context* JSObject::GetCreationContext() {
 | 
| -  Object* constructor = this->map()->constructor();
 | 
| +  Object* constructor = this->map()->GetConstructor();
 | 
|    JSFunction* function;
 | 
|    if (!constructor->IsJSFunction()) {
 | 
|      // Functions have null as a constructor,
 | 
| @@ -5445,7 +5447,7 @@ bool JSObject::ReferencesObject(Object* obj) {
 | 
|    DisallowHeapAllocation no_allocation;
 | 
|  
 | 
|    // Is the object the constructor for this object?
 | 
| -  if (map_of_this->constructor() == obj) {
 | 
| +  if (map_of_this->GetConstructor() == obj) {
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| @@ -5509,7 +5511,7 @@ bool JSObject::ReferencesObject(Object* obj) {
 | 
|      Map* arguments_map =
 | 
|          heap->isolate()->context()->native_context()->sloppy_arguments_map();
 | 
|      JSFunction* arguments_function =
 | 
| -        JSFunction::cast(arguments_map->constructor());
 | 
| +        JSFunction::cast(arguments_map->GetConstructor());
 | 
|  
 | 
|      // Get the context and don't check if it is the native context.
 | 
|      JSFunction* f = JSFunction::cast(this);
 | 
| @@ -5524,7 +5526,7 @@ bool JSObject::ReferencesObject(Object* obj) {
 | 
|        if (context->get(i)->IsJSObject()) {
 | 
|          JSObject* ctxobj = JSObject::cast(context->get(i));
 | 
|          // If it is an arguments array check the content.
 | 
| -        if (ctxobj->map()->constructor() == arguments_function) {
 | 
| +        if (ctxobj->map()->GetConstructor() == arguments_function) {
 | 
|            if (ctxobj->ReferencesObject(obj)) {
 | 
|              return true;
 | 
|            }
 | 
| @@ -6248,7 +6250,7 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
 | 
|    Isolate* isolate = object->GetIsolate();
 | 
|    Handle<FixedArray> content = isolate->factory()->empty_fixed_array();
 | 
|    Handle<JSFunction> arguments_function(
 | 
| -      JSFunction::cast(isolate->sloppy_arguments_map()->constructor()));
 | 
| +      JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor()));
 | 
|  
 | 
|    // Only collect keys if access is permitted.
 | 
|    for (PrototypeIterator iter(isolate, object,
 | 
| @@ -6321,11 +6323,9 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
 | 
|      // array or dictionary.  So the fast inline test for whether to
 | 
|      // use the cache says yes, so we should not create a cache.
 | 
|      bool cache_enum_keys =
 | 
| -        ((current->map()->constructor() != *arguments_function) &&
 | 
| -         !current->IsJSValue() &&
 | 
| -         !current->IsAccessCheckNeeded() &&
 | 
| -         !current->HasNamedInterceptor() &&
 | 
| -         !current->HasIndexedInterceptor());
 | 
| +        ((current->map()->GetConstructor() != *arguments_function) &&
 | 
| +         !current->IsJSValue() && !current->IsAccessCheckNeeded() &&
 | 
| +         !current->HasNamedInterceptor() && !current->HasIndexedInterceptor());
 | 
|      // Compute the property keys and cache them if possible.
 | 
|      ASSIGN_RETURN_ON_EXCEPTION(
 | 
|          isolate, content,
 | 
| @@ -6841,7 +6841,7 @@ Handle<Map> Map::RawCopy(Handle<Map> map, int instance_size) {
 | 
|    Handle<Map> result = map->GetIsolate()->factory()->NewMap(
 | 
|        map->instance_type(), instance_size);
 | 
|    result->SetPrototype(handle(map->prototype(), map->GetIsolate()));
 | 
| -  result->set_constructor(map->constructor());
 | 
| +  result->set_constructor_or_backpointer(map->GetConstructor());
 | 
|    result->set_bit_field(map->bit_field());
 | 
|    result->set_bit_field2(map->bit_field2());
 | 
|    int new_bit_field3 = map->bit_field3();
 | 
| @@ -9555,7 +9555,7 @@ int Map::Hash() {
 | 
|    // addresses.
 | 
|  
 | 
|    // Shift away the tag.
 | 
| -  int hash = ObjectAddressForHashing(constructor()) >> 2;
 | 
| +  int hash = ObjectAddressForHashing(GetConstructor()) >> 2;
 | 
|  
 | 
|    // XOR-ing the prototype and constructor directly yields too many zero bits
 | 
|    // when the two pointers are close (which is fairly common).
 | 
| @@ -9567,7 +9567,7 @@ int Map::Hash() {
 | 
|  
 | 
|  
 | 
|  static bool CheckEquivalent(Map* first, Map* second) {
 | 
| -  return first->constructor() == second->constructor() &&
 | 
| +  return first->GetConstructor() == second->GetConstructor() &&
 | 
|           first->prototype() == second->prototype() &&
 | 
|           first->instance_type() == second->instance_type() &&
 | 
|           first->bit_field() == second->bit_field() &&
 | 
| @@ -9929,8 +9929,9 @@ void JSObject::OptimizeAsPrototype(Handle<JSObject> object,
 | 
|        Handle<Map> new_map = Map::Copy(handle(object->map()), "CopyAsPrototype");
 | 
|        JSObject::MigrateToMap(object, new_map);
 | 
|      }
 | 
| -    if (object->map()->constructor()->IsJSFunction()) {
 | 
| -      JSFunction* constructor = JSFunction::cast(object->map()->constructor());
 | 
| +    Object* maybe_constructor = object->map()->GetConstructor();
 | 
| +    if (maybe_constructor->IsJSFunction()) {
 | 
| +      JSFunction* constructor = JSFunction::cast(maybe_constructor);
 | 
|        // Replace the pointer to the exact constructor with the Object function
 | 
|        // from the same context if undetectable from JS. This is to avoid keeping
 | 
|        // memory alive unnecessarily.
 | 
| @@ -9939,7 +9940,7 @@ void JSObject::OptimizeAsPrototype(Handle<JSObject> object,
 | 
|                object->GetIsolate()->heap()->Object_string()) {
 | 
|          Context* context = constructor->context()->native_context();
 | 
|          JSFunction* object_function = context->object_function();
 | 
| -        object->map()->set_constructor(object_function);
 | 
| +        object->map()->SetConstructor(object_function);
 | 
|        }
 | 
|      }
 | 
|      object->map()->set_is_prototype_map(true);
 | 
| @@ -10126,7 +10127,7 @@ void JSFunction::SetPrototype(Handle<JSFunction> function,
 | 
|      Handle<Map> new_map = Map::Copy(handle(function->map()), "SetPrototype");
 | 
|  
 | 
|      JSObject::MigrateToMap(function, new_map);
 | 
| -    new_map->set_constructor(*value);
 | 
| +    new_map->SetConstructor(*value);
 | 
|      new_map->set_non_instance_prototype(true);
 | 
|      Isolate* isolate = new_map->GetIsolate();
 | 
|      construct_prototype = handle(
 | 
| @@ -10169,7 +10170,7 @@ void JSFunction::SetInitialMap(Handle<JSFunction> function, Handle<Map> map,
 | 
|      map->SetPrototype(prototype, FAST_PROTOTYPE);
 | 
|    }
 | 
|    function->set_prototype_or_initial_map(*map);
 | 
| -  map->set_constructor(*function);
 | 
| +  map->SetConstructor(*function);
 | 
|  #if TRACE_MAPS
 | 
|    if (FLAG_trace_maps) {
 | 
|      PrintF("[TraceMaps: InitialMap map= %p SFI= %d_%s ]\n",
 | 
| @@ -13819,7 +13820,7 @@ void Dictionary<Derived, Shape, Key>::CopyValuesTo(FixedArray* elements) {
 | 
|  
 | 
|  InterceptorInfo* JSObject::GetNamedInterceptor() {
 | 
|    DCHECK(map()->has_named_interceptor());
 | 
| -  JSFunction* constructor = JSFunction::cast(map()->constructor());
 | 
| +  JSFunction* constructor = JSFunction::cast(map()->GetConstructor());
 | 
|    DCHECK(constructor->shared()->IsApiFunction());
 | 
|    Object* result =
 | 
|        constructor->shared()->get_api_func_data()->named_property_handler();
 | 
| @@ -13829,7 +13830,7 @@ InterceptorInfo* JSObject::GetNamedInterceptor() {
 | 
|  
 | 
|  InterceptorInfo* JSObject::GetIndexedInterceptor() {
 | 
|    DCHECK(map()->has_indexed_interceptor());
 | 
| -  JSFunction* constructor = JSFunction::cast(map()->constructor());
 | 
| +  JSFunction* constructor = JSFunction::cast(map()->GetConstructor());
 | 
|    DCHECK(constructor->shared()->IsApiFunction());
 | 
|    Object* result =
 | 
|        constructor->shared()->get_api_func_data()->indexed_property_handler();
 | 
| 
 |