| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index eb84fd14620367b835a5966327ace69f836918e2..1a8366dfeca114a74b8c2c361252908a2062922f 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -942,7 +942,8 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| Handle<HeapType> type = receiver_type();
|
| Handle<JSObject> holder(lookup->holder());
|
| bool receiver_is_holder = object.is_identical_to(holder);
|
| - NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), cache_holder);
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
|
|
| switch (lookup->type()) {
|
| case FIELD: {
|
| @@ -950,12 +951,11 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| if (receiver_is_holder) {
|
| return SimpleFieldLoad(field);
|
| }
|
| - return compiler.CompileLoadField(holder, name, field,
|
| - lookup->representation());
|
| + return compiler.CompileLoadField(name, field, lookup->representation());
|
| }
|
| case CONSTANT: {
|
| Handle<Object> constant(lookup->GetConstant(), isolate());
|
| - return compiler.CompileLoadConstant(holder, name, constant);
|
| + return compiler.CompileLoadConstant(name, constant);
|
| }
|
| case NORMAL:
|
| if (kind() != Code::LOAD_IC) break;
|
| @@ -963,8 +963,8 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| Handle<GlobalObject> global = Handle<GlobalObject>::cast(holder);
|
| Handle<PropertyCell> cell(
|
| global->GetPropertyCell(lookup), isolate());
|
| - Handle<Code> code = compiler.CompileLoadGlobal(global, cell, name,
|
| - lookup->IsDontDelete());
|
| + Handle<Code> code =
|
| + compiler.CompileLoadGlobal(cell, name, lookup->IsDontDelete());
|
| // TODO(verwaest): Move caching of these NORMAL stubs outside as well.
|
| CacheHolderFlag flag;
|
| Handle<Map> stub_holder_map =
|
| @@ -1001,7 +1001,8 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| type)) {
|
| break;
|
| }
|
| - return compiler.CompileLoadCallback(holder, name, info);
|
| + if (holder->IsGlobalObject()) break;
|
| + return compiler.CompileLoadCallback(name, info);
|
| } else if (callback->IsAccessorPair()) {
|
| Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter(),
|
| isolate());
|
| @@ -1019,9 +1020,9 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| CallOptimization call_optimization(function);
|
| if (call_optimization.is_simple_api_call() &&
|
| call_optimization.IsCompatibleReceiver(object, holder)) {
|
| - return compiler.CompileLoadCallback(holder, name, call_optimization);
|
| + return compiler.CompileLoadCallback(name, call_optimization);
|
| }
|
| - return compiler.CompileLoadViaGetter(holder, name, function);
|
| + return compiler.CompileLoadViaGetter(name, function);
|
| }
|
| // TODO(dcarney): Handle correctly.
|
| ASSERT(callback->IsDeclaredAccessorInfo());
|
| @@ -1029,7 +1030,7 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, Handle<Object> object,
|
| }
|
| case INTERCEPTOR:
|
| ASSERT(HasInterceptorGetter(*holder));
|
| - return compiler.CompileLoadInterceptor(holder, name);
|
| + return compiler.CompileLoadInterceptor(name);
|
| default:
|
| break;
|
| }
|
| @@ -1394,7 +1395,7 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
|
| Handle<JSObject> receiver = Handle<JSObject>::cast(object);
|
|
|
| Handle<JSObject> holder(lookup->holder());
|
| - NamedStoreHandlerCompiler compiler(isolate(), receiver_type());
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);
|
|
|
| if (lookup->IsTransition()) {
|
| // Explicitly pass in the receiver map since LookupForWrite may have
|
| @@ -1403,13 +1404,12 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
|
| PropertyDetails details = lookup->GetPropertyDetails();
|
|
|
| if (details.type() != CALLBACKS && details.attributes() == NONE) {
|
| - return compiler.CompileStoreTransition(
|
| - receiver, lookup, transition, name);
|
| + return compiler.CompileStoreTransition(lookup, transition, name);
|
| }
|
| } else {
|
| switch (lookup->type()) {
|
| case FIELD:
|
| - return compiler.CompileStoreField(receiver, lookup, name);
|
| + return compiler.CompileStoreField(lookup, name);
|
| case NORMAL:
|
| if (kind() == Code::KEYED_STORE_IC) break;
|
| if (receiver->IsJSGlobalProxy() || receiver->IsGlobalObject()) {
|
| @@ -1444,7 +1444,7 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
|
| isolate(), info, receiver_type())) {
|
| break;
|
| }
|
| - return compiler.CompileStoreCallback(receiver, holder, name, info);
|
| + return compiler.CompileStoreCallback(receiver, name, info);
|
| } else if (callback->IsAccessorPair()) {
|
| Handle<Object> setter(
|
| Handle<AccessorPair>::cast(callback)->setter(), isolate());
|
| @@ -1455,11 +1455,11 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
|
| CallOptimization call_optimization(function);
|
| if (call_optimization.is_simple_api_call() &&
|
| call_optimization.IsCompatibleReceiver(receiver, holder)) {
|
| - return compiler.CompileStoreCallback(
|
| - receiver, holder, name, call_optimization);
|
| + return compiler.CompileStoreCallback(receiver, name,
|
| + call_optimization);
|
| }
|
| return compiler.CompileStoreViaSetter(
|
| - receiver, holder, name, Handle<JSFunction>::cast(setter));
|
| + receiver, name, Handle<JSFunction>::cast(setter));
|
| }
|
| // TODO(dcarney): Handle correctly.
|
| ASSERT(callback->IsDeclaredAccessorInfo());
|
| @@ -1468,7 +1468,7 @@ Handle<Code> StoreIC::CompileHandler(LookupResult* lookup,
|
| case INTERCEPTOR:
|
| if (kind() == Code::KEYED_STORE_IC) break;
|
| ASSERT(HasInterceptorSetter(*holder));
|
| - return compiler.CompileStoreInterceptor(receiver, name);
|
| + return compiler.CompileStoreInterceptor(name);
|
| case CONSTANT:
|
| break;
|
| case NONEXISTENT:
|
|
|