| 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);
|
|
|