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..8de2a019a4f2a6030e868ce67b8bcd84e47d10c8 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()); |
@@ -890,10 +888,12 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( |
compile_followup_inline = true; |
} else if (lookup->type() == CALLBACKS && |
lookup->GetCallbackObject()->IsExecutableAccessorInfo()) { |
- ExecutableAccessorInfo* callback = |
- ExecutableAccessorInfo::cast(lookup->GetCallbackObject()); |
- compile_followup_inline = callback->getter() != NULL && |
- callback->IsCompatibleReceiver(*object); |
+ Handle<ExecutableAccessorInfo> callback( |
+ ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); |
+ compile_followup_inline = |
+ callback->getter() != NULL && |
+ ExecutableAccessorInfo::IsCompatibleReceiverType(isolate(), callback, |
+ type()); |
} |
} |
@@ -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); |