Chromium Code Reviews| Index: src/interface-descriptors.h |
| diff --git a/src/interface-descriptors.h b/src/interface-descriptors.h |
| index d62bee52039fd406d23df241a977f1b42f1190cf..8f9f5384ad833e9d7eb66c5ddd1fb82ed96f40f8 100644 |
| --- a/src/interface-descriptors.h |
| +++ b/src/interface-descriptors.h |
| @@ -67,8 +67,14 @@ class PlatformInterfaceDescriptor; |
| V(Named) \ |
| V(CallHandler) \ |
| V(ArgumentAdaptor) \ |
| - V(ApiFunction) \ |
| - V(ApiAccessor) \ |
| + V(ApiCallbackWith0Args) \ |
| + V(ApiCallbackWith1Args) \ |
| + V(ApiCallbackWith2Args) \ |
| + V(ApiCallbackWith3Args) \ |
| + V(ApiCallbackWith4Args) \ |
| + V(ApiCallbackWith5Args) \ |
| + V(ApiCallbackWith6Args) \ |
| + V(ApiCallbackWith7Args) \ |
| V(ApiGetter) \ |
| V(LoadGlobalViaContext) \ |
| V(StoreGlobalViaContext) \ |
| @@ -199,6 +205,7 @@ class CallInterfaceDescriptor { |
| void Initialize(Isolate* isolate, CallDescriptors::Key key) { |
| if (!data()->IsInitialized()) { |
| CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key); |
| + DCHECK(d == data()); // d should be a modifiable pointer to data(). |
| InitializePlatformSpecific(d); |
| FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType( |
| isolate, d->register_param_count()); |
| @@ -210,18 +217,20 @@ class CallInterfaceDescriptor { |
| const CallInterfaceDescriptorData* data_; |
| }; |
| +#define DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ |
| + public: \ |
| + explicit name(Isolate* isolate) : base(isolate, key()) { \ |
| + Initialize(isolate, key()); \ |
| + } \ |
| + static inline CallDescriptors::Key key(); |
| #define DECLARE_DESCRIPTOR(name, base) \ |
| - explicit name(Isolate* isolate) : base(isolate, key()) { \ |
| - Initialize(isolate, key()); \ |
| - } \ |
| - \ |
| + DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ |
| protected: \ |
| void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; \ |
| name(Isolate* isolate, CallDescriptors::Key key) : base(isolate, key) {} \ |
| \ |
| - public: \ |
| - static inline CallDescriptors::Key key(); |
| + public: |
| #define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \ |
| DECLARE_DESCRIPTOR(name, base) \ |
| @@ -689,18 +698,83 @@ class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor { |
| CallInterfaceDescriptor) |
| }; |
| +// The ApiCallback*Descriptors have a lot of boilerplate. Because |
| +// - the macros in this file assumes a class name ends in "Descriptor", |
| +// - the platform-specific part is independent of the number of arguments, |
| +// - several macros assume static dispatch, |
| +// we have a regular 'base' class, plus a templated base class for a given |
| +// number of arguments. |
| +// |
| +// Neither 'base' class is meant to be instantiated directly, and neither |
| +// has public constructors to ensure this is so. |
| +// |
| +// The simplest usage for all the ApiCallback*Descriptors is probably |
| +// ApiCallbackDescriptorBase::ForArgs(isolate, argc) |
| +class ApiCallbackDescriptorBase : public CallInterfaceDescriptor { |
| + public: |
| + static CallInterfaceDescriptor ForArgs(Isolate* isolate, int argc); |
| + |
| + protected: |
| + void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; |
| + ApiCallbackDescriptorBase(Isolate* isolate, CallDescriptors::Key key) |
| + : CallInterfaceDescriptor(isolate, key) {} |
| +}; |
| + |
| +template <int argc> |
|
danno
2016/03/04 18:07:43
Is this template magic really necessary? Can you n
vogelheim
2016/03/08 12:59:27
Removed, and replaced with DECLARE_DESCRIPTOR_WITH
|
| +class ApiCallbackWithArgsBase : public ApiCallbackDescriptorBase { |
| + protected: |
| + ApiCallbackWithArgsBase(Isolate* isolate, CallDescriptors::Key key) |
| + : ApiCallbackDescriptorBase(isolate, key) {} |
| + FunctionType* BuildCallInterfaceDescriptorFunctionType( |
| + Isolate* isolate, int register_param_count) override; |
| +}; |
| -class ApiFunctionDescriptor : public CallInterfaceDescriptor { |
| +class ApiCallbackWith0ArgsDescriptor : public ApiCallbackWithArgsBase<0> { |
| public: |
| - DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiFunctionDescriptor, |
| - CallInterfaceDescriptor) |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith0ArgsDescriptor, |
| + ApiCallbackWithArgsBase<0>) |
| }; |
| +class ApiCallbackWith1ArgsDescriptor : public ApiCallbackWithArgsBase<1> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith1ArgsDescriptor, |
| + ApiCallbackWithArgsBase<1>) |
| +}; |
| -class ApiAccessorDescriptor : public CallInterfaceDescriptor { |
| +class ApiCallbackWith2ArgsDescriptor : public ApiCallbackWithArgsBase<2> { |
| public: |
| - DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiAccessorDescriptor, |
| - CallInterfaceDescriptor) |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith2ArgsDescriptor, |
| + ApiCallbackWithArgsBase<2>) |
| +}; |
| + |
| +class ApiCallbackWith3ArgsDescriptor : public ApiCallbackWithArgsBase<3> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith3ArgsDescriptor, |
| + ApiCallbackWithArgsBase<3>) |
| +}; |
| + |
| +class ApiCallbackWith4ArgsDescriptor : public ApiCallbackWithArgsBase<4> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith4ArgsDescriptor, |
| + ApiCallbackWithArgsBase<4>) |
| +}; |
| + |
| +class ApiCallbackWith5ArgsDescriptor : public ApiCallbackWithArgsBase<5> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith5ArgsDescriptor, |
| + ApiCallbackWithArgsBase<5>) |
| +}; |
| + |
| +class ApiCallbackWith6ArgsDescriptor : public ApiCallbackWithArgsBase<6> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith6ArgsDescriptor, |
| + ApiCallbackWithArgsBase<6>) |
| +}; |
| + |
| +class ApiCallbackWith7ArgsDescriptor : public ApiCallbackWithArgsBase<7> { |
| + public: |
| + DECLARE_DESCRIPTOR_WITH_BASE(ApiCallbackWith7ArgsDescriptor, |
| + ApiCallbackWithArgsBase<7>) |
| }; |
| @@ -744,7 +818,7 @@ class GrowArrayElementsDescriptor : public CallInterfaceDescriptor { |
| static const Register KeyRegister(); |
| }; |
| -class InterpreterDispatchDescriptor : public CallInterfaceDescriptor { |
| +class InterpreterDispatchDescriptor : public CallInterfaceDescriptor { |
| public: |
| DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterDispatchDescriptor, |
| CallInterfaceDescriptor) |
| @@ -777,8 +851,9 @@ class InterpreterCEntryDescriptor : public CallInterfaceDescriptor { |
| DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor) |
| }; |
| +#undef DECLARE_DESCRIPTOR_WITH_BASE |
| #undef DECLARE_DESCRIPTOR |
| - |
| +#undef DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE |
| // We define the association between CallDescriptors::Key and the specialized |
| // descriptor here to reduce boilerplate and mistakes. |