Chromium Code Reviews| Index: src/code-stubs.cc |
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
| index 09d2e3d790b590e47418f6775f779888a0573230..d831c618b714e739831577d9f3a3fb68df5af78e 100644 |
| --- a/src/code-stubs.cc |
| +++ b/src/code-stubs.cc |
| @@ -177,15 +177,13 @@ const char* CodeStub::MajorName(CodeStub::Major major_key, |
| #define DEF_CASE(name) case name: return #name "Stub"; |
| CODE_STUB_LIST(DEF_CASE) |
| #undef DEF_CASE |
| - case UninitializedMajorKey: return "<UninitializedMajorKey>Stub"; |
| case NoCache: |
| return "<NoCache>Stub"; |
| - default: |
| - if (!allow_unknown_keys) { |
| - UNREACHABLE(); |
| - } |
| + case NUMBER_OF_IDS: |
| + UNREACHABLE(); |
| return NULL; |
| } |
| + return NULL; |
| } |
| @@ -200,6 +198,42 @@ void CodeStub::PrintName(OStream& os) const { // NOLINT |
| } |
| +void CodeStub::Dispatch(Isolate* isolate, uint32_t key, void** value_out, |
|
mvstanton
2014/09/05 13:38:43
As we discussed, this is a better solution than ma
|
| + DispatchedCall call) { |
| + switch (MajorKeyFromKey(key)) { |
| +#define DEF_CASE(NAME) \ |
| + case NAME: { \ |
| + NAME##Stub stub(key, isolate); \ |
| + CodeStub* pstub = &stub; \ |
| + call(pstub, value_out); \ |
| + break; \ |
| + } |
| + CODE_STUB_LIST(DEF_CASE) |
| +#undef DEF_CASE |
| + case NUMBER_OF_IDS: |
| + UNREACHABLE(); |
| + case NoCache: |
| + *value_out = NULL; |
| + break; |
| + } |
| +} |
| + |
| + |
| +static void GetInterfaceDescriptorDispatchedCall(CodeStub* stub, |
| + void** value_out) { |
| + CodeStubInterfaceDescriptor* descriptor_out = |
| + reinterpret_cast<CodeStubInterfaceDescriptor*>(value_out); |
| + stub->InitializeInterfaceDescriptor(descriptor_out); |
| +} |
| + |
| + |
| +void CodeStub::InitializeInterfaceDescriptor( |
| + Isolate* isolate, uint32_t key, CodeStubInterfaceDescriptor* desc) { |
| + void** value_out = reinterpret_cast<void**>(desc); |
| + Dispatch(isolate, key, value_out, &GetInterfaceDescriptorDispatchedCall); |
| +} |
| + |
| + |
| // static |
| void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) { |
| // Generate the uninitialized versions of the stub. |
| @@ -928,102 +962,6 @@ void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, |
| } |
| -static void InstallDescriptor(Isolate* isolate, HydrogenCodeStub* stub) { |
| - int major_key = stub->MajorKey(); |
| - CodeStubInterfaceDescriptor* descriptor = |
| - isolate->code_stub_interface_descriptor(major_key); |
| - if (!descriptor->IsInitialized()) { |
| - stub->InitializeInterfaceDescriptor(descriptor); |
| - } |
| -} |
| - |
| - |
| -void ArrayConstructorStubBase::InstallDescriptors(Isolate* isolate) { |
| - ArrayNoArgumentConstructorStub stub1(isolate, GetInitialFastElementsKind()); |
| - InstallDescriptor(isolate, &stub1); |
| - ArraySingleArgumentConstructorStub stub2(isolate, |
| - GetInitialFastElementsKind()); |
| - InstallDescriptor(isolate, &stub2); |
| - ArrayNArgumentsConstructorStub stub3(isolate, GetInitialFastElementsKind()); |
| - InstallDescriptor(isolate, &stub3); |
| -} |
| - |
| - |
| -void NumberToStringStub::InstallDescriptors(Isolate* isolate) { |
| - NumberToStringStub stub(isolate); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -void FastNewClosureStub::InstallDescriptors(Isolate* isolate) { |
| - FastNewClosureStub stub(isolate, STRICT, false); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -void FastNewContextStub::InstallDescriptors(Isolate* isolate) { |
| - FastNewContextStub stub(isolate, FastNewContextStub::kMaximumSlots); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void FastCloneShallowArrayStub::InstallDescriptors(Isolate* isolate) { |
| - FastCloneShallowArrayStub stub(isolate, DONT_TRACK_ALLOCATION_SITE); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void BinaryOpICStub::InstallDescriptors(Isolate* isolate) { |
| - BinaryOpICStub stub(isolate, Token::ADD, NO_OVERWRITE); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void BinaryOpWithAllocationSiteStub::InstallDescriptors(Isolate* isolate) { |
| - BinaryOpWithAllocationSiteStub stub(isolate, Token::ADD, NO_OVERWRITE); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void StringAddStub::InstallDescriptors(Isolate* isolate) { |
| - StringAddStub stub(isolate, STRING_ADD_CHECK_NONE, NOT_TENURED); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void RegExpConstructResultStub::InstallDescriptors(Isolate* isolate) { |
| - RegExpConstructResultStub stub(isolate); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void KeyedLoadGenericStub::InstallDescriptors(Isolate* isolate) { |
| - KeyedLoadGenericStub stub(isolate); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void StoreFieldStub::InstallDescriptors(Isolate* isolate) { |
| - StoreFieldStub stub(isolate, FieldIndex::ForInObjectOffset(0), |
| - Representation::None()); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| -// static |
| -void LoadFastElementStub::InstallDescriptors(Isolate* isolate) { |
| - LoadFastElementStub stub(isolate, true, FAST_ELEMENTS); |
| - InstallDescriptor(isolate, &stub); |
| -} |
| - |
| - |
| ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
| : PlatformCodeStub(isolate) { |
| minor_key_ = ArgumentCountBits::encode(ANY); |
| @@ -1047,15 +985,6 @@ ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, |
| } |
| -void InternalArrayConstructorStubBase::InstallDescriptors(Isolate* isolate) { |
| - InternalArrayNoArgumentConstructorStub stub1(isolate, FAST_ELEMENTS); |
| - InstallDescriptor(isolate, &stub1); |
| - InternalArraySingleArgumentConstructorStub stub2(isolate, FAST_ELEMENTS); |
| - InstallDescriptor(isolate, &stub2); |
| - InternalArrayNArgumentsConstructorStub stub3(isolate, FAST_ELEMENTS); |
| - InstallDescriptor(isolate, &stub3); |
| -} |
| - |
| InternalArrayConstructorStub::InternalArrayConstructorStub( |
| Isolate* isolate) : PlatformCodeStub(isolate) { |
| InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |