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