| OLD | NEW | 
|    1 // Copyright 2014 the V8 project authors. All rights reserved. |    1 // Copyright 2014 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 V8_TYPES_H_ |    5 #ifndef V8_TYPES_H_ | 
|    6 #define V8_TYPES_H_ |    6 #define V8_TYPES_H_ | 
|    7  |    7  | 
|    8 #include "handles.h" |    8 #include "handles.h" | 
|    9  |    9  | 
|   10 namespace v8 { |   10 namespace v8 { | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  157   V(Any,                 kNumber | kNonNumber) |  157   V(Any,                 kNumber | kNonNumber) | 
|  158  |  158  | 
|  159 #define BITSET_TYPE_LIST(V) \ |  159 #define BITSET_TYPE_LIST(V) \ | 
|  160   MASK_BITSET_TYPE_LIST(V) \ |  160   MASK_BITSET_TYPE_LIST(V) \ | 
|  161   REPRESENTATION_BITSET_TYPE_LIST(V) \ |  161   REPRESENTATION_BITSET_TYPE_LIST(V) \ | 
|  162   SEMANTIC_BITSET_TYPE_LIST(V) |  162   SEMANTIC_BITSET_TYPE_LIST(V) | 
|  163  |  163  | 
|  164  |  164  | 
|  165 // struct Config { |  165 // struct Config { | 
|  166 //   typedef Base; |  166 //   typedef Base; | 
|  167 //   typedef Struct; |  167 //   typedef Unioned; | 
|  168 //   typedef Region; |  168 //   typedef Region; | 
|  169 //   template<class> struct Handle { typedef type; }  // No template typedefs... |  169 //   template<class> struct Handle { typedef type; }  // No template typedefs... | 
|  170 //   static Handle<Type>::type handle(Type* type);    // !is_bitset(type) |  170 //   static Handle<Type>::type handle(Type* type);    // !is_bitset(type) | 
|  171 //   static bool is_bitset(Type*); |  171 //   static bool is_bitset(Type*); | 
|  172 //   static bool is_class(Type*); |  172 //   static bool is_class(Type*); | 
|  173 //   static bool is_constant(Type*); |  173 //   static bool is_constant(Type*); | 
|  174 //   static bool is_struct(Type*); |  174 //   static bool is_union(Type*); | 
|  175 //   static int as_bitset(Type*); |  175 //   static int as_bitset(Type*); | 
|  176 //   static i::Handle<i::Map> as_class(Type*); |  176 //   static i::Handle<i::Map> as_class(Type*); | 
|  177 //   static i::Handle<i::Object> as_constant(Type*); |  177 //   static i::Handle<i::Object> as_constant(Type*); | 
|  178 //   static Handle<Struct>::type as_struct(Type*); |  178 //   static Handle<Unioned>::type as_union(Type*); | 
|  179 //   static Type* from_bitset(int bitset); |  179 //   static Type* from_bitset(int bitset); | 
|  180 //   static Handle<Type>::type from_bitset(int bitset, Region*); |  180 //   static Handle<Type>::type from_bitset(int bitset, Region*); | 
|  181 //   static Handle<Type>::type from_class(i::Handle<Map>, int lub, Region*); |  181 //   static Handle<Type>::type from_class(i::Handle<Map>, int lub, Region*); | 
|  182 //   static Handle<Type>::type from_constant(i::Handle<Object>, int, Region*); |  182 //   static Handle<Type>::type from_constant(i::Handle<Object>, int, Region*); | 
|  183 //   static Handle<Type>::type from_struct(Handle<Struct>::type); |  183 //   static Handle<Type>::type from_union(Handle<Unioned>::type); | 
|  184 //   static Handle<Struct>::type struct_create(int tag, int length, Region*); |  184 //   static Handle<Unioned>::type union_create(int size, Region*); | 
|  185 //   static void struct_shrink(Handle<Struct>::type, int length); |  185 //   static void union_shrink(Handle<Unioned>::type, int size); | 
|  186 //   static int struct_tag(Handle<Struct>::type); |  186 //   static Handle<Type>::type union_get(Handle<Unioned>::type, int); | 
|  187 //   static Handle<Type>::type struct_get(Handle<Struct>::type, int); |  187 //   static void union_set(Handle<Unioned>::type, int, Handle<Type>::type); | 
|  188 //   static void struct_set(Handle<Struct>::type, int, Handle<Type>::type); |  188 //   static int union_length(Handle<Unioned>::type); | 
|  189 //   static int struct_length(Handle<Struct>::type); |  | 
|  190 //   static int lub_bitset(Type*); |  189 //   static int lub_bitset(Type*); | 
|  191 // } |  190 // } | 
|  192 template<class Config> |  191 template<class Config> | 
|  193 class TypeImpl : public Config::Base { |  192 class TypeImpl : public Config::Base { | 
|  194  public: |  193  public: | 
|  195   typedef typename Config::template Handle<TypeImpl>::type TypeHandle; |  194   typedef typename Config::template Handle<TypeImpl>::type TypeHandle; | 
|  196   typedef typename Config::Region Region; |  195   typedef typename Config::Region Region; | 
|  197  |  196  | 
|  198   #define DEFINE_TYPE_CONSTRUCTOR(type, value)                        \ |  197   #define DEFINE_TYPE_CONSTRUCTOR(type, value)                        \ | 
|  199     static TypeImpl* type() { return Config::from_bitset(k##type); }  \ |  198     static TypeImpl* type() { return Config::from_bitset(k##type); }  \ | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  293   static TypeHandle Convert( |  292   static TypeHandle Convert( | 
|  294       typename OtherTypeImpl::TypeHandle type, Region* region); |  293       typename OtherTypeImpl::TypeHandle type, Region* region); | 
|  295  |  294  | 
|  296   enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM }; |  295   enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM }; | 
|  297   void TypePrint(PrintDimension = BOTH_DIMS); |  296   void TypePrint(PrintDimension = BOTH_DIMS); | 
|  298   void TypePrint(FILE* out, PrintDimension = BOTH_DIMS); |  297   void TypePrint(FILE* out, PrintDimension = BOTH_DIMS); | 
|  299  |  298  | 
|  300  private: |  299  private: | 
|  301   template<class> friend class Iterator; |  300   template<class> friend class Iterator; | 
|  302   template<class> friend class TypeImpl; |  301   template<class> friend class TypeImpl; | 
|  303   friend struct ZoneTypeConfig; |  | 
|  304   friend struct HeapTypeConfig; |  | 
|  305  |  302  | 
|  306   enum Tag { |  303   // A union is a fixed array containing types. Invariants: | 
|  307     kClassTag, |  | 
|  308     kConstantTag, |  | 
|  309     kUnionTag |  | 
|  310   }; |  | 
|  311  |  | 
|  312   // A structured type contains a tag an a variable number of type fields. |  | 
|  313   // A union is a structured type with the following invariants: |  | 
|  314   // - its length is at least 2 |  304   // - its length is at least 2 | 
|  315   // - at most one field is a bitset, and it must go into index 0 |  305   // - at most one field is a bitset, and it must go into index 0 | 
|  316   // - no field is a union |  306   // - no field is a union | 
|  317   typedef typename Config::Struct Struct; |  307   typedef typename Config::Unioned Unioned; | 
|  318   typedef typename Config::template Handle<Struct>::type StructHandle; |  308   typedef typename Config::template Handle<Unioned>::type UnionedHandle; | 
|  319  |  309  | 
|  320   enum { |  310   enum { | 
|  321     #define DECLARE_TYPE(type, value) k##type = (value), |  311     #define DECLARE_TYPE(type, value) k##type = (value), | 
|  322     BITSET_TYPE_LIST(DECLARE_TYPE) |  312     BITSET_TYPE_LIST(DECLARE_TYPE) | 
|  323     #undef DECLARE_TYPE |  313     #undef DECLARE_TYPE | 
|  324     kUnusedEOL = 0 |  314     kUnusedEOL = 0 | 
|  325   }; |  315   }; | 
|  326  |  316  | 
|  327   bool IsNone() { return this == None(); } |  317   bool IsNone() { return this == None(); } | 
|  328   bool IsAny() { return this == Any(); } |  318   bool IsAny() { return this == Any(); } | 
|  329   bool IsBitset() { return Config::is_bitset(this); } |  319   bool IsBitset() { return Config::is_bitset(this); } | 
|  330   bool IsStruct(Tag tag) { |  320   bool IsUnion() { return Config::is_union(this); } | 
|  331     return Config::is_struct(this) |  321   int AsBitset() { return Config::as_bitset(this); } | 
|  332         && Config::struct_tag(Config::as_struct(this)) == tag; |  322   UnionedHandle AsUnion() { return Config::as_union(this); } | 
 |  323  | 
 |  324   static int UnionLength(UnionedHandle unioned) { | 
 |  325     return Config::union_length(unioned); | 
|  333   } |  326   } | 
|  334   bool IsUnion() { return IsStruct(kUnionTag); } |  327   static TypeHandle UnionGet(UnionedHandle unioned, int i) { | 
|  335  |  328     return Config::union_get(unioned, i); | 
|  336   int AsBitset() { return Config::as_bitset(this); } |  | 
|  337   StructHandle AsStruct(Tag tag) { |  | 
|  338     ASSERT(IsStruct(tag)); |  | 
|  339     return Config::as_struct(this); |  | 
|  340   } |  | 
|  341   StructHandle AsUnion() { return AsStruct(kUnionTag); } |  | 
|  342  |  | 
|  343   static int StructLength(StructHandle structured) { |  | 
|  344     return Config::struct_length(structured); |  | 
|  345   } |  | 
|  346   static TypeHandle StructGet(StructHandle structured, int i) { |  | 
|  347     return Config::struct_get(structured, i); |  | 
|  348   } |  329   } | 
|  349  |  330  | 
|  350   bool SlowIs(TypeImpl* that); |  331   bool SlowIs(TypeImpl* that); | 
|  351  |  332  | 
|  352   static bool IsInhabited(int bitset) { |  333   static bool IsInhabited(int bitset) { | 
|  353     return (bitset & kRepresentation) && (bitset & kSemantic); |  334     return (bitset & kRepresentation) && (bitset & kSemantic); | 
|  354   } |  335   } | 
|  355  |  336  | 
|  356   int LubBitset();  // least upper bound that's a bitset |  337   int LubBitset();  // least upper bound that's a bitset | 
|  357   int GlbBitset();  // greatest lower bound that's a bitset |  338   int GlbBitset();  // greatest lower bound that's a bitset | 
|  358  |  339  | 
|  359   static int LubBitset(i::Object* value); |  340   static int LubBitset(i::Object* value); | 
|  360   static int LubBitset(i::Map* map); |  341   static int LubBitset(i::Map* map); | 
|  361  |  342  | 
|  362   bool InUnion(StructHandle unioned, int current_size); |  343   bool InUnion(UnionedHandle unioned, int current_size); | 
|  363   static int ExtendUnion( |  344   static int ExtendUnion( | 
|  364       StructHandle unioned, TypeHandle t, int current_size); |  345       UnionedHandle unioned, TypeHandle t, int current_size); | 
|  365   static int ExtendIntersection( |  346   static int ExtendIntersection( | 
|  366       StructHandle unioned, TypeHandle t, TypeHandle other, int current_size); |  347       UnionedHandle unioned, TypeHandle t, TypeHandle other, int current_size); | 
|  367  |  348  | 
|  368   static const char* bitset_name(int bitset); |  349   static const char* bitset_name(int bitset); | 
|  369   static void BitsetTypePrint(FILE* out, int bitset); |  350   static void BitsetTypePrint(FILE* out, int bitset); | 
|  370 }; |  351 }; | 
|  371  |  352  | 
|  372  |  353  | 
|  373 // Zone-allocated types are either (odd) integers to represent bitsets, or |  354 // Zone-allocated types are either (odd) integers to represent bitsets, or | 
|  374 // (even) pointers to structures for everything else. |  355 // (even) pointers to zone lists for everything else. The first slot of every | 
 |  356 // list is an explicit tag value to distinguish representation. | 
