diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index f8c6507d73..d8891b57d6 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -297,10 +297,10 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // After executing generated code, the receiver_reg and name_reg // may be clobbered. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Handle transition, Handle name, Register receiver_reg, - Register storage_reg, Register value_reg, Register scratch1, - Register scratch2, Register scratch3, Label* miss_label, Label* slow) { + MacroAssembler* masm, LookupResult* lookup, Handle transition, + Handle name, Register receiver_reg, Register storage_reg, + Register value_reg, Register scratch1, Register scratch2, Register scratch3, + Label* miss_label, Label* slow) { // a0 : value. Label exit; @@ -357,13 +357,12 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ sdc1(f4, FieldMemOperand(storage_reg, HeapNumber::kValueOffset)); } - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + // Stub never generated for objects that require access checks. + ASSERT(!transition->is_access_check_needed()); // Perform map transition for the receiver if necessary. if (details.type() == FIELD && - object->map()->unused_property_fields() == 0) { + Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) { // The properties must be extended before we can store the value. // We jump to a runtime call that extends the properties array. __ push(receiver_reg); @@ -403,14 +402,14 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // Adjust for the number of properties stored in the object. Even in the // face of a transition we can use the old map here because the size of the // object and the number of in-object properties is not going to change. - index -= object->map()->inobject_properties(); + index -= transition->inobject_properties(); // TODO(verwaest): Share this code as a code stub. SmiCheck smi_check = representation.IsTagged() ? INLINE_SMI_CHECK : OMIT_SMI_CHECK; if (index < 0) { // Set the property straight into the object. - int offset = object->map()->instance_size() + (index * kPointerSize); + int offset = transition->instance_size() + (index * kPointerSize); if (representation.IsDouble()) { __ sw(storage_reg, FieldMemOperand(receiver_reg, offset)); } else { @@ -725,8 +724,8 @@ void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, Register PropertyHandlerCompiler::CheckPrototypes( - Register object_reg, Handle holder, Register holder_reg, - Register scratch1, Register scratch2, Handle name, Label* miss, + Register object_reg, Register holder_reg, Register scratch1, + Register scratch2, Handle name, Label* miss, PrototypeCheckType check) { Handle receiver_map(IC::TypeToMap(*type(), isolate())); @@ -745,7 +744,7 @@ Register PropertyHandlerCompiler::CheckPrototypes( } Handle prototype = Handle::null(); Handle current_map = receiver_map; - Handle holder_map(holder->map()); + Handle holder_map(holder()->map()); // Traverse the prototype chain and check the maps in the prototype chain for // fast and global objects or do negative lookup for normal objects. while (!current_map.is_identical_to(holder_map)) { @@ -857,14 +856,14 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg, - Handle holder, Handle name, Handle callback) { Label miss; - Register reg = FrontendHeader(object_reg, holder, name, &miss); + Register reg = FrontendHeader(object_reg, name, &miss); - if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { + if (!holder()->HasFastProperties()) { + ASSERT(!holder()->IsGlobalObject()); ASSERT(!reg.is(scratch2())); ASSERT(!reg.is(scratch3())); ASSERT(!reg.is(scratch4())); @@ -900,8 +899,7 @@ Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg, void NamedLoadHandlerCompiler::GenerateLoadField( - Register reg, Handle holder, FieldIndex field, - Representation representation) { + Register reg, FieldIndex field, Representation representation) { if (!reg.is(receiver())) __ mov(receiver(), reg); LoadFieldStub stub(isolate(), field); GenerateTailCall(masm(), stub.GetCode()); @@ -964,11 +962,11 @@ void NamedLoadHandlerCompiler::GenerateLoadCallback( } -void NamedLoadHandlerCompiler::GenerateLoadInterceptor( - Register holder_reg, Handle interceptor_holder, - LookupResult* lookup, Handle name) { - ASSERT(interceptor_holder->HasNamedInterceptor()); - ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); +void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg, + LookupResult* lookup, + Handle name) { + ASSERT(holder()->HasNamedInterceptor()); + ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined()); // So far the most popular follow ups for interceptor loads are FIELD // and CALLBACKS, so inline only them, other cases may be added @@ -998,7 +996,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( // the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code, // the FIELD case might cause a miss during the prototype check. - bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder(); + bool must_perfrom_prototype_check = *holder() != lookup->holder(); bool must_preserve_receiver_reg = !receiver().is(holder_reg) && (lookup->type() == CALLBACKS || must_perfrom_prototype_check); @@ -1015,7 +1013,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( // interceptor's holder has been compiled before (see a caller // of this method). CompileCallLoadPropertyWithInterceptor( - masm(), receiver(), holder_reg, this->name(), interceptor_holder, + masm(), receiver(), holder_reg, this->name(), holder(), IC::kLoadPropertyWithInterceptorOnly); // Check if interceptor provided a value for property. If it's @@ -1034,12 +1032,12 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( } // Leave the internal frame. } - GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); + GenerateLoadPostInterceptor(holder_reg, name, lookup); } else { // !compile_followup_inline // Call the runtime system to load the interceptor. // Check that the maps haven't changed. - PushInterceptorArguments(masm(), receiver(), holder_reg, - this->name(), interceptor_holder); + PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(), + holder()); ExternalReference ref = ExternalReference( IC_Utility(IC::kLoadPropertyWithInterceptor), isolate()); @@ -1050,13 +1048,9 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( Handle NamedStoreHandlerCompiler::CompileStoreCallback( - Handle object, Handle holder, Handle name, + Handle object, Handle name, Handle callback) { - Register holder_reg = Frontend(receiver(), holder, name); - - // Stub never generated for non-global objects that require access - // checks. - ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); + Register holder_reg = Frontend(receiver(), name); __ Push(receiver(), holder_reg); // Receiver. __ li(at, Operand(callback)); // Callback info. @@ -1123,7 +1117,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( - Handle object, Handle name) { + Handle name) { __ Push(receiver(), this->name(), value()); // Do tail-call to the runtime system. @@ -1137,8 +1131,8 @@ Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( Handle NamedLoadHandlerCompiler::CompileLoadNonexistent( - Handle last, Handle name) { - NonexistentFrontend(last, name); + Handle name) { + NonexistentFrontend(name); // Return undefined if maps of the full prototype chain is still the same. __ LoadRoot(v0, Heap::kUndefinedValueRootIndex); @@ -1225,11 +1219,10 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter( Handle NamedLoadHandlerCompiler::CompileLoadGlobal( - Handle global, Handle cell, Handle name, - bool is_dont_delete) { + Handle cell, Handle name, bool is_dont_delete) { Label miss; - FrontendHeader(receiver(), global, name, &miss); + FrontendHeader(receiver(), name, &miss); // Get the value from the cell. Register result = StoreIC::ValueRegister(); diff --git a/src/mips64/stub-cache-mips64.cc b/src/mips64/stub-cache-mips64.cc index 0279a51c53..ac3a5cf3c4 100644 --- a/src/mips64/stub-cache-mips64.cc +++ b/src/mips64/stub-cache-mips64.cc @@ -298,10 +298,10 @@ void NamedStoreHandlerCompiler::GenerateNegativeHolderLookup( // After executing generated code, the receiver_reg and name_reg // may be clobbered. void NamedStoreHandlerCompiler::GenerateStoreTransition( - MacroAssembler* masm, Handle object, LookupResult* lookup, - Handle transition, Handle name, Register receiver_reg, - Register storage_reg, Register value_reg, Register scratch1, - Register scratch2, Register scratch3, Label* miss_label, Label* slow) { + MacroAssembler* masm, LookupResult* lookup, Handle transition, + Handle name, Register receiver_reg, Register storage_reg, + Register value_reg, Register scratch1, Register scratch2, Register scratch3, + Label* miss_label, Label* slow) { // a0 : value. Label exit; @@ -358,13 +358,12 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( __ sdc1(f4, FieldMemOperand(storage_reg, HeapNumber::kValueOffset)); } - // Stub never generated for non-global objects that require access - // checks. - ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); + // Stub never generated for objects that require access checks. + ASSERT(!transition->is_access_check_needed()); // Perform map transition for the receiver if necessary. if (details.type() == FIELD && - object->map()->unused_property_fields() == 0) { + Map::cast(transition->GetBackPointer())->unused_property_fields() == 0) { // The properties must be extended before we can store the value. // We jump to a runtime call that extends the properties array. __ push(receiver_reg); @@ -404,14 +403,14 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( // Adjust for the number of properties stored in the object. Even in the // face of a transition we can use the old map here because the size of the // object and the number of in-object properties is not going to change. - index -= object->map()->inobject_properties(); + index -= transition->inobject_properties(); // TODO(verwaest): Share this code as a code stub. SmiCheck smi_check = representation.IsTagged() ? INLINE_SMI_CHECK : OMIT_SMI_CHECK; if (index < 0) { // Set the property straight into the object. - int offset = object->map()->instance_size() + (index * kPointerSize); + int offset = transition->instance_size() + (index * kPointerSize); if (representation.IsDouble()) { __ sd(storage_reg, FieldMemOperand(receiver_reg, offset)); } else { @@ -726,8 +725,8 @@ void PropertyAccessCompiler::GenerateTailCall(MacroAssembler* masm, Register PropertyHandlerCompiler::CheckPrototypes( - Register object_reg, Handle holder, Register holder_reg, - Register scratch1, Register scratch2, Handle name, Label* miss, + Register object_reg, Register holder_reg, Register scratch1, + Register scratch2, Handle name, Label* miss, PrototypeCheckType check) { Handle receiver_map(IC::TypeToMap(*type(), isolate())); @@ -746,7 +745,7 @@ Register PropertyHandlerCompiler::CheckPrototypes( } Handle prototype = Handle::null(); Handle current_map = receiver_map; - Handle holder_map(holder->map()); + Handle holder_map(holder()->map()); // Traverse the prototype chain and check the maps in the prototype chain for // fast and global objects or do negative lookup for normal objects. while (!current_map.is_identical_to(holder_map)) { @@ -858,14 +857,14 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle name, Label* miss) { Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg, - Handle holder, Handle name, Handle callback) { Label miss; - Register reg = FrontendHeader(object_reg, holder, name, &miss); + Register reg = FrontendHeader(object_reg, name, &miss); - if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) { + if (!holder()->HasFastProperties()) { + ASSERT(!holder()->IsGlobalObject()); ASSERT(!reg.is(scratch2())); ASSERT(!reg.is(scratch3())); ASSERT(!reg.is(scratch4())); @@ -901,8 +900,7 @@ Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg, void NamedLoadHandlerCompiler::GenerateLoadField( - Register reg, Handle holder, FieldIndex field, - Representation representation) { + Register reg, FieldIndex field, Representation representation) { if (!reg.is(receiver())) __ mov(receiver(), reg); LoadFieldStub stub(isolate(), field); GenerateTailCall(masm(), stub.GetCode()); @@ -965,11 +963,11 @@ void NamedLoadHandlerCompiler::GenerateLoadCallback( } -void NamedLoadHandlerCompiler::GenerateLoadInterceptor( - Register holder_reg, Handle interceptor_holder, - LookupResult* lookup, Handle name) { - ASSERT(interceptor_holder->HasNamedInterceptor()); - ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); +void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg, + LookupResult* lookup, + Handle name) { + ASSERT(holder()->HasNamedInterceptor()); + ASSERT(!holder()->GetNamedInterceptor()->getter()->IsUndefined()); // So far the most popular follow ups for interceptor loads are FIELD // and CALLBACKS, so inline only them, other cases may be added @@ -999,7 +997,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( // the holder and it is needed should the interceptor return without any // result. The CALLBACKS case needs the receiver to be passed into C++ code, // the FIELD case might cause a miss during the prototype check. - bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder(); + bool must_perfrom_prototype_check = *holder() != lookup->holder(); bool must_preserve_receiver_reg = !receiver().is(holder_reg) && (lookup->type() == CALLBACKS || must_perfrom_prototype_check); @@ -1016,7 +1014,7 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( // interceptor's holder has been compiled before (see a caller // of this method). CompileCallLoadPropertyWithInterceptor( - masm(), receiver(), holder_reg, this->name(), interceptor_holder, + masm(), receiver(), holder_reg, this->name(), holder(), IC::kLoadPropertyWithInterceptorOnly); // Check if interceptor provided a value for property. If it's @@ -1035,12 +1033,12 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( } // Leave the internal frame. } - GenerateLoadPostInterceptor(holder_reg, interceptor_holder, name, lookup); + GenerateLoadPostInterceptor(holder_reg, name, lookup); } else { // !compile_followup_inline // Call the runtime system to load the interceptor. // Check that the maps haven't changed. - PushInterceptorArguments(masm(), receiver(), holder_reg, - this->name(), interceptor_holder); + PushInterceptorArguments(masm(), receiver(), holder_reg, this->name(), + holder()); ExternalReference ref = ExternalReference( IC_Utility(IC::kLoadPropertyWithInterceptor), isolate()); @@ -1051,13 +1049,9 @@ void NamedLoadHandlerCompiler::GenerateLoadInterceptor( Handle NamedStoreHandlerCompiler::CompileStoreCallback( - Handle object, Handle holder, Handle name, + Handle object, Handle name, Handle callback) { - Register holder_reg = Frontend(receiver(), holder, name); - - // Stub never generated for non-global objects that require access - // checks. - ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); + Register holder_reg = Frontend(receiver(), name); __ Push(receiver(), holder_reg); // Receiver. __ li(at, Operand(callback)); // Callback info. @@ -1124,7 +1118,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( - Handle object, Handle name) { + Handle name) { __ Push(receiver(), this->name(), value()); // Do tail-call to the runtime system. @@ -1138,8 +1132,8 @@ Handle NamedStoreHandlerCompiler::CompileStoreInterceptor( Handle NamedLoadHandlerCompiler::CompileLoadNonexistent( - Handle last, Handle name) { - NonexistentFrontend(last, name); + Handle name) { + NonexistentFrontend(name); // Return undefined if maps of the full prototype chain is still the same. __ LoadRoot(v0, Heap::kUndefinedValueRootIndex); @@ -1226,11 +1220,10 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter( Handle NamedLoadHandlerCompiler::CompileLoadGlobal( - Handle global, Handle cell, Handle name, - bool is_dont_delete) { + Handle cell, Handle name, bool is_dont_delete) { Label miss; - FrontendHeader(receiver(), global, name, &miss); + FrontendHeader(receiver(), name, &miss); // Get the value from the cell. Register result = StoreIC::ValueRegister();