| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 02d66b34ac6acc0325f6f2603fa081c4a82845ce..9007e9338f907210fc8746f667926175a8ac6e7e 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -998,12 +998,11 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| Handle<HeapType> type = receiver_type();
|
| Handle<JSObject> holder = lookup->GetHolder<JSObject>();
|
| bool receiver_is_holder = object.is_identical_to(holder);
|
| - NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| - cache_holder);
|
| -
|
| // -------------- Interceptors --------------
|
| if (lookup->state() == LookupIterator::INTERCEPTOR) {
|
| DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined());
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| return compiler.CompileLoadInterceptor(name);
|
| }
|
| DCHECK(lookup->state() == LookupIterator::PROPERTY);
|
| @@ -1033,6 +1032,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| return slow_stub();
|
| }
|
| if (!holder->HasFastProperties()) return slow_stub();
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| return compiler.CompileLoadCallback(name, info);
|
| }
|
| if (accessors->IsAccessorPair()) {
|
| @@ -1048,6 +1049,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| return slow_stub();
|
| }
|
| CallOptimization call_optimization(function);
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| if (call_optimization.is_simple_api_call() &&
|
| call_optimization.IsCompatibleReceiver(object, holder)) {
|
| return compiler.CompileLoadCallback(name, call_optimization);
|
| @@ -1064,6 +1067,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| if (lookup->property_encoding() == LookupIterator::DICTIONARY) {
|
| if (kind() != Code::LOAD_IC) return slow_stub();
|
| if (holder->IsGlobalObject()) {
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| Handle<PropertyCell> cell = lookup->GetPropertyCell();
|
| Handle<Code> code =
|
| compiler.CompileLoadGlobal(cell, name, lookup->IsConfigurable());
|
| @@ -1089,6 +1094,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| if (receiver_is_holder) {
|
| return SimpleFieldLoad(field);
|
| }
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| return compiler.CompileLoadField(name, field);
|
| }
|
|
|
| @@ -1098,6 +1105,8 @@ Handle<Code> LoadIC::CompileHandler(LookupIterator* lookup,
|
| LoadConstantStub stub(isolate(), lookup->GetConstantIndex());
|
| return stub.GetCode();
|
| }
|
| + NamedLoadHandlerCompiler compiler(isolate(), receiver_type(), holder,
|
| + cache_holder);
|
| return compiler.CompileLoadConstant(name, lookup->GetConstantIndex());
|
| }
|
|
|
| @@ -1459,7 +1468,6 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
| Handle<JSObject> receiver = Handle<JSObject>::cast(object);
|
|
|
| Handle<JSObject> holder(lookup->holder());
|
| - NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);
|
|
|
| if (lookup->IsTransition()) {
|
| // Explicitly pass in the receiver map since LookupForWrite may have
|
| @@ -1469,6 +1477,7 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
|
|
| if (details.type() != CALLBACKS && details.attributes() == NONE &&
|
| holder->HasFastProperties()) {
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);
|
| return compiler.CompileStoreTransition(transition, name);
|
| }
|
| } else {
|
| @@ -1486,6 +1495,7 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
| lookup->representation());
|
| return stub.GetCode();
|
| }
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);
|
| return compiler.CompileStoreField(lookup, name);
|
| }
|
| case NORMAL:
|
| @@ -1521,6 +1531,8 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
| isolate(), info, receiver_type())) {
|
| break;
|
| }
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(),
|
| + holder);
|
| return compiler.CompileStoreCallback(receiver, name, info);
|
| } else if (callback->IsAccessorPair()) {
|
| Handle<Object> setter(
|
| @@ -1530,6 +1542,8 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
| if (!holder->HasFastProperties()) break;
|
| Handle<JSFunction> function = Handle<JSFunction>::cast(setter);
|
| CallOptimization call_optimization(function);
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(),
|
| + holder);
|
| if (call_optimization.is_simple_api_call() &&
|
| call_optimization.IsCompatibleReceiver(receiver, holder)) {
|
| return compiler.CompileStoreCallback(receiver, name,
|
| @@ -1542,9 +1556,11 @@ Handle<Code> StoreIC::CompileStoreHandler(LookupResult* lookup,
|
| DCHECK(callback->IsDeclaredAccessorInfo());
|
| break;
|
| }
|
| - case INTERCEPTOR:
|
| + case INTERCEPTOR: {
|
| DCHECK(HasInterceptorSetter(*holder));
|
| + NamedStoreHandlerCompiler compiler(isolate(), receiver_type(), holder);
|
| return compiler.CompileStoreInterceptor(name);
|
| + }
|
| case CONSTANT:
|
| break;
|
| case NONEXISTENT:
|
|
|