| Index: src/interface-descriptors.h
|
| diff --git a/src/interface-descriptors.h b/src/interface-descriptors.h
|
| index af59bdb121727e2eaf4c0f9c8ad6782fbc412ab1..c465e0b692a68c9b66ea2d78be0065e3b080300a 100644
|
| --- a/src/interface-descriptors.h
|
| +++ b/src/interface-descriptors.h
|
| @@ -106,46 +106,50 @@ class PlatformInterfaceDescriptor;
|
|
|
| class CallInterfaceDescriptorData {
|
| public:
|
| - CallInterfaceDescriptorData()
|
| - : register_param_count_(-1), function_type_(nullptr) {}
|
| + CallInterfaceDescriptorData() : register_param_count_(-1), param_count_(-1) {}
|
|
|
| // A copy of the passed in registers and param_representations is made
|
| // and owned by the CallInterfaceDescriptorData.
|
|
|
| - void InitializePlatformIndependent(FunctionType* function_type) {
|
| - function_type_ = function_type;
|
| - }
|
| -
|
| - // TODO(mvstanton): Instead of taking parallel arrays register and
|
| - // param_representations, how about a struct that puts the representation
|
| - // and register side by side (eg, RegRep(r1, Representation::Tagged()).
|
| - // The same should go for the CodeStubDescriptor class.
|
| void InitializePlatformSpecific(
|
| int register_parameter_count, const Register* registers,
|
| PlatformInterfaceDescriptor* platform_descriptor = NULL);
|
|
|
| - bool IsInitialized() const { return register_param_count_ >= 0; }
|
| + // if machine_types is null, then an array of size
|
| + // (register_parameter_count + extra_parameter_count) will be created
|
| + // with MachineType::AnyTagged() for each member.
|
| + //
|
| + // if machine_types is not null, then it should be of the size
|
| + // register_parameter_count. Those members of the parameter array
|
| + // will be initialized from {machine_types}, and the rest initialized
|
| + // to MachineType::AnyTagged().
|
| + void InitializePlatformIndependent(int parameter_count,
|
| + int extra_parameter_count,
|
| + const MachineType* machine_types);
|
| +
|
| + bool IsInitialized() const {
|
| + return register_param_count_ >= 0 && param_count_ >= 0;
|
| + }
|
|
|
| - int param_count() const { return function_type_->Arity(); }
|
| + int param_count() const { return param_count_; }
|
| int register_param_count() const { return register_param_count_; }
|
| Register register_param(int index) const { return register_params_[index]; }
|
| Register* register_params() const { return register_params_.get(); }
|
| - Type* param_type(int index) const { return function_type_->Parameter(index); }
|
| + MachineType param_type(int index) const { return machine_types_[index]; }
|
| PlatformInterfaceDescriptor* platform_specific_descriptor() const {
|
| return platform_specific_descriptor_;
|
| }
|
|
|
| private:
|
| int register_param_count_;
|
| + int param_count_;
|
|
|
| // The Register params are allocated dynamically by the
|
| // InterfaceDescriptor, and freed on destruction. This is because static
|
| // arrays of Registers cause creation of runtime static initializers
|
| // which we don't want.
|
| std::unique_ptr<Register[]> register_params_;
|
| -
|
| - // Specifies types for parameters and return
|
| - FunctionType* function_type_;
|
| + std::unique_ptr<MachineType[]> machine_types_;
|
|
|
| PlatformInterfaceDescriptor* platform_specific_descriptor_;
|
|
|
| @@ -186,7 +190,7 @@ class CallInterfaceDescriptor {
|
| return data()->register_param(index);
|
| }
|
|
|
| - Type* GetParameterType(int index) const {
|
| + MachineType GetParameterType(int index) const {
|
| DCHECK(index < data()->param_count());
|
| return data()->param_type(index);
|
| }
|
| @@ -200,21 +204,18 @@ class CallInterfaceDescriptor {
|
|
|
| const char* DebugName(Isolate* isolate) const;
|
|
|
| - static FunctionType* BuildDefaultFunctionType(Isolate* isolate,
|
| - int parameter_count);
|
| -
|
| protected:
|
| const CallInterfaceDescriptorData* data() const { return data_; }
|
|
|
| - virtual FunctionType* BuildCallInterfaceDescriptorFunctionType(
|
| - Isolate* isolate, int register_param_count) {
|
| - return BuildDefaultFunctionType(isolate, register_param_count);
|
| - }
|
| -
|
| virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
|
| UNREACHABLE();
|
| }
|
|
|
| + virtual void InitializePlatformIndependent(
|
| + CallInterfaceDescriptorData* data) {
|
| + data->InitializePlatformIndependent(data->register_param_count(), 0, NULL);
|
| + }
|
| +
|
| void Initialize(Isolate* isolate, CallDescriptors::Key key) {
|
| if (!data()->IsInitialized()) {
|
| // We should only initialize descriptors on the isolate's main thread.
|
| @@ -222,9 +223,7 @@ class CallInterfaceDescriptor {
|
| 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());
|
| - d->InitializePlatformIndependent(function_type);
|
| + InitializePlatformIndependent(d);
|
| }
|
| }
|
|
|
| @@ -264,22 +263,18 @@ class CallInterfaceDescriptor {
|
| \
|
| public:
|
|
|
| -#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \
|
| - DECLARE_DESCRIPTOR(name, base) \
|
| - protected: \
|
| - FunctionType* BuildCallInterfaceDescriptorFunctionType( \
|
| - Isolate* isolate, int register_param_count) override; \
|
| - \
|
| +#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \
|
| + DECLARE_DESCRIPTOR(name, base) \
|
| + protected: \
|
| + void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \
|
| + override; \
|
| + \
|
| public:
|
|
|
| #define DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(name, base, arg) \
|
| DECLARE_DESCRIPTOR_WITH_BASE(name, base) \
|
| protected: \
|
| - FunctionType* BuildCallInterfaceDescriptorFunctionType( \
|
| - Isolate* isolate, int register_param_count) override { \
|
| - return BuildCallInterfaceDescriptorFunctionTypeWithArg( \
|
| - isolate, register_param_count, arg); \
|
| - } \
|
| + int extra_args() const override { return arg; } \
|
| \
|
| public:
|
|
|
| @@ -312,11 +307,12 @@ class OnStackArgsDescriptorBase : public CallInterfaceDescriptor {
|
| static CallInterfaceDescriptor ForArgs(Isolate* isolate, int parameter_count);
|
|
|
| protected:
|
| + virtual int extra_args() const { return 0; }
|
| OnStackArgsDescriptorBase(Isolate* isolate, CallDescriptors::Key key)
|
| : CallInterfaceDescriptor(isolate, key) {}
|
| void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override;
|
| - FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg(
|
| - Isolate* isolate, int register_parameter_count, int parameter_count);
|
| + void InitializePlatformIndependent(
|
| + CallInterfaceDescriptorData* data) override;
|
| };
|
|
|
| class OnStackWith1ArgsDescriptor : public OnStackArgsDescriptorBase {
|
| @@ -795,11 +791,12 @@ class ApiCallbackDescriptorBase : public CallInterfaceDescriptor {
|
| static CallInterfaceDescriptor ForArgs(Isolate* isolate, int argc);
|
|
|
| protected:
|
| + virtual int extra_args() const { return 0; }
|
| ApiCallbackDescriptorBase(Isolate* isolate, CallDescriptors::Key key)
|
| : CallInterfaceDescriptor(isolate, key) {}
|
| void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override;
|
| - FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg(
|
| - Isolate* isolate, int parameter_count, int argc);
|
| + void InitializePlatformIndependent(
|
| + CallInterfaceDescriptorData* data) override;
|
| };
|
|
|
| class ApiCallbackWith0ArgsDescriptor : public ApiCallbackDescriptorBase {
|
|
|