Index: src/types.h |
diff --git a/src/types.h b/src/types.h |
index 42a50b922bd0f0f56441d853687b4fd390466041..7f0058557c7f9e58be482bb8a110292532b62ab2 100644 |
--- a/src/types.h |
+++ b/src/types.h |
@@ -165,28 +165,29 @@ namespace internal { |
// struct Config { |
// typedef Base; |
-// typedef Unioned; |
+// typedef Struct; |
// typedef Region; |
// template<class> struct Handle { typedef type; } // No template typedefs... |
// static Handle<Type>::type handle(Type* type); // !is_bitset(type) |
// static bool is_bitset(Type*); |
// static bool is_class(Type*); |
// static bool is_constant(Type*); |
-// static bool is_union(Type*); |
+// static bool is_struct(Type*); |
// static int as_bitset(Type*); |
// static i::Handle<i::Map> as_class(Type*); |
// static i::Handle<i::Object> as_constant(Type*); |
-// static Handle<Unioned>::type as_union(Type*); |
+// static Handle<Struct>::type as_struct(Type*); |
// static Type* from_bitset(int bitset); |
// static Handle<Type>::type from_bitset(int bitset, Region*); |
// static Handle<Type>::type from_class(i::Handle<Map>, int lub, Region*); |
// static Handle<Type>::type from_constant(i::Handle<Object>, int, Region*); |
-// static Handle<Type>::type from_union(Handle<Unioned>::type); |
-// static Handle<Unioned>::type union_create(int size, Region*); |
-// static void union_shrink(Handle<Unioned>::type, int size); |
-// static Handle<Type>::type union_get(Handle<Unioned>::type, int); |
-// static void union_set(Handle<Unioned>::type, int, Handle<Type>::type); |
-// static int union_length(Handle<Unioned>::type); |
+// static Handle<Type>::type from_struct(Handle<Struct>::type); |
+// static Handle<Struct>::type struct_create(int tag, int length, Region*); |
+// static void struct_shrink(Handle<Struct>::type, int length); |
+// static int struct_tag(Handle<Struct>::type); |
+// static Handle<Type>::type struct_get(Handle<Struct>::type, int); |
+// static void struct_set(Handle<Struct>::type, int, Handle<Type>::type); |
+// static int struct_length(Handle<Struct>::type); |
// static int lub_bitset(Type*); |
// } |
template<class Config> |
@@ -302,13 +303,22 @@ class TypeImpl : public Config::Base { |
private: |
template<class> friend class Iterator; |
template<class> friend class TypeImpl; |
+ friend struct ZoneTypeConfig; |
+ friend struct HeapTypeConfig; |
- // A union is a fixed array containing types. Invariants: |
+ enum Tag { |
+ kClassTag, |
+ kConstantTag, |
+ kUnionTag |
+ }; |
+ |
+ // A structured type contains a tag an a variable number of type fields. |
+ // A union is a structured type with the following invariants: |
// - its length is at least 2 |
// - at most one field is a bitset, and it must go into index 0 |
// - no field is a union |
- typedef typename Config::Unioned Unioned; |
- typedef typename Config::template Handle<Unioned>::type UnionedHandle; |
+ typedef typename Config::Struct Struct; |
+ typedef typename Config::template Handle<Struct>::type StructHandle; |
enum { |
#define DECLARE_TYPE(type, value) k##type = (value), |
@@ -320,15 +330,24 @@ class TypeImpl : public Config::Base { |
bool IsNone() { return this == None(); } |
bool IsAny() { return this == Any(); } |
bool IsBitset() { return Config::is_bitset(this); } |
- bool IsUnion() { return Config::is_union(this); } |
+ bool IsStruct(Tag tag) { |
+ return Config::is_struct(this) |
+ && Config::struct_tag(Config::as_struct(this)) == tag; |
+ } |
+ bool IsUnion() { return IsStruct(kUnionTag); } |
+ |
int AsBitset() { return Config::as_bitset(this); } |
- UnionedHandle AsUnion() { return Config::as_union(this); } |
+ StructHandle AsStruct(Tag tag) { |
+ ASSERT(IsStruct(tag)); |
+ return Config::as_struct(this); |
+ } |
+ StructHandle AsUnion() { return AsStruct(kUnionTag); } |
- static int UnionLength(UnionedHandle unioned) { |
- return Config::union_length(unioned); |
+ static int StructLength(StructHandle structured) { |
+ return Config::struct_length(structured); |
} |
- static TypeHandle UnionGet(UnionedHandle unioned, int i) { |
- return Config::union_get(unioned, i); |
+ static TypeHandle StructGet(StructHandle structured, int i) { |
+ return Config::struct_get(structured, i); |
} |
bool SlowIs(TypeImpl* that); |
@@ -343,11 +362,11 @@ class TypeImpl : public Config::Base { |
static int LubBitset(i::Object* value); |
static int LubBitset(i::Map* map); |
- bool InUnion(UnionedHandle unioned, int current_size); |
+ bool InUnion(StructHandle unioned, int current_size); |
static int ExtendUnion( |
- UnionedHandle unioned, TypeHandle t, int current_size); |
+ StructHandle unioned, TypeHandle t, int current_size); |
static int ExtendIntersection( |
- UnionedHandle unioned, TypeHandle t, TypeHandle other, int current_size); |
+ StructHandle unioned, TypeHandle t, TypeHandle other, int current_size); |
#ifdef OBJECT_PRINT |
static const char* bitset_name(int bitset); |
@@ -357,59 +376,35 @@ class TypeImpl : public Config::Base { |
// Zone-allocated types are either (odd) integers to represent bitsets, or |
-// (even) pointers to zone lists for everything else. The first slot of every |
-// list is an explicit tag value to distinguish representation. |
+// (even) pointers to structures for everything else. |
struct ZoneTypeConfig { |
- private: |
- typedef i::ZoneList<void*> Tagged; |
- |
- enum Tag { |
- kClassTag, |
- kConstantTag, |
- kUnionTag |
- }; |
- |
- static inline Tagged* tagged_create(Tag tag, int size, Zone* zone); |
- static inline void tagged_shrink(Tagged* tagged, int size); |
- static inline Tag tagged_tag(Tagged* tagged); |
- template<class T> static inline T tagged_get(Tagged* tagged, int i); |
- template<class T> static inline void tagged_set(Tagged* tagged, int i, T val); |
- static inline int tagged_length(Tagged* tagged); |
- |
- public: |
typedef TypeImpl<ZoneTypeConfig> Type; |
class Base {}; |
- typedef i::ZoneList<Type*> Unioned; |
+ struct Struct { int tag; int length; void* args[1]; }; |
typedef i::Zone Region; |
template<class T> struct Handle { typedef T* type; }; |
static inline Type* handle(Type* type); |
- static inline bool is(Type* type, Tag tag); |
static inline bool is_bitset(Type* type); |
- static inline bool is_tagged(Type* type); |
static inline bool is_class(Type* type); |
static inline bool is_constant(Type* type); |
- static inline bool is_union(Type* type); |
- static inline bool tagged_is_union(Tagged* tagged); |
+ static inline bool is_struct(Type* type); |
static inline int as_bitset(Type* type); |
- static inline Tagged* as_tagged(Type* type); |
+ static inline Struct* as_struct(Type* type); |
static inline i::Handle<i::Map> as_class(Type* type); |
static inline i::Handle<i::Object> as_constant(Type* type); |
- static inline Unioned* as_union(Type* type); |
- static inline Unioned* tagged_as_union(Tagged* tagged); |
static inline Type* from_bitset(int bitset); |
static inline Type* from_bitset(int bitset, Zone* zone); |
- static inline Type* from_tagged(Tagged* tagged); |
+ static inline Type* from_struct(Struct* structured); |
static inline Type* from_class(i::Handle<i::Map> map, int lub, Zone* zone); |
static inline Type* from_constant( |
i::Handle<i::Object> value, int lub, Zone* zone); |
- static inline Type* from_union(Unioned* unioned); |
- static inline Tagged* tagged_from_union(Unioned* unioned); |
- static inline Unioned* union_create(int size, Zone* zone); |
- static inline void union_shrink(Unioned* unioned, int size); |
- static inline Type* union_get(Unioned* unioned, int i); |
- static inline void union_set(Unioned* unioned, int i, Type* type); |
- static inline int union_length(Unioned* unioned); |
+ static inline Struct* struct_create(int tag, int length, Zone* zone); |
+ static inline void struct_shrink(Struct* structured, int length); |
+ static inline int struct_tag(Struct* structured); |
+ static inline Type* struct_get(Struct* structured, int i); |
+ static inline void struct_set(Struct* structured, int i, Type* type); |
+ static inline int struct_length(Struct* structured); |
static inline int lub_bitset(Type* type); |
}; |
@@ -421,7 +416,7 @@ typedef TypeImpl<ZoneTypeConfig> Type; |
struct HeapTypeConfig { |
typedef TypeImpl<HeapTypeConfig> Type; |
typedef i::Object Base; |
- typedef i::FixedArray Unioned; |
+ typedef i::FixedArray Struct; |
typedef i::Isolate Region; |
template<class T> struct Handle { typedef i::Handle<T> type; }; |
@@ -429,24 +424,26 @@ struct HeapTypeConfig { |
static inline bool is_bitset(Type* type); |
static inline bool is_class(Type* type); |
static inline bool is_constant(Type* type); |
- static inline bool is_union(Type* type); |
+ static inline bool is_struct(Type* type); |
static inline int as_bitset(Type* type); |
static inline i::Handle<i::Map> as_class(Type* type); |
static inline i::Handle<i::Object> as_constant(Type* type); |
- static inline i::Handle<Unioned> as_union(Type* type); |
+ static inline i::Handle<Struct> as_struct(Type* type); |
static inline Type* from_bitset(int bitset); |
static inline i::Handle<Type> from_bitset(int bitset, Isolate* isolate); |
static inline i::Handle<Type> from_class( |
i::Handle<i::Map> map, int lub, Isolate* isolate); |
static inline i::Handle<Type> from_constant( |
i::Handle<i::Object> value, int lub, Isolate* isolate); |
- static inline i::Handle<Type> from_union(i::Handle<Unioned> unioned); |
- static inline i::Handle<Unioned> union_create(int size, Isolate* isolate); |
- static inline void union_shrink(i::Handle<Unioned> unioned, int size); |
- static inline i::Handle<Type> union_get(i::Handle<Unioned> unioned, int i); |
- static inline void union_set( |
- i::Handle<Unioned> unioned, int i, i::Handle<Type> type); |
- static inline int union_length(i::Handle<Unioned> unioned); |
+ static inline i::Handle<Type> from_struct(i::Handle<Struct> structured); |
+ static inline i::Handle<Struct> struct_create( |
+ int tag, int length, Isolate* isolate); |
+ static inline void struct_shrink(i::Handle<Struct> structured, int length); |
+ static inline int struct_tag(i::Handle<Struct> structured); |
+ static inline i::Handle<Type> struct_get(i::Handle<Struct> structured, int i); |
+ static inline void struct_set( |
+ i::Handle<Struct> structured, int i, i::Handle<Type> type); |
+ static inline int struct_length(i::Handle<Struct> structured); |
static inline int lub_bitset(Type* type); |
}; |