| Index: src/types.h
|
| diff --git a/src/types.h b/src/types.h
|
| index 8e5da9eecb13123abc41a20b68a95298f0fc63d1..7f4d7069604a1dc83951c54d2ec3359ce1e555da 100644
|
| --- a/src/types.h
|
| +++ b/src/types.h
|
| @@ -164,29 +164,28 @@ namespace internal {
|
|
|
| // struct Config {
|
| // typedef Base;
|
| -// typedef Struct;
|
| +// typedef Unioned;
|
| // 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_struct(Type*);
|
| +// static bool is_union(Type*);
|
| // static int as_bitset(Type*);
|
| // static i::Handle<i::Map> as_class(Type*);
|
| // static i::Handle<i::Object> as_constant(Type*);
|
| -// static Handle<Struct>::type as_struct(Type*);
|
| +// static Handle<Unioned>::type as_union(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_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 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 int lub_bitset(Type*);
|
| // }
|
| template<class Config>
|
| @@ -300,22 +299,13 @@ class TypeImpl : public Config::Base {
|
| private:
|
| template<class> friend class Iterator;
|
| template<class> friend class TypeImpl;
|
| - friend struct ZoneTypeConfig;
|
| - friend struct HeapTypeConfig;
|
|
|
| - 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:
|
| + // A union is a fixed array containing types. 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::Struct Struct;
|
| - typedef typename Config::template Handle<Struct>::type StructHandle;
|
| + typedef typename Config::Unioned Unioned;
|
| + typedef typename Config::template Handle<Unioned>::type UnionedHandle;
|
|
|
| enum {
|
| #define DECLARE_TYPE(type, value) k##type = (value),
|
| @@ -327,24 +317,15 @@ class TypeImpl : public Config::Base {
|
| bool IsNone() { return this == None(); }
|
| bool IsAny() { return this == Any(); }
|
| bool IsBitset() { return Config::is_bitset(this); }
|
| - bool IsStruct(Tag tag) {
|
| - return Config::is_struct(this)
|
| - && Config::struct_tag(Config::as_struct(this)) == tag;
|
| - }
|
| - bool IsUnion() { return IsStruct(kUnionTag); }
|
| -
|
| + bool IsUnion() { return Config::is_union(this); }
|
| int AsBitset() { return Config::as_bitset(this); }
|
| - StructHandle AsStruct(Tag tag) {
|
| - ASSERT(IsStruct(tag));
|
| - return Config::as_struct(this);
|
| - }
|
| - StructHandle AsUnion() { return AsStruct(kUnionTag); }
|
| + UnionedHandle AsUnion() { return Config::as_union(this); }
|
|
|
| - static int StructLength(StructHandle structured) {
|
| - return Config::struct_length(structured);
|
| + static int UnionLength(UnionedHandle unioned) {
|
| + return Config::union_length(unioned);
|
| }
|
| - static TypeHandle StructGet(StructHandle structured, int i) {
|
| - return Config::struct_get(structured, i);
|
| + static TypeHandle UnionGet(UnionedHandle unioned, int i) {
|
| + return Config::union_get(unioned, i);
|
| }
|
|
|
| bool SlowIs(TypeImpl* that);
|
| @@ -359,11 +340,11 @@ class TypeImpl : public Config::Base {
|
| static int LubBitset(i::Object* value);
|
| static int LubBitset(i::Map* map);
|
|
|
| - bool InUnion(StructHandle unioned, int current_size);
|
| + bool InUnion(UnionedHandle unioned, int current_size);
|
| static int ExtendUnion(
|
| - StructHandle unioned, TypeHandle t, int current_size);
|
| + UnionedHandle unioned, TypeHandle t, int current_size);
|
| static int ExtendIntersection(
|
| - StructHandle unioned, TypeHandle t, TypeHandle other, int current_size);
|
| + UnionedHandle unioned, TypeHandle t, TypeHandle other, int current_size);
|
|
|
| static const char* bitset_name(int bitset);
|
| static void BitsetTypePrint(FILE* out, int bitset);
|
| @@ -371,35 +352,59 @@ class TypeImpl : public Config::Base {
|
|
|
|
|
| // Zone-allocated types are either (odd) integers to represent bitsets, or
|
| -// (even) pointers to structures for everything else.
|
| +// (even) pointers to zone lists for everything else. The first slot of every
|
| +// list is an explicit tag value to distinguish representation.
|
| 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 {};
|
| - struct Struct { int tag; int length; void* args[1]; };
|
| + typedef i::ZoneList<Type*> Unioned;
|
| 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_struct(Type* type);
|
| + static inline bool is_union(Type* type);
|
| + static inline bool tagged_is_union(Tagged* tagged);
|
| static inline int as_bitset(Type* type);
|
| - static inline Struct* as_struct(Type* type);
|
| + static inline Tagged* as_tagged(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_struct(Struct* structured);
|
| + static inline Type* from_tagged(Tagged* tagged);
|
| 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 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 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 int lub_bitset(Type* type);
|
| };
|
|
|
| @@ -411,7 +416,7 @@ typedef TypeImpl<ZoneTypeConfig> Type;
|
| struct HeapTypeConfig {
|
| typedef TypeImpl<HeapTypeConfig> Type;
|
| typedef i::Object Base;
|
| - typedef i::FixedArray Struct;
|
| + typedef i::FixedArray Unioned;
|
| typedef i::Isolate Region;
|
| template<class T> struct Handle { typedef i::Handle<T> type; };
|
|
|
| @@ -419,26 +424,24 @@ 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_struct(Type* type);
|
| + static inline bool is_union(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<Struct> as_struct(Type* type);
|
| + static inline i::Handle<Unioned> as_union(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_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 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 int lub_bitset(Type* type);
|
| };
|
|
|
|
|