| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef SRC_ASMJS_ASM_TYPES_H_ | 5 #ifndef SRC_ASMJS_ASM_TYPES_H_ |
| 6 #define SRC_ASMJS_ASM_TYPES_H_ | 6 #define SRC_ASMJS_ASM_TYPES_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "src/base/compiler-specific.h" |
| 10 #include "src/base/macros.h" | 11 #include "src/base/macros.h" |
| 12 #include "src/globals.h" |
| 11 #include "src/zone/zone-containers.h" | 13 #include "src/zone/zone-containers.h" |
| 12 #include "src/zone/zone.h" | 14 #include "src/zone/zone.h" |
| 13 | 15 |
| 14 namespace v8 { | 16 namespace v8 { |
| 15 namespace internal { | 17 namespace internal { |
| 16 namespace wasm { | 18 namespace wasm { |
| 17 | 19 |
| 18 class AsmType; | 20 class AsmType; |
| 19 class AsmFFIType; | 21 class AsmFFIType; |
| 20 class AsmFunctionType; | 22 class AsmFunctionType; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 static AsmType* New(bitset_t bits) { | 96 static AsmType* New(bitset_t bits) { |
| 95 DCHECK_EQ((bits & kAsmValueTypeTag), 0); | 97 DCHECK_EQ((bits & kAsmValueTypeTag), 0); |
| 96 return reinterpret_cast<AsmType*>( | 98 return reinterpret_cast<AsmType*>( |
| 97 static_cast<uintptr_t>(bits | kAsmValueTypeTag)); | 99 static_cast<uintptr_t>(bits | kAsmValueTypeTag)); |
| 98 } | 100 } |
| 99 | 101 |
| 100 // AsmValueTypes can't be created except through AsmValueType::New. | 102 // AsmValueTypes can't be created except through AsmValueType::New. |
| 101 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmValueType); | 103 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmValueType); |
| 102 }; | 104 }; |
| 103 | 105 |
| 104 class AsmCallableType : public ZoneObject { | 106 class V8_EXPORT_PRIVATE AsmCallableType : public NON_EXPORTED_BASE(ZoneObject) { |
| 105 public: | 107 public: |
| 106 virtual std::string Name() = 0; | 108 virtual std::string Name() = 0; |
| 107 | 109 |
| 108 virtual bool CanBeInvokedWith(AsmType* return_type, | 110 virtual bool CanBeInvokedWith(AsmType* return_type, |
| 109 const ZoneVector<AsmType*>& args) = 0; | 111 const ZoneVector<AsmType*>& args) = 0; |
| 110 | 112 |
| 111 #define DECLARE_CAST(CamelName) \ | 113 #define DECLARE_CAST(CamelName) \ |
| 112 virtual Asm##CamelName* As##CamelName() { return nullptr; } | 114 virtual Asm##CamelName* As##CamelName() { return nullptr; } |
| 113 FOR_EACH_ASM_CALLABLE_TYPE_LIST(DECLARE_CAST) | 115 FOR_EACH_ASM_CALLABLE_TYPE_LIST(DECLARE_CAST) |
| 114 #undef DECLARE_CAST | 116 #undef DECLARE_CAST |
| 115 | 117 |
| 116 protected: | 118 protected: |
| 117 AsmCallableType() = default; | 119 AsmCallableType() = default; |
| 118 virtual ~AsmCallableType() = default; | 120 virtual ~AsmCallableType() = default; |
| 119 virtual bool IsA(AsmType* other); | 121 virtual bool IsA(AsmType* other); |
| 120 | 122 |
| 121 private: | 123 private: |
| 122 friend class AsmType; | 124 friend class AsmType; |
| 123 | 125 |
| 124 DISALLOW_COPY_AND_ASSIGN(AsmCallableType); | 126 DISALLOW_COPY_AND_ASSIGN(AsmCallableType); |
| 125 }; | 127 }; |
| 126 | 128 |
| 127 class AsmFunctionType final : public AsmCallableType { | 129 class V8_EXPORT_PRIVATE AsmFunctionType final : public AsmCallableType { |
| 128 public: | 130 public: |
| 129 AsmFunctionType* AsFunctionType() final { return this; } | 131 AsmFunctionType* AsFunctionType() final { return this; } |
| 130 | 132 |
| 131 void AddArgument(AsmType* type) { args_.push_back(type); } | 133 void AddArgument(AsmType* type) { args_.push_back(type); } |
| 132 const ZoneVector<AsmType*> Arguments() const { return args_; } | 134 const ZoneVector<AsmType*> Arguments() const { return args_; } |
| 133 AsmType* ReturnType() const { return return_type_; } | 135 AsmType* ReturnType() const { return return_type_; } |
| 134 | 136 |
| 135 bool CanBeInvokedWith(AsmType* return_type, | 137 bool CanBeInvokedWith(AsmType* return_type, |
| 136 const ZoneVector<AsmType*>& args) override; | 138 const ZoneVector<AsmType*>& args) override; |
| 137 | 139 |
| 138 protected: | 140 protected: |
| 139 AsmFunctionType(Zone* zone, AsmType* return_type) | 141 AsmFunctionType(Zone* zone, AsmType* return_type) |
| 140 : return_type_(return_type), args_(zone) {} | 142 : return_type_(return_type), args_(zone) {} |
| 141 | 143 |
| 142 private: | 144 private: |
| 143 friend AsmType; | 145 friend AsmType; |
| 144 | 146 |
| 145 std::string Name() override; | 147 std::string Name() override; |
| 146 bool IsA(AsmType* other) override; | 148 bool IsA(AsmType* other) override; |
| 147 | 149 |
| 148 AsmType* return_type_; | 150 AsmType* return_type_; |
| 149 ZoneVector<AsmType*> args_; | 151 ZoneVector<AsmType*> args_; |
| 150 | 152 |
| 151 DISALLOW_COPY_AND_ASSIGN(AsmFunctionType); | 153 DISALLOW_COPY_AND_ASSIGN(AsmFunctionType); |
| 152 }; | 154 }; |
| 153 | 155 |
| 154 class AsmOverloadedFunctionType final : public AsmCallableType { | 156 class V8_EXPORT_PRIVATE AsmOverloadedFunctionType final |
| 157 : public AsmCallableType { |
| 155 public: | 158 public: |
| 156 AsmOverloadedFunctionType* AsOverloadedFunctionType() override { | 159 AsmOverloadedFunctionType* AsOverloadedFunctionType() override { |
| 157 return this; | 160 return this; |
| 158 } | 161 } |
| 159 | 162 |
| 160 void AddOverload(AsmType* overload); | 163 void AddOverload(AsmType* overload); |
| 161 | 164 |
| 162 private: | 165 private: |
| 163 friend AsmType; | 166 friend AsmType; |
| 164 | 167 |
| 165 explicit AsmOverloadedFunctionType(Zone* zone) : overloads_(zone) {} | 168 explicit AsmOverloadedFunctionType(Zone* zone) : overloads_(zone) {} |
| 166 | 169 |
| 167 std::string Name() override; | 170 std::string Name() override; |
| 168 bool CanBeInvokedWith(AsmType* return_type, | 171 bool CanBeInvokedWith(AsmType* return_type, |
| 169 const ZoneVector<AsmType*>& args) override; | 172 const ZoneVector<AsmType*>& args) override; |
| 170 | 173 |
| 171 ZoneVector<AsmType*> overloads_; | 174 ZoneVector<AsmType*> overloads_; |
| 172 | 175 |
| 173 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmOverloadedFunctionType); | 176 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmOverloadedFunctionType); |
| 174 }; | 177 }; |
| 175 | 178 |
| 176 class AsmFFIType final : public AsmCallableType { | 179 class V8_EXPORT_PRIVATE AsmFFIType final : public AsmCallableType { |
| 177 public: | 180 public: |
| 178 AsmFFIType* AsFFIType() override { return this; } | 181 AsmFFIType* AsFFIType() override { return this; } |
| 179 | 182 |
| 180 std::string Name() override { return "Function"; } | 183 std::string Name() override { return "Function"; } |
| 181 bool CanBeInvokedWith(AsmType* return_type, | 184 bool CanBeInvokedWith(AsmType* return_type, |
| 182 const ZoneVector<AsmType*>& args) override; | 185 const ZoneVector<AsmType*>& args) override; |
| 183 | 186 |
| 184 private: | 187 private: |
| 185 friend AsmType; | 188 friend AsmType; |
| 186 | 189 |
| 187 AsmFFIType() = default; | 190 AsmFFIType() = default; |
| 188 | 191 |
| 189 DISALLOW_COPY_AND_ASSIGN(AsmFFIType); | 192 DISALLOW_COPY_AND_ASSIGN(AsmFFIType); |
| 190 }; | 193 }; |
| 191 | 194 |
| 192 class AsmFunctionTableType : public AsmCallableType { | 195 class V8_EXPORT_PRIVATE AsmFunctionTableType : public AsmCallableType { |
| 193 public: | 196 public: |
| 194 AsmFunctionTableType* AsFunctionTableType() override { return this; } | 197 AsmFunctionTableType* AsFunctionTableType() override { return this; } |
| 195 | 198 |
| 196 std::string Name() override; | 199 std::string Name() override; |
| 197 | 200 |
| 198 bool CanBeInvokedWith(AsmType* return_type, | 201 bool CanBeInvokedWith(AsmType* return_type, |
| 199 const ZoneVector<AsmType*>& args) override; | 202 const ZoneVector<AsmType*>& args) override; |
| 200 | 203 |
| 201 size_t length() const { return length_; } | 204 size_t length() const { return length_; } |
| 202 AsmType* signature() { return signature_; } | 205 AsmType* signature() { return signature_; } |
| 203 | 206 |
| 204 private: | 207 private: |
| 205 friend class AsmType; | 208 friend class AsmType; |
| 206 | 209 |
| 207 AsmFunctionTableType(size_t length, AsmType* signature); | 210 AsmFunctionTableType(size_t length, AsmType* signature); |
| 208 | 211 |
| 209 size_t length_; | 212 size_t length_; |
| 210 AsmType* signature_; | 213 AsmType* signature_; |
| 211 | 214 |
| 212 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmFunctionTableType); | 215 DISALLOW_IMPLICIT_CONSTRUCTORS(AsmFunctionTableType); |
| 213 }; | 216 }; |
| 214 | 217 |
| 215 class AsmType { | 218 class V8_EXPORT_PRIVATE AsmType { |
| 216 public: | 219 public: |
| 217 #define DEFINE_CONSTRUCTOR(CamelName, string_name, number, parent_types) \ | 220 #define DEFINE_CONSTRUCTOR(CamelName, string_name, number, parent_types) \ |
| 218 static AsmType* CamelName() { \ | 221 static AsmType* CamelName() { \ |
| 219 return AsmValueType::New(AsmValueType::kAsm##CamelName); \ | 222 return AsmValueType::New(AsmValueType::kAsm##CamelName); \ |
| 220 } | 223 } |
| 221 FOR_EACH_ASM_VALUE_TYPE_LIST(DEFINE_CONSTRUCTOR) | 224 FOR_EACH_ASM_VALUE_TYPE_LIST(DEFINE_CONSTRUCTOR) |
| 222 #undef DEFINE_CONSTRUCTOR | 225 #undef DEFINE_CONSTRUCTOR |
| 223 | 226 |
| 224 #define DEFINE_CAST(CamelCase) \ | 227 #define DEFINE_CAST(CamelCase) \ |
| 225 Asm##CamelCase* As##CamelCase() { \ | 228 Asm##CamelCase* As##CamelCase() { \ |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 // Returns the store type if this is a heap type. AsmType::None is returned if | 341 // Returns the store type if this is a heap type. AsmType::None is returned if |
| 339 // this is not a heap type. | 342 // this is not a heap type. |
| 340 AsmType* StoreType(); | 343 AsmType* StoreType(); |
| 341 }; | 344 }; |
| 342 | 345 |
| 343 } // namespace wasm | 346 } // namespace wasm |
| 344 } // namespace internal | 347 } // namespace internal |
| 345 } // namespace v8 | 348 } // namespace v8 |
| 346 | 349 |
| 347 #endif // SRC_ASMJS_ASM_TYPES_H_ | 350 #endif // SRC_ASMJS_ASM_TYPES_H_ |
| OLD | NEW |