Index: src/ast/ast-types.h |
diff --git a/src/types.h b/src/ast/ast-types.h |
similarity index 53% |
copy from src/types.h |
copy to src/ast/ast-types.h |
index 63dc1d65789eccc130eafaa58df328a11307805c..0b6e23ffdae26775262dc3e99ead2edb8ba1fc9b 100644 |
--- a/src/types.h |
+++ b/src/ast/ast-types.h |
@@ -2,8 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef V8_TYPES_H_ |
-#define V8_TYPES_H_ |
+#ifndef V8_AST_AST_TYPES_H_ |
+#define V8_AST_AST_TYPES_H_ |
#include "src/conversions.h" |
#include "src/handles.h" |
@@ -144,20 +144,19 @@ namespace internal { |
// respective map. Only structured types require allocation. |
// Note that the bitset representation is closed under both Union and Intersect. |
- |
// ----------------------------------------------------------------------------- |
// Values for bitset types |
// clang-format off |
-#define MASK_BITSET_TYPE_LIST(V) \ |
+#define AST_MASK_BITSET_TYPE_LIST(V) \ |
V(Representation, 0xffc00000u) \ |
V(Semantic, 0x003ffffeu) |
-#define REPRESENTATION(k) ((k) & BitsetType::kRepresentation) |
-#define SEMANTIC(k) ((k) & BitsetType::kSemantic) |
+#define AST_REPRESENTATION(k) ((k) & AstBitsetType::kRepresentation) |
+#define AST_SEMANTIC(k) ((k) & AstBitsetType::kSemantic) |
-#define REPRESENTATION_BITSET_TYPE_LIST(V) \ |
+#define AST_REPRESENTATION_BITSET_TYPE_LIST(V) \ |
V(None, 0) \ |
V(UntaggedBit, 1u << 22 | kSemantic) \ |
V(UntaggedIntegral8, 1u << 23 | kSemantic) \ |
@@ -177,33 +176,39 @@ namespace internal { |
V(Untagged, kUntaggedNumber | kUntaggedPointer) \ |
V(Tagged, kTaggedSigned | kTaggedPointer) |
-#define INTERNAL_BITSET_TYPE_LIST(V) \ |
- V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) |
- |
-#define SEMANTIC_BITSET_TYPE_LIST(V) \ |
- V(Negative31, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(Null, 1u << 6 | REPRESENTATION(kTaggedPointer)) \ |
- V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPointer)) \ |
- V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPointer)) \ |
- V(Unsigned30, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
- V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ |
- V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ |
- V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ |
- V(Simd, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ |
- V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ |
- V(OtherUndetectable, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ |
- V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ |
- V(Function, 1u << 19 | REPRESENTATION(kTaggedPointer)) \ |
- V(Hole, 1u << 20 | REPRESENTATION(kTaggedPointer)) \ |
- V(OtherInternal, 1u << 21 | REPRESENTATION(kTagged | kUntagged)) \ |
+#define AST_INTERNAL_BITSET_TYPE_LIST(V) \ |
+ V(OtherUnsigned31, 1u << 1 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(OtherUnsigned32, 1u << 2 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(OtherSigned32, 1u << 3 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(OtherNumber, 1u << 4 | AST_REPRESENTATION(kTagged | kUntaggedNumber)) |
+ |
+#define AST_SEMANTIC_BITSET_TYPE_LIST(V) \ |
+ V(Negative31, 1u << 5 | \ |
+ AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(Null, 1u << 6 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Undefined, 1u << 7 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Boolean, 1u << 8 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Unsigned30, 1u << 9 | \ |
+ AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(MinusZero, 1u << 10 | \ |
+ AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(NaN, 1u << 11 | \ |
+ AST_REPRESENTATION(kTagged | kUntaggedNumber)) \ |
+ V(Symbol, 1u << 12 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(InternalizedString, 1u << 13 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(OtherString, 1u << 14 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Simd, 1u << 15 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(OtherObject, 1u << 17 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(OtherUndetectable, 1u << 16 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Proxy, 1u << 18 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Function, 1u << 19 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(Hole, 1u << 20 | AST_REPRESENTATION(kTaggedPointer)) \ |
+ V(OtherInternal, 1u << 21 | \ |
+ AST_REPRESENTATION(kTagged | kUntagged)) \ |
\ |
V(Signed31, kUnsigned30 | kNegative31) \ |
- V(Signed32, kSigned31 | kOtherUnsigned31 | kOtherSigned32) \ |
+ V(Signed32, kSigned31 | kOtherUnsigned31 | \ |
+ kOtherSigned32) \ |
V(Signed32OrMinusZero, kSigned32 | kMinusZero) \ |
V(Signed32OrMinusZeroOrNaN, kSigned32 | kMinusZero | kNaN) \ |
V(Negative32, kNegative31 | kOtherSigned32) \ |
@@ -261,28 +266,28 @@ namespace internal { |
* occur as part of PlainNumber. |
*/ |
-#define PROPER_BITSET_TYPE_LIST(V) \ |
- REPRESENTATION_BITSET_TYPE_LIST(V) \ |
- SEMANTIC_BITSET_TYPE_LIST(V) |
+#define AST_PROPER_BITSET_TYPE_LIST(V) \ |
+ AST_REPRESENTATION_BITSET_TYPE_LIST(V) \ |
+ AST_SEMANTIC_BITSET_TYPE_LIST(V) |
-#define BITSET_TYPE_LIST(V) \ |
- MASK_BITSET_TYPE_LIST(V) \ |
- REPRESENTATION_BITSET_TYPE_LIST(V) \ |
- INTERNAL_BITSET_TYPE_LIST(V) \ |
- SEMANTIC_BITSET_TYPE_LIST(V) |
+#define AST_BITSET_TYPE_LIST(V) \ |
+ AST_MASK_BITSET_TYPE_LIST(V) \ |
+ AST_REPRESENTATION_BITSET_TYPE_LIST(V) \ |
+ AST_INTERNAL_BITSET_TYPE_LIST(V) \ |
+ AST_SEMANTIC_BITSET_TYPE_LIST(V) |
-class Type; |
+class AstType; |
// ----------------------------------------------------------------------------- |
// Bitset types (internal). |
-class BitsetType { |
+class AstBitsetType { |
public: |
typedef uint32_t bitset; // Internal |
enum : uint32_t { |
#define DECLARE_TYPE(type, value) k##type = (value), |
- BITSET_TYPE_LIST(DECLARE_TYPE) |
+ AST_BITSET_TYPE_LIST(DECLARE_TYPE) |
#undef DECLARE_TYPE |
kUnusedEOL = 0 |
}; |
@@ -295,11 +300,11 @@ class BitsetType { |
} |
static bool IsInhabited(bitset bits) { |
- return SEMANTIC(bits) != kNone && REPRESENTATION(bits) != kNone; |
+ return AST_SEMANTIC(bits) != kNone && AST_REPRESENTATION(bits) != kNone; |
} |
static bool SemanticIsInhabited(bitset bits) { |
- return SEMANTIC(bits) != kNone; |
+ return AST_SEMANTIC(bits) != kNone; |
} |
static bool Is(bitset bits1, bitset bits2) { |
@@ -309,9 +314,9 @@ class BitsetType { |
static double Min(bitset); |
static double Max(bitset); |
- static bitset Glb(Type* type); // greatest lower bound that's a bitset |
+ static bitset Glb(AstType* type); // greatest lower bound that's a bitset |
static bitset Glb(double min, double max); |
- static bitset Lub(Type* type); // least upper bound that's a bitset |
+ static bitset Lub(AstType* type); // least upper bound that's a bitset |
static bitset Lub(i::Map* map); |
static bitset Lub(i::Object* value); |
static bitset Lub(double value); |
@@ -326,17 +331,17 @@ class BitsetType { |
static bitset NumberBits(bitset bits); |
- static bool IsBitset(Type* type) { |
+ static bool IsBitset(AstType* type) { |
return reinterpret_cast<uintptr_t>(type) & 1; |
} |
- static Type* NewForTesting(bitset bits) { return New(bits); } |
+ static AstType* NewForTesting(bitset bits) { return New(bits); } |
private: |
- friend class Type; |
+ friend class AstType; |
- static Type* New(bitset bits) { |
- return reinterpret_cast<Type*>(static_cast<uintptr_t>(bits | 1u)); |
+ static AstType* New(bitset bits) { |
+ return reinterpret_cast<AstType*>(static_cast<uintptr_t>(bits | 1u)); |
} |
struct Boundary { |
@@ -351,9 +356,9 @@ class BitsetType { |
// ----------------------------------------------------------------------------- |
// Superclass for non-bitset types (internal). |
-class TypeBase { |
+class AstTypeBase { |
protected: |
- friend class Type; |
+ friend class AstType; |
enum Kind { |
kClass, |
@@ -367,18 +372,20 @@ class TypeBase { |
}; |
Kind kind() const { return kind_; } |
- explicit TypeBase(Kind kind) : kind_(kind) {} |
+ explicit AstTypeBase(Kind kind) : kind_(kind) {} |
- static bool IsKind(Type* type, Kind kind) { |
- if (BitsetType::IsBitset(type)) return false; |
- TypeBase* base = reinterpret_cast<TypeBase*>(type); |
+ static bool IsKind(AstType* type, Kind kind) { |
+ if (AstBitsetType::IsBitset(type)) return false; |
+ AstTypeBase* base = reinterpret_cast<AstTypeBase*>(type); |
return base->kind() == kind; |
} |
- // The hacky conversion to/from Type*. |
- static Type* AsType(TypeBase* type) { return reinterpret_cast<Type*>(type); } |
- static TypeBase* FromType(Type* type) { |
- return reinterpret_cast<TypeBase*>(type); |
+ // The hacky conversion to/from AstType*. |
+ static AstType* AsType(AstTypeBase* type) { |
+ return reinterpret_cast<AstType*>(type); |
+ } |
+ static AstTypeBase* FromType(AstType* type) { |
+ return reinterpret_cast<AstTypeBase*>(type); |
} |
private: |
@@ -388,61 +395,61 @@ class TypeBase { |
// ----------------------------------------------------------------------------- |
// Class types. |
-class ClassType : public TypeBase { |
+class AstClassType : public AstTypeBase { |
public: |
i::Handle<i::Map> Map() { return map_; } |
private: |
- friend class Type; |
- friend class BitsetType; |
+ friend class AstType; |
+ friend class AstBitsetType; |
- static Type* New(i::Handle<i::Map> map, Zone* zone) { |
- return AsType(new (zone->New(sizeof(ClassType))) |
- ClassType(BitsetType::Lub(*map), map)); |
+ static AstType* New(i::Handle<i::Map> map, Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstClassType))) |
+ AstClassType(AstBitsetType::Lub(*map), map)); |
} |
- static ClassType* cast(Type* type) { |
+ static AstClassType* cast(AstType* type) { |
DCHECK(IsKind(type, kClass)); |
- return static_cast<ClassType*>(FromType(type)); |
+ return static_cast<AstClassType*>(FromType(type)); |
} |
- ClassType(BitsetType::bitset bitset, i::Handle<i::Map> map) |
- : TypeBase(kClass), bitset_(bitset), map_(map) {} |
+ AstClassType(AstBitsetType::bitset bitset, i::Handle<i::Map> map) |
+ : AstTypeBase(kClass), bitset_(bitset), map_(map) {} |
- BitsetType::bitset Lub() { return bitset_; } |
+ AstBitsetType::bitset Lub() { return bitset_; } |
- BitsetType::bitset bitset_; |
+ AstBitsetType::bitset bitset_; |
Handle<i::Map> map_; |
}; |
// ----------------------------------------------------------------------------- |
// Constant types. |
-class ConstantType : public TypeBase { |
+class AstConstantType : public AstTypeBase { |
public: |
i::Handle<i::Object> Value() { return object_; } |
private: |
- friend class Type; |
- friend class BitsetType; |
+ friend class AstType; |
+ friend class AstBitsetType; |
- static Type* New(i::Handle<i::Object> value, Zone* zone) { |
- BitsetType::bitset bitset = BitsetType::Lub(*value); |
- return AsType(new (zone->New(sizeof(ConstantType))) |
- ConstantType(bitset, value)); |
+ static AstType* New(i::Handle<i::Object> value, Zone* zone) { |
+ AstBitsetType::bitset bitset = AstBitsetType::Lub(*value); |
+ return AsType(new (zone->New(sizeof(AstConstantType))) |
+ AstConstantType(bitset, value)); |
} |
- static ConstantType* cast(Type* type) { |
+ static AstConstantType* cast(AstType* type) { |
DCHECK(IsKind(type, kConstant)); |
- return static_cast<ConstantType*>(FromType(type)); |
+ return static_cast<AstConstantType*>(FromType(type)); |
} |
- ConstantType(BitsetType::bitset bitset, i::Handle<i::Object> object) |
- : TypeBase(kConstant), bitset_(bitset), object_(object) {} |
+ AstConstantType(AstBitsetType::bitset bitset, i::Handle<i::Object> object) |
+ : AstTypeBase(kConstant), bitset_(bitset), object_(object) {} |
- BitsetType::bitset Lub() { return bitset_; } |
+ AstBitsetType::bitset Lub() { return bitset_; } |
- BitsetType::bitset bitset_; |
+ AstBitsetType::bitset bitset_; |
Handle<i::Object> object_; |
}; |
// TODO(neis): Also cache value if numerical. |
@@ -451,13 +458,14 @@ class ConstantType : public TypeBase { |
// ----------------------------------------------------------------------------- |
// Range types. |
-class RangeType : public TypeBase { |
+class AstRangeType : public AstTypeBase { |
public: |
struct Limits { |
double min; |
double max; |
Limits(double min, double max) : min(min), max(max) {} |
- explicit Limits(RangeType* range) : min(range->Min()), max(range->Max()) {} |
+ explicit Limits(AstRangeType* range) |
+ : min(range->Min()), max(range->Max()) {} |
bool IsEmpty(); |
static Limits Empty() { return Limits(1, 0); } |
static Limits Intersect(Limits lhs, Limits rhs); |
@@ -468,12 +476,12 @@ class RangeType : public TypeBase { |
double Max() { return limits_.max; } |
private: |
- friend class Type; |
- friend class BitsetType; |
- friend class UnionType; |
+ friend class AstType; |
+ friend class AstBitsetType; |
+ friend class AstUnionType; |
- static Type* New(double min, double max, BitsetType::bitset representation, |
- Zone* zone) { |
+ static AstType* New(double min, double max, |
+ AstBitsetType::bitset representation, Zone* zone) { |
return New(Limits(min, max), representation, zone); |
} |
@@ -481,95 +489,100 @@ class RangeType : public TypeBase { |
return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities. |
} |
- static Type* New(Limits lim, BitsetType::bitset representation, Zone* zone) { |
+ static AstType* New(Limits lim, AstBitsetType::bitset representation, |
+ Zone* zone) { |
DCHECK(IsInteger(lim.min) && IsInteger(lim.max)); |
DCHECK(lim.min <= lim.max); |
- DCHECK(REPRESENTATION(representation) == representation); |
- BitsetType::bitset bits = |
- SEMANTIC(BitsetType::Lub(lim.min, lim.max)) | representation; |
+ DCHECK(AST_REPRESENTATION(representation) == representation); |
+ AstBitsetType::bitset bits = |
+ AST_SEMANTIC(AstBitsetType::Lub(lim.min, lim.max)) | representation; |
- return AsType(new (zone->New(sizeof(RangeType))) RangeType(bits, lim)); |
+ return AsType(new (zone->New(sizeof(AstRangeType))) |
+ AstRangeType(bits, lim)); |
} |
- static RangeType* cast(Type* type) { |
+ static AstRangeType* cast(AstType* type) { |
DCHECK(IsKind(type, kRange)); |
- return static_cast<RangeType*>(FromType(type)); |
+ return static_cast<AstRangeType*>(FromType(type)); |
} |
- RangeType(BitsetType::bitset bitset, Limits limits) |
- : TypeBase(kRange), bitset_(bitset), limits_(limits) {} |
+ AstRangeType(AstBitsetType::bitset bitset, Limits limits) |
+ : AstTypeBase(kRange), bitset_(bitset), limits_(limits) {} |
- BitsetType::bitset Lub() { return bitset_; } |
+ AstBitsetType::bitset Lub() { return bitset_; } |
- BitsetType::bitset bitset_; |
+ AstBitsetType::bitset bitset_; |
Limits limits_; |
}; |
// ----------------------------------------------------------------------------- |
// Context types. |
-class ContextType : public TypeBase { |
+class AstContextType : public AstTypeBase { |
public: |
- Type* Outer() { return outer_; } |
+ AstType* Outer() { return outer_; } |
private: |
- friend class Type; |
+ friend class AstType; |
- static Type* New(Type* outer, Zone* zone) { |
- return AsType(new (zone->New(sizeof(ContextType))) ContextType(outer)); |
+ static AstType* New(AstType* outer, Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstContextType))) |
+ AstContextType(outer)); // NOLINT |
} |
- static ContextType* cast(Type* type) { |
+ static AstContextType* cast(AstType* type) { |
DCHECK(IsKind(type, kContext)); |
- return static_cast<ContextType*>(FromType(type)); |
+ return static_cast<AstContextType*>(FromType(type)); |
} |
- explicit ContextType(Type* outer) : TypeBase(kContext), outer_(outer) {} |
+ explicit AstContextType(AstType* outer) |
+ : AstTypeBase(kContext), outer_(outer) {} |
- Type* outer_; |
+ AstType* outer_; |
}; |
// ----------------------------------------------------------------------------- |
// Array types. |
-class ArrayType : public TypeBase { |
+class AstArrayType : public AstTypeBase { |
public: |
- Type* Element() { return element_; } |
+ AstType* Element() { return element_; } |
private: |
- friend class Type; |
+ friend class AstType; |
- explicit ArrayType(Type* element) : TypeBase(kArray), element_(element) {} |
+ explicit AstArrayType(AstType* element) |
+ : AstTypeBase(kArray), element_(element) {} |
- static Type* New(Type* element, Zone* zone) { |
- return AsType(new (zone->New(sizeof(ArrayType))) ArrayType(element)); |
+ static AstType* New(AstType* element, Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstArrayType))) AstArrayType(element)); |
} |
- static ArrayType* cast(Type* type) { |
+ static AstArrayType* cast(AstType* type) { |
DCHECK(IsKind(type, kArray)); |
- return static_cast<ArrayType*>(FromType(type)); |
+ return static_cast<AstArrayType*>(FromType(type)); |
} |
- Type* element_; |
+ AstType* element_; |
}; |
// ----------------------------------------------------------------------------- |
// Superclass for types with variable number of type fields. |
-class StructuralType : public TypeBase { |
+class AstStructuralType : public AstTypeBase { |
public: |
int LengthForTesting() { return Length(); } |
protected: |
- friend class Type; |
+ friend class AstType; |
int Length() { return length_; } |
- Type* Get(int i) { |
+ AstType* Get(int i) { |
DCHECK(0 <= i && i < this->Length()); |
return elements_[i]; |
} |
- void Set(int i, Type* type) { |
+ void Set(int i, AstType* type) { |
DCHECK(0 <= i && i < this->Length()); |
elements_[i] = type; |
} |
@@ -579,70 +592,74 @@ class StructuralType : public TypeBase { |
length_ = length; |
} |
- StructuralType(Kind kind, int length, i::Zone* zone) |
- : TypeBase(kind), length_(length) { |
- elements_ = reinterpret_cast<Type**>(zone->New(sizeof(Type*) * length)); |
+ AstStructuralType(Kind kind, int length, i::Zone* zone) |
+ : AstTypeBase(kind), length_(length) { |
+ elements_ = |
+ reinterpret_cast<AstType**>(zone->New(sizeof(AstType*) * length)); |
} |
private: |
int length_; |
- Type** elements_; |
+ AstType** elements_; |
}; |
// ----------------------------------------------------------------------------- |
// Function types. |
-class FunctionType : public StructuralType { |
+class AstFunctionType : public AstStructuralType { |
public: |
int Arity() { return this->Length() - 2; } |
- Type* Result() { return this->Get(0); } |
- Type* Receiver() { return this->Get(1); } |
- Type* Parameter(int i) { return this->Get(2 + i); } |
+ AstType* Result() { return this->Get(0); } |
+ AstType* Receiver() { return this->Get(1); } |
+ AstType* Parameter(int i) { return this->Get(2 + i); } |
- void InitParameter(int i, Type* type) { this->Set(2 + i, type); } |
+ void InitParameter(int i, AstType* type) { this->Set(2 + i, type); } |
private: |
- friend class Type; |
+ friend class AstType; |
- FunctionType(Type* result, Type* receiver, int arity, Zone* zone) |
- : StructuralType(kFunction, 2 + arity, zone) { |
+ AstFunctionType(AstType* result, AstType* receiver, int arity, Zone* zone) |
+ : AstStructuralType(kFunction, 2 + arity, zone) { |
Set(0, result); |
Set(1, receiver); |
} |
- static Type* New(Type* result, Type* receiver, int arity, Zone* zone) { |
- return AsType(new (zone->New(sizeof(FunctionType))) |
- FunctionType(result, receiver, arity, zone)); |
+ static AstType* New(AstType* result, AstType* receiver, int arity, |
+ Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstFunctionType))) |
+ AstFunctionType(result, receiver, arity, zone)); |
} |
- static FunctionType* cast(Type* type) { |
+ static AstFunctionType* cast(AstType* type) { |
DCHECK(IsKind(type, kFunction)); |
- return static_cast<FunctionType*>(FromType(type)); |
+ return static_cast<AstFunctionType*>(FromType(type)); |
} |
}; |
// ----------------------------------------------------------------------------- |
// Tuple types. |
-class TupleType : public StructuralType { |
+class AstTupleType : public AstStructuralType { |
public: |
int Arity() { return this->Length(); } |
- Type* Element(int i) { return this->Get(i); } |
+ AstType* Element(int i) { return this->Get(i); } |
- void InitElement(int i, Type* type) { this->Set(i, type); } |
+ void InitElement(int i, AstType* type) { this->Set(i, type); } |
private: |
- friend class Type; |
+ friend class AstType; |
- TupleType(int length, Zone* zone) : StructuralType(kTuple, length, zone) {} |
+ AstTupleType(int length, Zone* zone) |
+ : AstStructuralType(kTuple, length, zone) {} |
- static Type* New(int length, Zone* zone) { |
- return AsType(new (zone->New(sizeof(TupleType))) TupleType(length, zone)); |
+ static AstType* New(int length, Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstTupleType))) |
+ AstTupleType(length, zone)); |
} |
- static TupleType* cast(Type* type) { |
+ static AstTupleType* cast(AstType* type) { |
DCHECK(IsKind(type, kTuple)); |
- return static_cast<TupleType*>(FromType(type)); |
+ return static_cast<AstTupleType*>(FromType(type)); |
} |
}; |
@@ -653,93 +670,100 @@ class TupleType : public StructuralType { |
// - at most one field is a bitset, and it must go into index 0 |
// - no field is a union |
// - no field is a subtype of any other field |
-class UnionType : public StructuralType { |
+class AstUnionType : public AstStructuralType { |
private: |
- friend Type; |
- friend BitsetType; |
+ friend AstType; |
+ friend AstBitsetType; |
- UnionType(int length, Zone* zone) : StructuralType(kUnion, length, zone) {} |
+ AstUnionType(int length, Zone* zone) |
+ : AstStructuralType(kUnion, length, zone) {} |
- static Type* New(int length, Zone* zone) { |
- return AsType(new (zone->New(sizeof(UnionType))) UnionType(length, zone)); |
+ static AstType* New(int length, Zone* zone) { |
+ return AsType(new (zone->New(sizeof(AstUnionType))) |
+ AstUnionType(length, zone)); |
} |
- static UnionType* cast(Type* type) { |
+ static AstUnionType* cast(AstType* type) { |
DCHECK(IsKind(type, kUnion)); |
- return static_cast<UnionType*>(FromType(type)); |
+ return static_cast<AstUnionType*>(FromType(type)); |
} |
bool Wellformed(); |
}; |
-class Type { |
+class AstType { |
public: |
- typedef BitsetType::bitset bitset; // Internal |
+ typedef AstBitsetType::bitset bitset; // Internal |
// Constructors. |
#define DEFINE_TYPE_CONSTRUCTOR(type, value) \ |
- static Type* type() { return BitsetType::New(BitsetType::k##type); } |
- PROPER_BITSET_TYPE_LIST(DEFINE_TYPE_CONSTRUCTOR) |
+ static AstType* type() { return AstBitsetType::New(AstBitsetType::k##type); } |
+ AST_PROPER_BITSET_TYPE_LIST(DEFINE_TYPE_CONSTRUCTOR) |
#undef DEFINE_TYPE_CONSTRUCTOR |
- static Type* SignedSmall() { |
- return BitsetType::New(BitsetType::SignedSmall()); |
+ static AstType* SignedSmall() { |
+ return AstBitsetType::New(AstBitsetType::SignedSmall()); |
} |
- static Type* UnsignedSmall() { |
- return BitsetType::New(BitsetType::UnsignedSmall()); |
+ static AstType* UnsignedSmall() { |
+ return AstBitsetType::New(AstBitsetType::UnsignedSmall()); |
} |
- static Type* Class(i::Handle<i::Map> map, Zone* zone) { |
- return ClassType::New(map, zone); |
+ static AstType* Class(i::Handle<i::Map> map, Zone* zone) { |
+ return AstClassType::New(map, zone); |
} |
- static Type* Constant(i::Handle<i::Object> value, Zone* zone) { |
- return ConstantType::New(value, zone); |
+ static AstType* Constant(i::Handle<i::Object> value, Zone* zone) { |
+ return AstConstantType::New(value, zone); |
} |
- static Type* Range(double min, double max, Zone* zone) { |
- return RangeType::New(min, max, REPRESENTATION(BitsetType::kTagged | |
- BitsetType::kUntaggedNumber), |
- zone); |
+ static AstType* Range(double min, double max, Zone* zone) { |
+ return AstRangeType::New(min, max, |
+ AST_REPRESENTATION(AstBitsetType::kTagged | |
+ AstBitsetType::kUntaggedNumber), |
+ zone); |
} |
- static Type* Context(Type* outer, Zone* zone) { |
- return ContextType::New(outer, zone); |
+ static AstType* Context(AstType* outer, Zone* zone) { |
+ return AstContextType::New(outer, zone); |
} |
- static Type* Array(Type* element, Zone* zone) { |
- return ArrayType::New(element, zone); |
+ static AstType* Array(AstType* element, Zone* zone) { |
+ return AstArrayType::New(element, zone); |
} |
- static Type* Function(Type* result, Type* receiver, int arity, Zone* zone) { |
- return FunctionType::New(result, receiver, arity, zone); |
+ static AstType* Function(AstType* result, AstType* receiver, int arity, |
+ Zone* zone) { |
+ return AstFunctionType::New(result, receiver, arity, zone); |
} |
- static Type* Function(Type* result, Zone* zone) { |
+ static AstType* Function(AstType* result, Zone* zone) { |
return Function(result, Any(), 0, zone); |
} |
- static Type* Function(Type* result, Type* param0, Zone* zone) { |
- Type* function = Function(result, Any(), 1, zone); |
+ static AstType* Function(AstType* result, AstType* param0, Zone* zone) { |
+ AstType* function = Function(result, Any(), 1, zone); |
function->AsFunction()->InitParameter(0, param0); |
return function; |
} |
- static Type* Function(Type* result, Type* param0, Type* param1, Zone* zone) { |
- Type* function = Function(result, Any(), 2, zone); |
+ static AstType* Function(AstType* result, AstType* param0, AstType* param1, |
+ Zone* zone) { |
+ AstType* function = Function(result, Any(), 2, zone); |
function->AsFunction()->InitParameter(0, param0); |
function->AsFunction()->InitParameter(1, param1); |
return function; |
} |
- static Type* Function(Type* result, Type* param0, Type* param1, Type* param2, |
- Zone* zone) { |
- Type* function = Function(result, Any(), 3, zone); |
+ static AstType* Function(AstType* result, AstType* param0, AstType* param1, |
+ AstType* param2, Zone* zone) { |
+ AstType* function = Function(result, Any(), 3, zone); |
function->AsFunction()->InitParameter(0, param0); |
function->AsFunction()->InitParameter(1, param1); |
function->AsFunction()->InitParameter(2, param2); |
return function; |
} |
- static Type* Function(Type* result, int arity, Type** params, Zone* zone) { |
- Type* function = Function(result, Any(), arity, zone); |
+ static AstType* Function(AstType* result, int arity, AstType** params, |
+ Zone* zone) { |
+ AstType* function = Function(result, Any(), arity, zone); |
for (int i = 0; i < arity; ++i) { |
function->AsFunction()->InitParameter(i, params[i]); |
} |
return function; |
} |
- static Type* Tuple(Type* first, Type* second, Type* third, Zone* zone) { |
- Type* tuple = TupleType::New(3, zone); |
+ static AstType* Tuple(AstType* first, AstType* second, AstType* third, |
+ Zone* zone) { |
+ AstType* tuple = AstTupleType::New(3, zone); |
tuple->AsTuple()->InitElement(0, first); |
tuple->AsTuple()->InitElement(1, second); |
tuple->AsTuple()->InitElement(2, third); |
@@ -747,38 +771,41 @@ class Type { |
} |
#define CONSTRUCT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \ |
- static Type* Name(Isolate* isolate, Zone* zone); |
+ static AstType* Name(Isolate* isolate, Zone* zone); |
SIMD128_TYPES(CONSTRUCT_SIMD_TYPE) |
#undef CONSTRUCT_SIMD_TYPE |
- static Type* Union(Type* type1, Type* type2, Zone* zone); |
- static Type* Intersect(Type* type1, Type* type2, Zone* zone); |
+ static AstType* Union(AstType* type1, AstType* type2, Zone* zone); |
+ static AstType* Intersect(AstType* type1, AstType* type2, Zone* zone); |
- static Type* Of(double value, Zone* zone) { |
- return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(value))); |
+ static AstType* Of(double value, Zone* zone) { |
+ return AstBitsetType::New( |
+ AstBitsetType::ExpandInternals(AstBitsetType::Lub(value))); |
} |
- static Type* Of(i::Object* value, Zone* zone) { |
- return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(value))); |
+ static AstType* Of(i::Object* value, Zone* zone) { |
+ return AstBitsetType::New( |
+ AstBitsetType::ExpandInternals(AstBitsetType::Lub(value))); |
} |
- static Type* Of(i::Handle<i::Object> value, Zone* zone) { |
+ static AstType* Of(i::Handle<i::Object> value, Zone* zone) { |
return Of(*value, zone); |
} |
- static Type* For(i::Map* map) { |
- return BitsetType::New(BitsetType::ExpandInternals(BitsetType::Lub(map))); |
+ static AstType* For(i::Map* map) { |
+ return AstBitsetType::New( |
+ AstBitsetType::ExpandInternals(AstBitsetType::Lub(map))); |
} |
- static Type* For(i::Handle<i::Map> map) { return For(*map); } |
+ static AstType* For(i::Handle<i::Map> map) { return For(*map); } |
// Extraction of components. |
- static Type* Representation(Type* t, Zone* zone); |
- static Type* Semantic(Type* t, Zone* zone); |
+ static AstType* Representation(AstType* t, Zone* zone); |
+ static AstType* Semantic(AstType* t, Zone* zone); |
// Predicates. |
- bool IsInhabited() { return BitsetType::IsInhabited(this->BitsetLub()); } |
+ bool IsInhabited() { return AstBitsetType::IsInhabited(this->BitsetLub()); } |
- bool Is(Type* that) { return this == that || this->SlowIs(that); } |
- bool Maybe(Type* that); |
- bool Equals(Type* that) { return this->Is(that) && that->Is(this); } |
+ bool Is(AstType* that) { return this == that || this->SlowIs(that); } |
+ bool Maybe(AstType* that); |
+ bool Equals(AstType* that) { return this->Is(that) && that->Is(this); } |
// Equivalent to Constant(val)->Is(this), but avoiding allocation. |
bool Contains(i::Object* val); |
@@ -786,32 +813,32 @@ class Type { |
// State-dependent versions of the above that consider subtyping between |
// a constant and its map class. |
- static Type* NowOf(i::Object* value, Zone* zone); |
- static Type* NowOf(i::Handle<i::Object> value, Zone* zone) { |
+ static AstType* NowOf(i::Object* value, Zone* zone); |
+ static AstType* NowOf(i::Handle<i::Object> value, Zone* zone) { |
return NowOf(*value, zone); |
} |
- bool NowIs(Type* that); |
+ bool NowIs(AstType* that); |
bool NowContains(i::Object* val); |
bool NowContains(i::Handle<i::Object> val) { return this->NowContains(*val); } |
bool NowStable(); |
// Inspection. |
- bool IsRange() { return IsKind(TypeBase::kRange); } |
- bool IsClass() { return IsKind(TypeBase::kClass); } |
- bool IsConstant() { return IsKind(TypeBase::kConstant); } |
- bool IsContext() { return IsKind(TypeBase::kContext); } |
- bool IsArray() { return IsKind(TypeBase::kArray); } |
- bool IsFunction() { return IsKind(TypeBase::kFunction); } |
- bool IsTuple() { return IsKind(TypeBase::kTuple); } |
- |
- ClassType* AsClass() { return ClassType::cast(this); } |
- ConstantType* AsConstant() { return ConstantType::cast(this); } |
- RangeType* AsRange() { return RangeType::cast(this); } |
- ContextType* AsContext() { return ContextType::cast(this); } |
- ArrayType* AsArray() { return ArrayType::cast(this); } |
- FunctionType* AsFunction() { return FunctionType::cast(this); } |
- TupleType* AsTuple() { return TupleType::cast(this); } |
+ bool IsRange() { return IsKind(AstTypeBase::kRange); } |
+ bool IsClass() { return IsKind(AstTypeBase::kClass); } |
+ bool IsConstant() { return IsKind(AstTypeBase::kConstant); } |
+ bool IsContext() { return IsKind(AstTypeBase::kContext); } |
+ bool IsArray() { return IsKind(AstTypeBase::kArray); } |
+ bool IsFunction() { return IsKind(AstTypeBase::kFunction); } |
+ bool IsTuple() { return IsKind(AstTypeBase::kTuple); } |
+ |
+ AstClassType* AsClass() { return AstClassType::cast(this); } |
+ AstConstantType* AsConstant() { return AstConstantType::cast(this); } |
+ AstRangeType* AsRange() { return AstRangeType::cast(this); } |
+ AstContextType* AsContext() { return AstContextType::cast(this); } |
+ AstArrayType* AsArray() { return AstArrayType::cast(this); } |
+ AstFunctionType* AsFunction() { return AstFunctionType::cast(this); } |
+ AstTupleType* AsTuple() { return AstTupleType::cast(this); } |
// Minimum and maximum of a numeric type. |
// These functions do not distinguish between -0 and +0. If the type equals |
@@ -822,7 +849,7 @@ class Type { |
// Extracts a range from the type: if the type is a range or a union |
// containing a range, that range is returned; otherwise, NULL is returned. |
- Type* GetRange(); |
+ AstType* GetRange(); |
static bool IsInteger(i::Object* x); |
static bool IsInteger(double x) { |
@@ -840,15 +867,15 @@ class Type { |
void Advance(); |
private: |
- friend class Type; |
+ friend class AstType; |
Iterator() : index_(-1) {} |
- explicit Iterator(Type* type) : type_(type), index_(-1) { Advance(); } |
+ explicit Iterator(AstType* type) : type_(type), index_(-1) { Advance(); } |
- inline bool matches(Type* type); |
- inline Type* get_type(); |
+ inline bool matches(AstType* type); |
+ inline AstType* get_type(); |
- Type* type_; |
+ AstType* type_; |
int index_; |
}; |
@@ -875,108 +902,118 @@ class Type { |
bool IsBitsetForTesting() { return IsBitset(); } |
bool IsUnionForTesting() { return IsUnion(); } |
bitset AsBitsetForTesting() { return AsBitset(); } |
- UnionType* AsUnionForTesting() { return AsUnion(); } |
+ AstUnionType* AsUnionForTesting() { return AsUnion(); } |
private: |
// Friends. |
template <class> |
friend class Iterator; |
- friend BitsetType; |
- friend UnionType; |
+ friend AstBitsetType; |
+ friend AstUnionType; |
// Internal inspection. |
- bool IsKind(TypeBase::Kind kind) { return TypeBase::IsKind(this, kind); } |
+ bool IsKind(AstTypeBase::Kind kind) { |
+ return AstTypeBase::IsKind(this, kind); |
+ } |
bool IsNone() { return this == None(); } |
bool IsAny() { return this == Any(); } |
- bool IsBitset() { return BitsetType::IsBitset(this); } |
- bool IsUnion() { return IsKind(TypeBase::kUnion); } |
+ bool IsBitset() { return AstBitsetType::IsBitset(this); } |
+ bool IsUnion() { return IsKind(AstTypeBase::kUnion); } |
bitset AsBitset() { |
DCHECK(this->IsBitset()); |
- return reinterpret_cast<BitsetType*>(this)->Bitset(); |
+ return reinterpret_cast<AstBitsetType*>(this)->Bitset(); |
} |
- UnionType* AsUnion() { return UnionType::cast(this); } |
+ AstUnionType* AsUnion() { return AstUnionType::cast(this); } |
bitset Representation(); |
// Auxiliary functions. |
- bool SemanticMaybe(Type* that); |
+ bool SemanticMaybe(AstType* that); |
- bitset BitsetGlb() { return BitsetType::Glb(this); } |
- bitset BitsetLub() { return BitsetType::Lub(this); } |
+ bitset BitsetGlb() { return AstBitsetType::Glb(this); } |
+ bitset BitsetLub() { return AstBitsetType::Lub(this); } |
- bool SlowIs(Type* that); |
- bool SemanticIs(Type* that); |
+ bool SlowIs(AstType* that); |
+ bool SemanticIs(AstType* that); |
- static bool Overlap(RangeType* lhs, RangeType* rhs); |
- static bool Contains(RangeType* lhs, RangeType* rhs); |
- static bool Contains(RangeType* range, ConstantType* constant); |
- static bool Contains(RangeType* range, i::Object* val); |
+ static bool Overlap(AstRangeType* lhs, AstRangeType* rhs); |
+ static bool Contains(AstRangeType* lhs, AstRangeType* rhs); |
+ static bool Contains(AstRangeType* range, AstConstantType* constant); |
+ static bool Contains(AstRangeType* range, i::Object* val); |
- static int UpdateRange(Type* type, UnionType* result, int size, Zone* zone); |
+ static int UpdateRange(AstType* type, AstUnionType* result, int size, |
+ Zone* zone); |
- static RangeType::Limits IntersectRangeAndBitset(Type* range, Type* bits, |
- Zone* zone); |
- static RangeType::Limits ToLimits(bitset bits, Zone* zone); |
+ static AstRangeType::Limits IntersectRangeAndBitset(AstType* range, |
+ AstType* bits, |
+ Zone* zone); |
+ static AstRangeType::Limits ToLimits(bitset bits, Zone* zone); |
- bool SimplyEquals(Type* that); |
+ bool SimplyEquals(AstType* that); |
- static int AddToUnion(Type* type, UnionType* result, int size, Zone* zone); |
- static int IntersectAux(Type* type, Type* other, UnionType* result, int size, |
- RangeType::Limits* limits, Zone* zone); |
- static Type* NormalizeUnion(Type* unioned, int size, Zone* zone); |
- static Type* NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone); |
+ static int AddToUnion(AstType* type, AstUnionType* result, int size, |
+ Zone* zone); |
+ static int IntersectAux(AstType* type, AstType* other, AstUnionType* result, |
+ int size, AstRangeType::Limits* limits, Zone* zone); |
+ static AstType* NormalizeUnion(AstType* unioned, int size, Zone* zone); |
+ static AstType* NormalizeRangeAndBitset(AstType* range, bitset* bits, |
+ Zone* zone); |
}; |
// ----------------------------------------------------------------------------- |
// Type bounds. A simple struct to represent a pair of lower/upper types. |
-struct Bounds { |
- Type* lower; |
- Type* upper; |
+struct AstBounds { |
+ AstType* lower; |
+ AstType* upper; |
- Bounds() |
+ AstBounds() |
: // Make sure accessing uninitialized bounds crashes big-time. |
lower(nullptr), |
upper(nullptr) {} |
- explicit Bounds(Type* t) : lower(t), upper(t) {} |
- Bounds(Type* l, Type* u) : lower(l), upper(u) { DCHECK(lower->Is(upper)); } |
+ explicit AstBounds(AstType* t) : lower(t), upper(t) {} |
+ AstBounds(AstType* l, AstType* u) : lower(l), upper(u) { |
+ DCHECK(lower->Is(upper)); |
+ } |
// Unrestricted bounds. |
- static Bounds Unbounded() { return Bounds(Type::None(), Type::Any()); } |
+ static AstBounds Unbounded() { |
+ return AstBounds(AstType::None(), AstType::Any()); |
+ } |
// Meet: both b1 and b2 are known to hold. |
- static Bounds Both(Bounds b1, Bounds b2, Zone* zone) { |
- Type* lower = Type::Union(b1.lower, b2.lower, zone); |
- Type* upper = Type::Intersect(b1.upper, b2.upper, zone); |
+ static AstBounds Both(AstBounds b1, AstBounds b2, Zone* zone) { |
+ AstType* lower = AstType::Union(b1.lower, b2.lower, zone); |
+ AstType* upper = AstType::Intersect(b1.upper, b2.upper, zone); |
// Lower bounds are considered approximate, correct as necessary. |
if (!lower->Is(upper)) lower = upper; |
- return Bounds(lower, upper); |
+ return AstBounds(lower, upper); |
} |
// Join: either b1 or b2 is known to hold. |
- static Bounds Either(Bounds b1, Bounds b2, Zone* zone) { |
- Type* lower = Type::Intersect(b1.lower, b2.lower, zone); |
- Type* upper = Type::Union(b1.upper, b2.upper, zone); |
- return Bounds(lower, upper); |
+ static AstBounds Either(AstBounds b1, AstBounds b2, Zone* zone) { |
+ AstType* lower = AstType::Intersect(b1.lower, b2.lower, zone); |
+ AstType* upper = AstType::Union(b1.upper, b2.upper, zone); |
+ return AstBounds(lower, upper); |
} |
- static Bounds NarrowLower(Bounds b, Type* t, Zone* zone) { |
- Type* lower = Type::Union(b.lower, t, zone); |
+ static AstBounds NarrowLower(AstBounds b, AstType* t, Zone* zone) { |
+ AstType* lower = AstType::Union(b.lower, t, zone); |
// Lower bounds are considered approximate, correct as necessary. |
if (!lower->Is(b.upper)) lower = b.upper; |
- return Bounds(lower, b.upper); |
+ return AstBounds(lower, b.upper); |
} |
- static Bounds NarrowUpper(Bounds b, Type* t, Zone* zone) { |
- Type* lower = b.lower; |
- Type* upper = Type::Intersect(b.upper, t, zone); |
+ static AstBounds NarrowUpper(AstBounds b, AstType* t, Zone* zone) { |
+ AstType* lower = b.lower; |
+ AstType* upper = AstType::Intersect(b.upper, t, zone); |
// Lower bounds are considered approximate, correct as necessary. |
if (!lower->Is(upper)) lower = upper; |
- return Bounds(lower, upper); |
+ return AstBounds(lower, upper); |
} |
- bool Narrows(Bounds that) { |
+ bool Narrows(AstBounds that) { |
return that.lower->Is(this->lower) && this->upper->Is(that.upper); |
} |
}; |
@@ -984,4 +1021,4 @@ struct Bounds { |
} // namespace internal |
} // namespace v8 |
-#endif // V8_TYPES_H_ |
+#endif // V8_AST_AST_TYPES_H_ |