Revision: 22723
Author: [email protected]
Date: Wed Jul 30 16:26:21 2014 UTC
Log: MIPS: Encapsulate the holder in the PropertyHolderCompilers.
Port r22704 (d3d7830)
BUG=
[email protected]
Review URL: https://codereview.chromium.org/427943003
http://code.google.com/p/v8/source/detail?r=22723
Modified:
/branches/bleeding_edge/src/mips/stub-cache-mips.cc
/branches/bleeding_edge/src/mips64/stub-cache-mips64.cc
=======================================
--- /branches/bleeding_edge/src/mips/stub-cache-mips.cc Wed Jul 30 13:39:20
2014 UTC
+++ /branches/bleeding_edge/src/mips/stub-cache-mips.cc Wed Jul 30 16:26:21
2014 UTC
@@ -297,10 +297,10 @@
// After executing generated code, the receiver_reg and name_reg
// may be clobbered.
void NamedStoreHandlerCompiler::GenerateStoreTransition(
- MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
- Handle<Map> transition, Handle<Name> 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<Map> transition,
+ Handle<Name> 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 @@
__ 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 @@
// 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 @@
Register PropertyHandlerCompiler::CheckPrototypes(
- Register object_reg, Handle<JSObject> holder, Register holder_reg,
- Register scratch1, Register scratch2, Handle<Name> name, Label* miss,
+ Register object_reg, Register holder_reg, Register scratch1,
+ Register scratch2, Handle<Name> name, Label* miss,
PrototypeCheckType check) {
Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));
@@ -745,7 +744,7 @@
}
Handle<JSObject> prototype = Handle<JSObject>::null();
Handle<Map> current_map = receiver_map;
- Handle<Map> holder_map(holder->map());
+ Handle<Map> 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 @@
Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
- Handle<JSObject>
holder,
Handle<Name> name,
Handle<Object>
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 @@
void NamedLoadHandlerCompiler::GenerateLoadField(
- Register reg, Handle<JSObject> 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::GenerateLoadInterceptor(
- Register holder_reg, Handle<JSObject> interceptor_holder,
- LookupResult* lookup, Handle<Name> name) {
- ASSERT(interceptor_holder->HasNamedInterceptor());
-
ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult*
lookup,
+ Handle<Name> 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 @@
// 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 @@
// 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 @@
}
// 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 @@
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+ Handle<JSObject> object, Handle<Name> name,
Handle<ExecutableAccessorInfo> 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 @@
Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
- Handle<JSObject> object, Handle<Name> name) {
+ Handle<Name> name) {
__ Push(receiver(), this->name(), value());
// Do tail-call to the runtime system.
@@ -1137,8 +1131,8 @@
Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
- Handle<JSObject> last, Handle<Name> name) {
- NonexistentFrontend(last, name);
+ Handle<Name> name) {
+ NonexistentFrontend(name);
// Return undefined if maps of the full prototype chain is still the
same.
__ LoadRoot(v0, Heap::kUndefinedValueRootIndex);
@@ -1225,11 +1219,10 @@
Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
- Handle<GlobalObject> global, Handle<PropertyCell> cell, Handle<Name>
name,
- bool is_dont_delete) {
+ Handle<PropertyCell> cell, Handle<Name> 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();
=======================================
--- /branches/bleeding_edge/src/mips64/stub-cache-mips64.cc Wed Jul 30
13:39:20 2014 UTC
+++ /branches/bleeding_edge/src/mips64/stub-cache-mips64.cc Wed Jul 30
16:26:21 2014 UTC
@@ -298,10 +298,10 @@
// After executing generated code, the receiver_reg and name_reg
// may be clobbered.
void NamedStoreHandlerCompiler::GenerateStoreTransition(
- MacroAssembler* masm, Handle<JSObject> object, LookupResult* lookup,
- Handle<Map> transition, Handle<Name> 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<Map> transition,
+ Handle<Name> 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 @@
__ 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 @@
// 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 @@
Register PropertyHandlerCompiler::CheckPrototypes(
- Register object_reg, Handle<JSObject> holder, Register holder_reg,
- Register scratch1, Register scratch2, Handle<Name> name, Label* miss,
+ Register object_reg, Register holder_reg, Register scratch1,
+ Register scratch2, Handle<Name> name, Label* miss,
PrototypeCheckType check) {
Handle<Map> receiver_map(IC::TypeToMap(*type(), isolate()));
@@ -746,7 +745,7 @@
}
Handle<JSObject> prototype = Handle<JSObject>::null();
Handle<Map> current_map = receiver_map;
- Handle<Map> holder_map(holder->map());
+ Handle<Map> 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 @@
Register NamedLoadHandlerCompiler::CallbackFrontend(Register object_reg,
- Handle<JSObject>
holder,
Handle<Name> name,
Handle<Object>
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 @@
void NamedLoadHandlerCompiler::GenerateLoadField(
- Register reg, Handle<JSObject> 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::GenerateLoadInterceptor(
- Register holder_reg, Handle<JSObject> interceptor_holder,
- LookupResult* lookup, Handle<Name> name) {
- ASSERT(interceptor_holder->HasNamedInterceptor());
-
ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
+void NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg,
+ LookupResult*
lookup,
+ Handle<Name> 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 @@
// 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 @@
// 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 @@
}
// 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 @@
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<JSObject> holder, Handle<Name> name,
+ Handle<JSObject> object, Handle<Name> name,
Handle<ExecutableAccessorInfo> 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 @@
Handle<Code> NamedStoreHandlerCompiler::CompileStoreInterceptor(
- Handle<JSObject> object, Handle<Name> name) {
+ Handle<Name> name) {
__ Push(receiver(), this->name(), value());
// Do tail-call to the runtime system.
@@ -1138,8 +1132,8 @@
Handle<Code> NamedLoadHandlerCompiler::CompileLoadNonexistent(
- Handle<JSObject> last, Handle<Name> name) {
- NonexistentFrontend(last, name);
+ Handle<Name> name) {
+ NonexistentFrontend(name);
// Return undefined if maps of the full prototype chain is still the
same.
__ LoadRoot(v0, Heap::kUndefinedValueRootIndex);
@@ -1226,11 +1220,10 @@
Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal(
- Handle<GlobalObject> global, Handle<PropertyCell> cell, Handle<Name>
name,
- bool is_dont_delete) {
+ Handle<PropertyCell> cell, Handle<Name> 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();
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.