Chromium Code Reviews| Index: src/x64/stub-cache-x64.cc |
| diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
| index 93173f162bd3a4811ca0a8e3bc34950034077732..30eec7e1180146a18f992daeb76c5802623b1e40 100644 |
| --- a/src/x64/stub-cache-x64.cc |
| +++ b/src/x64/stub-cache-x64.cc |
| @@ -633,10 +633,10 @@ void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, |
| Register PropertyHandlerCompiler::CheckPrototypes( |
| - Handle<HeapType> type, Register object_reg, Handle<JSObject> holder, |
| - Register holder_reg, Register scratch1, Register scratch2, |
| - Handle<Name> name, Label* miss, PrototypeCheckType check) { |
| - Handle<Map> receiver_map(IC::TypeToMap(*type, isolate())); |
| + Register object_reg, Handle<JSObject> holder, Register holder_reg, |
| + Register scratch1, Register scratch2, Handle<Name> name, Label* miss, |
| + PrototypeCheckType check) { |
| + Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate())); |
| // Make sure there's no overlap between holder and object registers. |
| ASSERT(!scratch1.is(object_reg) && !scratch1.is(holder_reg)); |
| @@ -650,8 +650,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( |
| int depth = 0; |
| Handle<JSObject> current = Handle<JSObject>::null(); |
| - if (type->IsConstant()) { |
| - current = Handle<JSObject>::cast(type->AsConstant()->Value()); |
| + if (type()->IsConstant()) { |
| + current = Handle<JSObject>::cast(type()->AsConstant()->Value()); |
| } |
| Handle<JSObject> prototype = Handle<JSObject>::null(); |
| Handle<Map> current_map = receiver_map; |
| @@ -765,14 +765,13 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
| } |
| -Register NamedLoadHandlerCompiler::CallbackFrontend(Handle<HeapType> type, |
| - Register object_reg, |
| +Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg, |
| Handle<JSObject> holder, |
| Handle<Name> name, |
| Handle<Object> callback) { |
| Label miss; |
| - Register reg = FrontendHeader(type, object_reg, holder, name, &miss); |
| + Register reg = FrontendHeader(object_reg, holder, name, &miss); |
| if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { |
| ASSERT(!reg.is(scratch2())); |
| @@ -875,9 +874,8 @@ void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) { |
| void NamedLoadHandlerCompiler::GenerateLoadInterceptor( |
| - Register holder_reg, Handle<Object> object, |
| - Handle<JSObject> interceptor_holder, LookupResult* lookup, |
| - Handle<Name> name) { |
| + Register holder_reg, Handle<JSObject> interceptor_holder, |
| + LookupResult* lookup, Handle<Name> name) { |
| ASSERT(interceptor_holder->HasNamedInterceptor()); |
| ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); |
| @@ -892,8 +890,10 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( |
| lookup->GetCallbackObject()->IsExecutableAccessorInfo()) { |
| ExecutableAccessorInfo* callback = |
| ExecutableAccessorInfo::cast(lookup->GetCallbackObject()); |
| - compile_followup_inline = callback->getter() != NULL && |
| - callback->IsCompatibleReceiver(*object); |
| + compile_followup_inline = |
| + callback->getter() != NULL && |
| + (!callback->HasExpectedReceiverType() || |
|
Igor Sheludko
2014/07/30 09:19:46
It was easier to understand callback->IsCompatible
|
| + callback->IsCompatibleReceiver(*IC::TypeToMap(*type(), isolate()))); |
| } |
| } |
| @@ -967,8 +967,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( |
| Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
| Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name, |
| Handle<ExecutableAccessorInfo> callback) { |
| - Register holder_reg = |
| - Frontend(IC::CurrentTypeOf(object, isolate()), receiver(), holder, name); |
| + Register holder_reg = Frontend(receiver(), holder, name); |
| __ PopReturnAddressTo(scratch1()); |
| __ Push(receiver()); |
| @@ -1103,8 +1102,8 @@ Handle<Code> PropertyICCompiler::CompileKeyedStorePolymorphic( |
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent( |
| - Handle<HeapType> type, Handle<JSObject> last, Handle<Name> name) { |
| - NonexistentFrontend(type, last, name); |
| + Handle<JSObject> last, Handle<Name> name) { |
| + NonexistentFrontend(last, name); |
| // Return undefined if maps of the full prototype chain are still the |
| // same and no global property with this name contains a value. |
| @@ -1192,30 +1191,27 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter( |
| Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
| - Handle<HeapType> type, Handle<GlobalObject> global, |
| - Handle<PropertyCell> cell, Handle<Name> name, bool is_dont_delete) { |
| + Handle<GlobalObject> global, Handle<PropertyCell> cell, Handle<Name> name, |
| + bool is_dont_delete) { |
| Label miss; |
| - // TODO(verwaest): Directly store to rax. Currently we cannot do this, since |
| - // rax is used as receiver(), which we would otherwise clobber before a |
| - // potential miss. |
| - FrontendHeader(type, receiver(), global, name, &miss); |
| + FrontendHeader(receiver(), global, name, &miss); |
| // Get the value from the cell. |
| - __ Move(rbx, cell); |
| - __ movp(rbx, FieldOperand(rbx, PropertyCell::kValueOffset)); |
| + Register result = StoreIC::ValueRegister(); |
| + __ Move(result, cell); |
| + __ movp(result, FieldOperand(result, PropertyCell::kValueOffset)); |
| // Check for deleted property if property can actually be deleted. |
| if (!is_dont_delete) { |
| - __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex); |
| + __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
| __ j(equal, &miss); |
| } else if (FLAG_debug_code) { |
| - __ CompareRoot(rbx, Heap::kTheHoleValueRootIndex); |
| + __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
| __ Check(not_equal, kDontDeleteCellsCannotContainTheHole); |
| } |
| Counters* counters = isolate()->counters(); |
| __ IncrementCounter(counters->named_load_global_stub(), 1); |
| - __ movp(rax, rbx); |
| __ ret(0); |
| FrontendFooter(name, &miss); |