|  375 struct ZoneTypeConfig { |  357 struct ZoneTypeConfig { | 
 |  358  private: | 
 |  359   typedef i::ZoneList<void*> Tagged; | 
 |  360  | 
 |  361   enum Tag { | 
 |  362     kClassTag, | 
 |  363     kConstantTag, | 
 |  364     kUnionTag | 
 |  365   }; | 
 |  366  | 
 |  367   static inline Tagged* tagged_create(Tag tag, int size, Zone* zone); | 
 |  368   static inline void tagged_shrink(Tagged* tagged, int size); | 
 |  369   static inline Tag tagged_tag(Tagged* tagged); | 
 |  370   template<class T> static inline T tagged_get(Tagged* tagged, int i); | 
 |  371   template<class T> static inline void tagged_set(Tagged* tagged, int i, T val); | 
 |  372   static inline int tagged_length(Tagged* tagged); | 
 |  373  | 
 |  374  public: | 
|  376   typedef TypeImpl<ZoneTypeConfig> Type; |  375   typedef TypeImpl<ZoneTypeConfig> Type; | 
|  377   class Base {}; |  376   class Base {}; | 
|  378   struct Struct { int tag; int length; void* args[1]; }; |  377   typedef i::ZoneList<Type*> Unioned; | 
|  379   typedef i::Zone Region; |  378   typedef i::Zone Region; | 
|  380   template<class T> struct Handle { typedef T* type; }; |  379   template<class T> struct Handle { typedef T* type; }; | 
|  381  |  380  | 
|  382   static inline Type* handle(Type* type); |  381   static inline Type* handle(Type* type); | 
 |  382   static inline bool is(Type* type, Tag tag); | 
|  383   static inline bool is_bitset(Type* type); |  383   static inline bool is_bitset(Type* type); | 
 |  384   static inline bool is_tagged(Type* type); | 
|  384   static inline bool is_class(Type* type); |  385   static inline bool is_class(Type* type); | 
|  385   static inline bool is_constant(Type* type); |  386   static inline bool is_constant(Type* type); | 
|  386   static inline bool is_struct(Type* type); |  387   static inline bool is_union(Type* type); | 
 |  388   static inline bool tagged_is_union(Tagged* tagged); | 
|  387   static inline int as_bitset(Type* type); |  389   static inline int as_bitset(Type* type); | 
|  388   static inline Struct* as_struct(Type* type); |  390   static inline Tagged* as_tagged(Type* type); | 
|  389   static inline i::Handle<i::Map> as_class(Type* type); |  391   static inline i::Handle<i::Map> as_class(Type* type); | 
|  390   static inline i::Handle<i::Object> as_constant(Type* type); |  392   static inline i::Handle<i::Object> as_constant(Type* type); | 
 |  393   static inline Unioned* as_union(Type* type); | 
 |  394   static inline Unioned* tagged_as_union(Tagged* tagged); | 
|  391   static inline Type* from_bitset(int bitset); |  395   static inline Type* from_bitset(int bitset); | 
|  392   static inline Type* from_bitset(int bitset, Zone* zone); |  396   static inline Type* from_bitset(int bitset, Zone* zone); | 
|  393   static inline Type* from_struct(Struct* structured); |  397   static inline Type* from_tagged(Tagged* tagged); | 
|  394   static inline Type* from_class(i::Handle<i::Map> map, int lub, Zone* zone); |  398   static inline Type* from_class(i::Handle<i::Map> map, int lub, Zone* zone); | 
|  395   static inline Type* from_constant( |  399   static inline Type* from_constant( | 
|  396       i::Handle<i::Object> value, int lub, Zone* zone); |  400       i::Handle<i::Object> value, int lub, Zone* zone); | 
|  397   static inline Struct* struct_create(int tag, int length, Zone* zone); |  401   static inline Type* from_union(Unioned* unioned); | 
|  398   static inline void struct_shrink(Struct* structured, int length); |  402   static inline Tagged* tagged_from_union(Unioned* unioned); | 
|  399   static inline int struct_tag(Struct* structured); |  403   static inline Unioned* union_create(int size, Zone* zone); | 
|  400   static inline Type* struct_get(Struct* structured, int i); |  404   static inline void union_shrink(Unioned* unioned, int size); | 
|  401   static inline void struct_set(Struct* structured, int i, Type* type); |  405   static inline Type* union_get(Unioned* unioned, int i); | 
|  402   static inline int struct_length(Struct* structured); |  406   static inline void union_set(Unioned* unioned, int i, Type* type); | 
 |  407   static inline int union_length(Unioned* unioned); | 
|  403   static inline int lub_bitset(Type* type); |  408   static inline int lub_bitset(Type* type); | 
|  404 }; |  409 }; | 
|  405  |  410  | 
|  406 typedef TypeImpl<ZoneTypeConfig> Type; |  411 typedef TypeImpl<ZoneTypeConfig> Type; | 
|  407  |  412  | 
|  408  |  413  | 
|  409 // Heap-allocated types are either smis for bitsets, maps for classes, boxes for |  414 // Heap-allocated types are either smis for bitsets, maps for classes, boxes for | 
|  410 // constants, or fixed arrays for unions. |  415 // constants, or fixed arrays for unions. | 
|  411 struct HeapTypeConfig { |  416 struct HeapTypeConfig { | 
|  412   typedef TypeImpl<HeapTypeConfig> Type; |  417   typedef TypeImpl<HeapTypeConfig> Type; | 
|  413   typedef i::Object Base; |  418   typedef i::Object Base; | 
|  414   typedef i::FixedArray Struct; |  419   typedef i::FixedArray Unioned; | 
|  415   typedef i::Isolate Region; |  420   typedef i::Isolate Region; | 
|  416   template<class T> struct Handle { typedef i::Handle<T> type; }; |  421   template<class T> struct Handle { typedef i::Handle<T> type; }; | 
|  417  |  422  | 
|  418   static inline i::Handle<Type> handle(Type* type); |  423   static inline i::Handle<Type> handle(Type* type); | 
|  419   static inline bool is_bitset(Type* type); |  424   static inline bool is_bitset(Type* type); | 
|  420   static inline bool is_class(Type* type); |  425   static inline bool is_class(Type* type); | 
|  421   static inline bool is_constant(Type* type); |  426   static inline bool is_constant(Type* type); | 
|  422   static inline bool is_struct(Type* type); |  427   static inline bool is_union(Type* type); | 
|  423   static inline int as_bitset(Type* type); |  428   static inline int as_bitset(Type* type); | 
|  424   static inline i::Handle<i::Map> as_class(Type* type); |  429   static inline i::Handle<i::Map> as_class(Type* type); | 
|  425   static inline i::Handle<i::Object> as_constant(Type* type); |  430   static inline i::Handle<i::Object> as_constant(Type* type); | 
|  426   static inline i::Handle<Struct> as_struct(Type* type); |  431   static inline i::Handle<Unioned> as_union(Type* type); | 
|  427   static inline Type* from_bitset(int bitset); |  432   static inline Type* from_bitset(int bitset); | 
|  428   static inline i::Handle<Type> from_bitset(int bitset, Isolate* isolate); |  433   static inline i::Handle<Type> from_bitset(int bitset, Isolate* isolate); | 
|  429   static inline i::Handle<Type> from_class( |  434   static inline i::Handle<Type> from_class( | 
|  430       i::Handle<i::Map> map, int lub, Isolate* isolate); |  435       i::Handle<i::Map> map, int lub, Isolate* isolate); | 
|  431   static inline i::Handle<Type> from_constant( |  436   static inline i::Handle<Type> from_constant( | 
|  432       i::Handle<i::Object> value, int lub, Isolate* isolate); |  437       i::Handle<i::Object> value, int lub, Isolate* isolate); | 
|  433   static inline i::Handle<Type> from_struct(i::Handle<Struct> structured); |  438   static inline i::Handle<Type> from_union(i::Handle<Unioned> unioned); | 
|  434   static inline i::Handle<Struct> struct_create( |  439   static inline i::Handle<Unioned> union_create(int size, Isolate* isolate); | 
|  435       int tag, int length, Isolate* isolate); |  440   static inline void union_shrink(i::Handle<Unioned> unioned, int size); | 
|  436   static inline void struct_shrink(i::Handle<Struct> structured, int length); |  441   static inline i::Handle<Type> union_get(i::Handle<Unioned> unioned, int i); | 
|  437   static inline int struct_tag(i::Handle<Struct> structured); |  442   static inline void union_set( | 
|  438   static inline i::Handle<Type> struct_get(i::Handle<Struct> structured, int i); |  443       i::Handle<Unioned> unioned, int i, i::Handle<Type> type); | 
|  439   static inline void struct_set( |  444   static inline int union_length(i::Handle<Unioned> unioned); | 
|  440       i::Handle<Struct> structured, int i, i::Handle<Type> type); |  | 
|  441   static inline int struct_length(i::Handle<Struct> structured); |  | 
|  442   static inline int lub_bitset(Type* type); |  445   static inline int lub_bitset(Type* type); | 
|  443 }; |  446 }; | 
|  444  |  447  | 
|  445 typedef TypeImpl<HeapTypeConfig> HeapType; |  448 typedef TypeImpl<HeapTypeConfig> HeapType; | 
|  446  |  449  | 
|  447  |  450  | 
|  448 // A simple struct to represent a pair of lower/upper type bounds. |  451 // A simple struct to represent a pair of lower/upper type bounds. | 
|  449 template<class Config> |  452 template<class Config> | 
|  450 struct BoundsImpl { |  453 struct BoundsImpl { | 
|  451   typedef TypeImpl<Config> Type; |  454   typedef TypeImpl<Config> Type; | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  497   bool Narrows(BoundsImpl that) { |  500   bool Narrows(BoundsImpl that) { | 
|  498     return that.lower->Is(this->lower) && this->upper->Is(that.upper); |  501     return that.lower->Is(this->lower) && this->upper->Is(that.upper); | 
|  499   } |  502   } | 
|  500 }; |  503 }; | 
|  501  |  504  | 
|  502 typedef BoundsImpl<ZoneTypeConfig> Bounds; |  505 typedef BoundsImpl<ZoneTypeConfig> Bounds; | 
|  503  |  506  | 
|  504 } }  // namespace v8::internal |  507 } }  // namespace v8::internal | 
|  505  |  508  | 
|  506 #endif  // V8_TYPES_H_ |  509 #endif  // V8_TYPES_H_ | 
| OLD | NEW |