| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index f43921b2b7904d975f229b7aae4e62bc295784d8..0fe4a5409ed9e5e22617a398e38d15aa5bd0036c 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -16,20 +16,20 @@ namespace v8 {
|
| namespace internal {
|
|
|
|
|
| -CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor(CodeStub* stub)
|
| - : stack_parameter_count_(no_reg),
|
| +CodeStubDescriptor::CodeStubDescriptor(CodeStub* stub)
|
| + : call_descriptor_(stub->GetCallInterfaceDescriptor()),
|
| + 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) {
|
| - stub->InitializeInterfaceDescriptor(this);
|
| + stub->InitializeDescriptor(this);
|
| }
|
|
|
|
|
| -CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor(Isolate* isolate,
|
| - uint32_t stub_key)
|
| +CodeStubDescriptor::CodeStubDescriptor(Isolate* isolate, uint32_t stub_key)
|
| : stack_parameter_count_(no_reg),
|
| hint_stack_parameter_count_(-1),
|
| function_mode_(NOT_JS_FUNCTION_STUB_MODE),
|
| @@ -37,29 +37,25 @@ CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor(Isolate* isolate,
|
| handler_arguments_mode_(DONT_PASS_ARGUMENTS),
|
| miss_handler_(),
|
| has_miss_handler_(false) {
|
| - CodeStub::InitializeInterfaceDescriptor(isolate, stub_key, this);
|
| + CodeStub::InitializeDescriptor(isolate, stub_key, this);
|
| }
|
|
|
|
|
| -void CodeStubInterfaceDescriptor::Initialize(
|
| - CodeStub::Major major, CallInterfaceDescriptor call_descriptor,
|
| - Address deoptimization_handler, int hint_stack_parameter_count,
|
| - StubFunctionMode function_mode) {
|
| - call_descriptor_ = call_descriptor;
|
| +void CodeStubDescriptor::Initialize(Address deoptimization_handler,
|
| + int hint_stack_parameter_count,
|
| + StubFunctionMode function_mode) {
|
| deoptimization_handler_ = deoptimization_handler;
|
| hint_stack_parameter_count_ = hint_stack_parameter_count;
|
| function_mode_ = function_mode;
|
| - major_ = major;
|
| }
|
|
|
|
|
| -void CodeStubInterfaceDescriptor::Initialize(
|
| - CodeStub::Major major, CallInterfaceDescriptor call_descriptor,
|
| - Register stack_parameter_count, Address deoptimization_handler,
|
| - int hint_stack_parameter_count, StubFunctionMode function_mode,
|
| - HandlerArgumentsMode handler_mode) {
|
| - Initialize(major, call_descriptor, deoptimization_handler,
|
| - hint_stack_parameter_count, function_mode);
|
| +void CodeStubDescriptor::Initialize(Register stack_parameter_count,
|
| + Address deoptimization_handler,
|
| + int hint_stack_parameter_count,
|
| + StubFunctionMode function_mode,
|
| + HandlerArgumentsMode handler_mode) {
|
| + Initialize(deoptimization_handler, hint_stack_parameter_count, function_mode);
|
| stack_parameter_count_ = stack_parameter_count;
|
| handler_arguments_mode_ = handler_mode;
|
| }
|
| @@ -234,18 +230,19 @@ void CodeStub::Dispatch(Isolate* isolate, uint32_t key, void** value_out,
|
| }
|
|
|
|
|
| -static void GetInterfaceDescriptorDispatchedCall(CodeStub* stub,
|
| - void** value_out) {
|
| - CodeStubInterfaceDescriptor* descriptor_out =
|
| - reinterpret_cast<CodeStubInterfaceDescriptor*>(value_out);
|
| - stub->InitializeInterfaceDescriptor(descriptor_out);
|
| +static void InitializeDescriptorDispatchedCall(CodeStub* stub,
|
| + void** value_out) {
|
| + CodeStubDescriptor* descriptor_out =
|
| + reinterpret_cast<CodeStubDescriptor*>(value_out);
|
| + stub->InitializeDescriptor(descriptor_out);
|
| + descriptor_out->set_call_descriptor(stub->GetCallInterfaceDescriptor());
|
| }
|
|
|
|
|
| -void CodeStub::InitializeInterfaceDescriptor(
|
| - Isolate* isolate, uint32_t key, CodeStubInterfaceDescriptor* desc) {
|
| +void CodeStub::InitializeDescriptor(Isolate* isolate, uint32_t key,
|
| + CodeStubDescriptor* desc) {
|
| void** value_out = reinterpret_cast<void**>(desc);
|
| - Dispatch(isolate, key, value_out, &GetInterfaceDescriptorDispatchedCall);
|
| + Dispatch(isolate, key, value_out, &InitializeDescriptorDispatchedCall);
|
| }
|
|
|
|
|
| @@ -547,231 +544,158 @@ void JSEntryStub::FinishCode(Handle<Code> code) {
|
| }
|
|
|
|
|
| -void LoadFastElementStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - LoadDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure));
|
| +void LoadFastElementStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure));
|
| }
|
|
|
|
|
| -void LoadDictionaryElementStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - LoadDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure));
|
| +void LoadDictionaryElementStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure));
|
| }
|
|
|
|
|
| -void KeyedLoadGenericStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - LoadDescriptor call_descriptor(isolate());
|
| +void KeyedLoadGenericStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kKeyedGetProperty)->entry);
|
| }
|
|
|
|
|
| -void HandlerStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - if (kind() == Code::LOAD_IC) {
|
| - LoadDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| - } else {
|
| - DCHECK_EQ(Code::STORE_IC, kind());
|
| - StoreDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(StoreIC_MissFromStubFailure));
|
| +void HandlerStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + if (kind() == Code::STORE_IC) {
|
| + descriptor->Initialize(FUNCTION_ADDR(StoreIC_MissFromStubFailure));
|
| }
|
| }
|
|
|
|
|
| -void StoreFastElementStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - StoreDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure));
|
| +CallInterfaceDescriptor HandlerStub::GetCallInterfaceDescriptor() {
|
| + if (kind() == Code::LOAD_IC) {
|
| + return LoadDescriptor(isolate());
|
| + } else {
|
| + DCHECK_EQ(Code::STORE_IC, kind());
|
| + return StoreDescriptor(isolate());
|
| + }
|
| }
|
|
|
|
|
| -void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - ElementTransitionAndStoreDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
|
| +void StoreFastElementStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure));
|
| }
|
|
|
|
|
| -void InstanceofStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - InstanceofDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| +void ElementsTransitionAndStoreStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
|
| }
|
|
|
|
|
| static void InitializeVectorLoadStub(Isolate* isolate,
|
| - CodeStubInterfaceDescriptor* descriptor,
|
| - CodeStub::Major major,
|
| + CodeStubDescriptor* descriptor,
|
| Address deoptimization_handler) {
|
| DCHECK(FLAG_vector_ics);
|
| - VectorLoadICDescriptor call_descriptor(isolate);
|
| - descriptor->Initialize(major, call_descriptor, deoptimization_handler);
|
| + descriptor->Initialize(deoptimization_handler);
|
| }
|
|
|
|
|
| -void VectorLoadStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - InitializeVectorLoadStub(isolate(), descriptor, MajorKey(),
|
| +void VectorLoadStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + InitializeVectorLoadStub(isolate(), descriptor,
|
| FUNCTION_ADDR(VectorLoadIC_MissFromStubFailure));
|
| }
|
|
|
|
|
| -void VectorKeyedLoadStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| +void VectorKeyedLoadStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| InitializeVectorLoadStub(
|
| - isolate(), descriptor, MajorKey(),
|
| + isolate(), descriptor,
|
| FUNCTION_ADDR(VectorKeyedLoadIC_MissFromStubFailure));
|
| }
|
|
|
|
|
| -void MegamorphicLoadStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - LoadDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| +void MegamorphicLoadStub::InitializeDescriptor(CodeStubDescriptor* d) {}
|
|
|
|
|
| -void FastNewClosureStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - FastNewClosureDescriptor call_descriptor(isolate());
|
| +void FastNewClosureStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry);
|
| }
|
|
|
|
|
| -void FastNewContextStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - FastNewContextDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| +void FastNewContextStub::InitializeDescriptor(CodeStubDescriptor* d) {}
|
|
|
|
|
| -void ToNumberStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - ToNumberDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| +void ToNumberStub::InitializeDescriptor(CodeStubDescriptor* d) {}
|
|
|
|
|
| -void NumberToStringStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| +void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| NumberToStringDescriptor call_descriptor(isolate());
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry);
|
| }
|
|
|
|
|
| -void FastCloneShallowArrayStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| +void FastCloneShallowArrayStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| FastCloneShallowArrayDescriptor call_descriptor(isolate());
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry);
|
| }
|
|
|
|
|
| -void FastCloneShallowObjectStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| +void FastCloneShallowObjectStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| FastCloneShallowObjectDescriptor call_descriptor(isolate());
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry);
|
| }
|
|
|
|
|
| -void CreateAllocationSiteStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - CreateAllocationSiteDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| -
|
| -
|
| -void CallFunctionStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - CallFunctionDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| +void CreateAllocationSiteStub::InitializeDescriptor(CodeStubDescriptor* d) {}
|
|
|
|
|
| -void CallConstructStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - CallConstructDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor);
|
| -}
|
| -
|
| -
|
| -void RegExpConstructResultStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - RegExpConstructResultDescriptor call_descriptor(isolate());
|
| +void RegExpConstructResultStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry);
|
| }
|
|
|
|
|
| -void TransitionElementsKindStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - TransitionElementsKindDescriptor call_descriptor(isolate());
|
| +void TransitionElementsKindStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| descriptor->Initialize(
|
| - MajorKey(), call_descriptor,
|
| Runtime::FunctionForId(Runtime::kTransitionElementsKind)->entry);
|
| }
|
|
|
|
|
| -void CompareNilICStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - CompareNilDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(CompareNilIC_Miss));
|
| +void CompareNilICStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(CompareNilIC_Miss));
|
| descriptor->SetMissHandler(
|
| ExternalReference(IC_Utility(IC::kCompareNilIC_Miss), isolate()));
|
| }
|
|
|
| -void ToBooleanStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - ToBooleanDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(ToBooleanIC_Miss));
|
| +
|
| +void ToBooleanStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(ToBooleanIC_Miss));
|
| descriptor->SetMissHandler(
|
| ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate()));
|
| }
|
|
|
|
|
| -void BinaryOpICStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - BinaryOpDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(BinaryOpIC_Miss));
|
| +void BinaryOpICStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(BinaryOpIC_Miss));
|
| descriptor->SetMissHandler(
|
| ExternalReference(IC_Utility(IC::kBinaryOpIC_Miss), isolate()));
|
| }
|
|
|
|
|
| -void BinaryOpWithAllocationSiteStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - BinaryOpWithAllocationSiteDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite));
|
| +void BinaryOpWithAllocationSiteStub::InitializeDescriptor(
|
| + CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(FUNCTION_ADDR(BinaryOpIC_MissWithAllocationSite));
|
| }
|
|
|
|
|
| -void StringAddStub::InitializeInterfaceDescriptor(
|
| - CodeStubInterfaceDescriptor* descriptor) {
|
| - StringAddDescriptor call_descriptor(isolate());
|
| - descriptor->Initialize(MajorKey(), call_descriptor,
|
| - Runtime::FunctionForId(Runtime::kStringAdd)->entry);
|
| +void StringAddStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
| + descriptor->Initialize(Runtime::FunctionForId(Runtime::kStringAdd)->entry);
|
| }
|
|
|
|
|
|
|