| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index c91ed7c5fd366c24c544b2e4a70637a56e8eabfc..2287dd95c052992be250e87746daeb327e0120d2 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -5076,7 +5076,7 @@ Object* JSObject::GetHiddenProperty(Handle<Name> key) { | 
| // If the proxy is detached, return undefined. | 
| if (iter.IsAtEnd()) return GetHeap()->the_hole_value(); | 
| DCHECK(iter.GetCurrent()->IsJSGlobalObject()); | 
| -    return JSObject::cast(iter.GetCurrent())->GetHiddenProperty(key); | 
| +    return iter.GetCurrent<JSObject>()->GetHiddenProperty(key); | 
| } | 
| DCHECK(!IsJSGlobalProxy()); | 
| Object* inline_value = GetHiddenPropertiesHashTable(); | 
| @@ -5101,9 +5101,8 @@ Handle<Object> JSObject::SetHiddenProperty(Handle<JSObject> object, | 
| // If the proxy is detached, return undefined. | 
| if (iter.IsAtEnd()) return isolate->factory()->undefined_value(); | 
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 
| -    return SetHiddenProperty( | 
| -        Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), key, | 
| -        value); | 
| +    return SetHiddenProperty(PrototypeIterator::GetCurrent<JSObject>(iter), key, | 
| +                             value); | 
| } | 
| DCHECK(!object->IsJSGlobalProxy()); | 
|  | 
| @@ -5134,8 +5133,8 @@ void JSObject::DeleteHiddenProperty(Handle<JSObject> object, Handle<Name> key) { | 
| PrototypeIterator iter(isolate, object); | 
| if (iter.IsAtEnd()) return; | 
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 
| -    return DeleteHiddenProperty( | 
| -        Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), key); | 
| +    return DeleteHiddenProperty(PrototypeIterator::GetCurrent<JSObject>(iter), | 
| +                                key); | 
| } | 
|  | 
| Object* inline_value = object->GetHiddenPropertiesHashTable(); | 
| @@ -5548,8 +5547,7 @@ MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | 
| PrototypeIterator iter(isolate, object); | 
| if (iter.IsAtEnd()) return object; | 
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 
| -    return PreventExtensions( | 
| -        Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); | 
| +    return PreventExtensions(PrototypeIterator::GetCurrent<JSObject>(iter)); | 
| } | 
|  | 
| // It's not possible to seal objects with external array elements | 
| @@ -5591,7 +5589,7 @@ bool JSObject::IsExtensible() { | 
| PrototypeIterator iter(GetIsolate(), this); | 
| if (iter.IsAtEnd()) return false; | 
| DCHECK(iter.GetCurrent()->IsJSGlobalObject()); | 
| -    return JSObject::cast(iter.GetCurrent())->map()->is_extensible(); | 
| +    return iter.GetCurrent<JSObject>()->map()->is_extensible(); | 
| } | 
| return map()->is_extensible(); | 
| } | 
| @@ -5642,7 +5640,7 @@ MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( | 
| if (iter.IsAtEnd()) return object; | 
| DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 
| return PreventExtensionsWithTransition<attrs>( | 
| -        Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); | 
| +        PrototypeIterator::GetCurrent<JSObject>(iter)); | 
| } | 
|  | 
| // It's not possible to seal or freeze objects with external array elements | 
| @@ -6097,14 +6095,14 @@ bool JSReceiver::IsSimpleEnum() { | 
| PrototypeIterator::START_AT_RECEIVER); | 
| !iter.IsAtEnd(); iter.Advance()) { | 
| if (!iter.GetCurrent()->IsJSObject()) return false; | 
| -    JSObject* curr = JSObject::cast(iter.GetCurrent()); | 
| -    int enum_length = curr->map()->EnumLength(); | 
| +    JSObject* current = iter.GetCurrent<JSObject>(); | 
| +    int enum_length = current->map()->EnumLength(); | 
| if (enum_length == kInvalidEnumCacheSentinel) return false; | 
| -    if (curr->IsAccessCheckNeeded()) return false; | 
| -    DCHECK(!curr->HasNamedInterceptor()); | 
| -    DCHECK(!curr->HasIndexedInterceptor()); | 
| -    if (curr->NumberOfEnumElements() > 0) return false; | 
| -    if (curr != this && enum_length != 0) return false; | 
| +    if (current->IsAccessCheckNeeded()) return false; | 
| +    DCHECK(!current->HasNamedInterceptor()); | 
| +    DCHECK(!current->HasIndexedInterceptor()); | 
| +    if (current->NumberOfEnumElements() > 0) return false; | 
| +    if (current != this && enum_length != 0) return false; | 
| } | 
| return true; | 
| } | 
| @@ -6305,8 +6303,7 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 
| PrototypeIterator::START_AT_RECEIVER); | 
| !iter.IsAtEnd(end); iter.Advance()) { | 
| if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { | 
| -      Handle<JSProxy> proxy(JSProxy::cast(*PrototypeIterator::GetCurrent(iter)), | 
| -                            isolate); | 
| +      Handle<JSProxy> proxy = PrototypeIterator::GetCurrent<JSProxy>(iter); | 
| Handle<Object> args[] = { proxy }; | 
| Handle<Object> names; | 
| ASSIGN_RETURN_ON_EXCEPTION( | 
| @@ -6325,8 +6322,7 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 
| break; | 
| } | 
|  | 
| -    Handle<JSObject> current = | 
| -        Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); | 
| +    Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter); | 
|  | 
| // Check access rights if required. | 
| if (current->IsAccessCheckNeeded() && !isolate->MayAccess(current)) { | 
| @@ -6409,7 +6405,7 @@ bool Map::DictionaryElementsInPrototypeChainOnly() { | 
| if (iter.GetCurrent()->IsJSProxy()) return true; | 
| // String wrappers have non-configurable, non-writable elements. | 
| if (iter.GetCurrent()->IsStringWrapper()) return true; | 
| -    JSObject* current = JSObject::cast(iter.GetCurrent()); | 
| +    JSObject* current = iter.GetCurrent<JSObject>(); | 
|  | 
| if (current->HasDictionaryElements() && | 
| current->element_dictionary()->requires_slow_elements()) { | 
| @@ -9968,7 +9964,7 @@ bool JSObject::UnregisterPrototypeUser(Handle<Map> user, Isolate* isolate) { | 
| if (slot == PrototypeInfo::UNREGISTERED) return false; | 
| if (prototype->IsJSGlobalProxy()) { | 
| PrototypeIterator iter(isolate, prototype); | 
| -    prototype = Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); | 
| +    prototype = PrototypeIterator::GetCurrent<JSObject>(iter); | 
| } | 
| DCHECK(prototype->map()->is_prototype_map()); | 
| Object* maybe_proto_info = prototype->map()->prototype_info(); | 
| @@ -10020,7 +10016,7 @@ void JSObject::InvalidatePrototypeChains(Map* map) { | 
| DisallowHeapAllocation no_gc; | 
| if (map->IsJSGlobalProxyMap()) { | 
| PrototypeIterator iter(map); | 
| -    map = JSObject::cast(iter.GetCurrent())->map(); | 
| +    map = iter.GetCurrent<JSObject>()->map(); | 
| } | 
| InvalidatePrototypeChainsInternal(map); | 
| } | 
| @@ -10060,7 +10056,7 @@ Handle<Cell> Map::GetOrCreatePrototypeChainValidityCell(Handle<Map> map, | 
| Handle<JSObject> prototype = Handle<JSObject>::cast(maybe_prototype); | 
| if (prototype->IsJSGlobalProxy()) { | 
| PrototypeIterator iter(isolate, prototype); | 
| -    prototype = Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); | 
| +    prototype = PrototypeIterator::GetCurrent<JSObject>(iter); | 
| } | 
| // Ensure the prototype is registered with its own prototypes so its cell | 
| // will be invalidated when necessary. | 
| @@ -12391,7 +12387,7 @@ MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object, | 
| for (PrototypeIterator iter(isolate, *value, | 
| PrototypeIterator::START_AT_RECEIVER); | 
| !iter.IsAtEnd(); iter.Advance()) { | 
| -    if (JSReceiver::cast(iter.GetCurrent()) == *object) { | 
| +    if (iter.GetCurrent<JSReceiver>() == *object) { | 
| // Cycle detected. | 
| THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kCyclicProto), | 
| Object); | 
| @@ -12407,8 +12403,7 @@ MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object, | 
| // hidden and set the new prototype on that object. | 
| PrototypeIterator iter(isolate, real_receiver); | 
| while (!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { | 
| -      real_receiver = | 
| -          Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); | 
| +      real_receiver = PrototypeIterator::GetCurrent<JSObject>(iter); | 
| iter.Advance(); | 
| if (!real_receiver->map()->is_extensible()) { | 
| THROW_NEW_ERROR( | 
|  |