Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index a07a7eb745876a5990d1cb5eccaa3f7bdca4e112..00cbc7aba71c4fa20c7bf92ce626399b8b4b87c1 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -17,25 +17,22 @@ namespace internal { |
CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor() |
- : stack_parameter_count_(no_reg), |
+ : call_descriptor_(NULL), |
+ stack_parameter_count_(no_reg), |
hint_stack_parameter_count_(-1), |
function_mode_(NOT_JS_FUNCTION_STUB_MODE), |
deoptimization_handler_(NULL), |
handler_arguments_mode_(DONT_PASS_ARGUMENTS), |
miss_handler_(), |
- has_miss_handler_(false) { } |
+ has_miss_handler_(false) {} |
void CodeStubInterfaceDescriptor::Initialize( |
- CodeStub::Major major, int register_parameter_count, Register* registers, |
- Address deoptimization_handler, |
- Representation* register_param_representations, |
- int hint_stack_parameter_count, StubFunctionMode function_mode) { |
- InterfaceDescriptor::Initialize(register_parameter_count, registers, |
- register_param_representations); |
- |
+ CodeStub::Major major, CallInterfaceDescriptor* call_descriptor, |
+ Address deoptimization_handler, int hint_stack_parameter_count, |
+ StubFunctionMode function_mode) { |
+ call_descriptor_ = call_descriptor; |
deoptimization_handler_ = deoptimization_handler; |
- |
hint_stack_parameter_count_ = hint_stack_parameter_count; |
function_mode_ = function_mode; |
major_ = major; |
@@ -43,14 +40,12 @@ void CodeStubInterfaceDescriptor::Initialize( |
void CodeStubInterfaceDescriptor::Initialize( |
- CodeStub::Major major, int register_parameter_count, Register* registers, |
+ CodeStub::Major major, CallInterfaceDescriptor* call_descriptor, |
Register stack_parameter_count, Address deoptimization_handler, |
- Representation* register_param_representations, |
int hint_stack_parameter_count, StubFunctionMode function_mode, |
HandlerArgumentsMode handler_mode) { |
- Initialize(major, register_parameter_count, registers, deoptimization_handler, |
- register_param_representations, hint_stack_parameter_count, |
- function_mode); |
+ Initialize(major, call_descriptor, deoptimization_handler, |
+ hint_stack_parameter_count, function_mode); |
stack_parameter_count_ = stack_parameter_count; |
handler_arguments_mode_ = handler_mode; |
} |
@@ -535,34 +530,28 @@ void JSEntryStub::FinishCode(Handle<Code> code) { |
void LoadFastElementStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- LoadConvention::ReceiverRegister(), |
- LoadConvention::NameRegister()}; |
- STATIC_ASSERT(LoadConvention::kParameterCount == 2); |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers, |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::LoadICCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure)); |
} |
void LoadDictionaryElementStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- LoadConvention::ReceiverRegister(), |
- LoadConvention::NameRegister()}; |
- STATIC_ASSERT(LoadConvention::kParameterCount == 2); |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers, |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::LoadICCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure)); |
} |
void KeyedLoadGenericStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- LoadConvention::ReceiverRegister(), |
- LoadConvention::NameRegister()}; |
- STATIC_ASSERT(LoadConvention::kParameterCount == 2); |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::LoadICCall); |
descriptor->Initialize( |
- MajorKey(), arraysize(registers), registers, |
+ MajorKey(), call_descriptor, |
Runtime::FunctionForId(Runtime::kKeyedGetProperty)->entry); |
} |
@@ -570,17 +559,14 @@ void KeyedLoadGenericStub::InitializeInterfaceDescriptor( |
void HandlerStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
if (kind() == Code::LOAD_IC) { |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- LoadConvention::ReceiverRegister(), |
- LoadConvention::NameRegister()}; |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers); |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::LoadICCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
} else { |
DCHECK_EQ(Code::STORE_IC, kind()); |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- StoreConvention::ReceiverRegister(), |
- StoreConvention::NameRegister(), |
- StoreConvention::ValueRegister()}; |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers, |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::StoreICCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
FUNCTION_ADDR(StoreIC_MissFromStubFailure)); |
} |
} |
@@ -588,53 +574,44 @@ void HandlerStub::InitializeInterfaceDescriptor( |
void StoreFastElementStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- StoreConvention::ReceiverRegister(), |
- StoreConvention::NameRegister(), |
- StoreConvention::ValueRegister()}; |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers, |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::StoreICCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure)); |
} |
void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = { InterfaceDescriptor::ContextRegister(), |
- ValueRegister(), |
- MapRegister(), |
- KeyRegister(), |
- ObjectRegister() }; |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers, |
+ CallInterfaceDescriptor* call_descriptor = isolate()->call_descriptor( |
+ CallDescriptorKey::ElementTransitionAndStoreCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss)); |
} |
void InstanceofStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- Register registers[] = { InterfaceDescriptor::ContextRegister(), |
- InstanceofStub::left(), |
- InstanceofStub::right() }; |
- descriptor->Initialize(MajorKey(), arraysize(registers), registers); |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::InstanceofCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
} |
-static void InitializeVectorLoadStub(CodeStubInterfaceDescriptor* descriptor, |
+static void InitializeVectorLoadStub(Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor, |
CodeStub::Major major, |
Address deoptimization_handler) { |
DCHECK(FLAG_vector_ics); |
- Register registers[] = {InterfaceDescriptor::ContextRegister(), |
- FullVectorLoadConvention::ReceiverRegister(), |
- FullVectorLoadConvention::NameRegister(), |
- FullVectorLoadConvention::SlotRegister(), |
- FullVectorLoadConvention::VectorRegister()}; |
- descriptor->Initialize(major, arraysize(registers), registers, |
- deoptimization_handler); |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate->call_descriptor(CallDescriptorKey::VectorLoadICCall); |
+ descriptor->Initialize(major, call_descriptor, deoptimization_handler); |
} |
void VectorLoadStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
- InitializeVectorLoadStub(descriptor, MajorKey(), |
+ InitializeVectorLoadStub(isolate(), descriptor, MajorKey(), |
FUNCTION_ADDR(VectorLoadIC_MissFromStubFailure)); |
} |
@@ -642,11 +619,161 @@ void VectorLoadStub::InitializeInterfaceDescriptor( |
void VectorKeyedLoadStub::InitializeInterfaceDescriptor( |
CodeStubInterfaceDescriptor* descriptor) { |
InitializeVectorLoadStub( |
- descriptor, MajorKey(), |
+ isolate(), descriptor, MajorKey(), |
FUNCTION_ADDR(VectorKeyedLoadIC_MissFromStubFailure)); |
} |
+void FastNewClosureStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::FastNewClosureCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry); |
+} |
+ |
+ |
+void FastNewContextStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::FastNewContextCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
+} |
+ |
+ |
+void ToNumberStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::ToNumberCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
+} |
+ |
+ |
+void NumberToStringStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::NumberToStringCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry); |
+} |
+ |
+ |
+void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::FastCloneShallowArrayCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry); |
+} |
+ |
+ |
+void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::FastCloneShallowObjectCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry); |
+} |
+ |
+ |
+void CreateAllocationSiteStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::CreateAllocationSiteCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
+} |
+ |
+ |
+void CallFunctionStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::CallFunctionCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
+} |
+ |
+ |
+void CallConstructStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::CallConstructCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor); |
+} |
+ |
+ |
+void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::RegExpConstructResultCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry); |
+} |
+ |
+ |
+void TransitionElementsKindStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::TransitionElementsKindCall); |
+ descriptor->Initialize( |
+ MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry); |
+} |
+ |
+ |
+void CompareNilICStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::CompareNilCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
+ FUNCTION_ADDR(CompareNilIC_Miss)); |
+ descriptor->SetMissHandler( |
+ ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate())); |
+} |
+ |
+void ToBooleanStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::ToBooleanCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
+ FUNCTION_ADDR(ToBooleanIC_Miss)); |
+ descriptor->SetMissHandler( |
+ ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate())); |
+} |
+ |
+ |
+void BinaryOpICStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::BinaryOpCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
+ FUNCTION_ADDR(BinaryOpIC_Miss)); |
+ descriptor->SetMissHandler( |
+ ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate())); |
+} |
+ |
+ |
+void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = isolate()->call_descriptor( |
+ CallDescriptorKey::BinaryOpWithAllocationSiteCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
+ FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite)); |
+} |
+ |
+ |
+void StringAddStub::InitializeInterfaceDescriptor( |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ CallInterfaceDescriptor* call_descriptor = |
+ isolate()->call_descriptor(CallDescriptorKey::StringAddCall); |
+ descriptor->Initialize(MajorKey(), call_descriptor, |
+ Runtime::FunctionForId(Runtime::kStringAdd)->entry); |
+} |
+ |
+ |
void LoadDictionaryElementPlatformStub::Generate(MacroAssembler* masm) { |
ElementHandlerCompiler::GenerateLoadDictionaryElement(masm); |
} |