Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index dc9daffb82d5632968df5d6544c953da35ab0369..44bc2f2e6b4a56fad8e89fab7e997e58615f8073 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1069,7 +1069,7 @@ MaybeObject* KeyedLoadIC::Load(Handle<Object> object, Handle<Object> key) { |
maybe_object = LoadIC::Load(object, Handle<String>::cast(key)); |
if (maybe_object->IsFailure()) return maybe_object; |
} else if (FLAG_use_ic && !object->IsAccessCheckNeeded()) { |
- ASSERT(!object->IsAccessCheckNeeded()); |
+ ASSERT(!object->IsJSGlobalProxy()); |
if (object->IsString() && key->IsNumber()) { |
if (state() == UNINITIALIZED) stub = string_stub(); |
} else if (object->IsJSObject()) { |
@@ -1122,9 +1122,7 @@ static bool LookupForWrite(Handle<JSObject> receiver, |
} |
if (lookup->IsPropertyCallbacks()) return true; |
- // JSGlobalProxy either stores on the global object in the prototype, or |
- // goes into the runtime if access checks are needed, so this is always |
- // safe. |
+ // JSGlobalProxy always goes via the runtime, so it's safe to cache. |
if (receiver->IsJSGlobalProxy()) return true; |
// Currently normal holders in the prototype chain are not supported. They |
// would require a runtime positive lookup and verification that the details |
@@ -1311,7 +1309,7 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup, |
Handle<String> name, |
Handle<Object> value, |
InlineCacheHolderFlag cache_holder) { |
- if (object->IsAccessCheckNeeded()) return slow_stub(); |
+ if (object->IsJSGlobalProxy()) return slow_stub(); |
ASSERT(cache_holder == OWN_MAP); |
// This is currently guaranteed by checks in StoreIC::Store. |
Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
@@ -1339,19 +1337,17 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup, |
} |
case NORMAL: |
if (kind() == Code::KEYED_STORE_IC) break; |
- if (receiver->IsJSGlobalProxy() || receiver->IsGlobalObject()) { |
+ if (receiver->IsGlobalObject()) { |
// The stub generated for the global object picks the value directly |
// from the property cell. So the property must be directly on the |
// global object. |
- Handle<GlobalObject> global = receiver->IsJSGlobalProxy() |
- ? handle(GlobalObject::cast(receiver->GetPrototype())) |
- : Handle<GlobalObject>::cast(receiver); |
+ Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver); |
Handle<PropertyCell> cell(global->GetPropertyCell(lookup), isolate()); |
Handle<HeapType> union_type = PropertyCell::UpdatedType(cell, value); |
- StoreGlobalStub stub( |
- union_type->IsConstant(), receiver->IsJSGlobalProxy()); |
+ StoreGlobalStub stub(union_type->IsConstant()); |
+ |
Handle<Code> code = stub.GetCodeCopyFromTemplate( |
- isolate(), *global, *cell); |
+ isolate(), receiver->map(), *cell); |
// TODO(verwaest): Move caching of these NORMAL stubs outside as well. |
HeapObject::UpdateMapCodeCache(receiver, name, code); |
return code; |
@@ -1688,7 +1684,7 @@ MaybeObject* KeyedStoreIC::Store(Handle<Object> object, |
} |
if (use_ic) { |
- ASSERT(!object->IsAccessCheckNeeded()); |
+ ASSERT(!object->IsJSGlobalProxy()); |
if (object->IsJSObject()) { |
Handle<JSObject> receiver = Handle<JSObject>::cast(object); |