Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/types.h

Issue 509343002: Better typing and type verification (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Drop typedness from graph Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "src/factory.h" 8 #include "src/factory.h"
9 #include "src/handles.h" 9 #include "src/handles.h"
10 #include "src/ostreams.h" 10 #include "src/ostreams.h"
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 V(String, kInternalizedString | kOtherString) \ 197 V(String, kInternalizedString | kOtherString) \
198 V(UniqueName, kSymbol | kInternalizedString) \ 198 V(UniqueName, kSymbol | kInternalizedString) \
199 V(Name, kSymbol | kString) \ 199 V(Name, kSymbol | kString) \
200 V(NumberOrString, kNumber | kString) \ 200 V(NumberOrString, kNumber | kString) \
201 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \ 201 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \
202 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \ 202 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \
203 V(DetectableReceiver, kDetectableObject | kProxy) \ 203 V(DetectableReceiver, kDetectableObject | kProxy) \
204 V(Detectable, kDetectableReceiver | kNumber | kName) \ 204 V(Detectable, kDetectableReceiver | kNumber | kName) \
205 V(Object, kDetectableObject | kUndetectable) \ 205 V(Object, kDetectableObject | kUndetectable) \
206 V(Receiver, kObject | kProxy) \ 206 V(Receiver, kObject | kProxy) \
207 V(NonNumber, kBoolean | kName | kNull | kReceiver | \ 207 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \
208 kUndefined | kInternal) \ 208 kReceiver) \
209 V(NonNumber, kUnique | kString | kInternal) \
209 V(Any, -1) 210 V(Any, -1)
210 211
211 #define BITSET_TYPE_LIST(V) \ 212 #define BITSET_TYPE_LIST(V) \
212 MASK_BITSET_TYPE_LIST(V) \ 213 MASK_BITSET_TYPE_LIST(V) \
213 REPRESENTATION_BITSET_TYPE_LIST(V) \ 214 REPRESENTATION_BITSET_TYPE_LIST(V) \
214 SEMANTIC_BITSET_TYPE_LIST(V) 215 SEMANTIC_BITSET_TYPE_LIST(V)
215 216
216 217
217 // ----------------------------------------------------------------------------- 218 // -----------------------------------------------------------------------------
218 // The abstract Type class, parameterized over the low-level representation. 219 // The abstract Type class, parameterized over the low-level representation.
219 220
220 // struct Config { 221 // struct Config {
221 // typedef TypeImpl<Config> Type; 222 // typedef TypeImpl<Config> Type;
222 // typedef Base; 223 // typedef Base;
223 // typedef Struct; 224 // typedef Struct;
224 // typedef Region; 225 // typedef Region;
225 // template<class> struct Handle { typedef type; } // No template typedefs... 226 // template<class> struct Handle { typedef type; } // No template typedefs...
227 // template<class T> static Handle<T>::type null_handle();
226 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t) 228 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t)
227 // template<class T> static Handle<T>::type cast(Handle<Type>::type); 229 // template<class T> static Handle<T>::type cast(Handle<Type>::type);
228 // static bool is_bitset(Type*); 230 // static bool is_bitset(Type*);
229 // static bool is_class(Type*); 231 // static bool is_class(Type*);
230 // static bool is_struct(Type*, int tag); 232 // static bool is_struct(Type*, int tag);
231 // static int as_bitset(Type*); 233 // static int as_bitset(Type*);
232 // static i::Handle<i::Map> as_class(Type*); 234 // static i::Handle<i::Map> as_class(Type*);
233 // static Handle<Struct>::type as_struct(Type*); 235 // static Handle<Struct>::type as_struct(Type*);
234 // static Type* from_bitset(int bitset); 236 // static Type* from_bitset(int bitset);
235 // static Handle<Type>::type from_bitset(int bitset, Region*); 237 // static Handle<Type>::type from_bitset(int bitset, Region*);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 TypeHandle param2, Region* region) { 325 TypeHandle param2, Region* region) {
324 FunctionHandle function = Function(result, Any(region), 3, region); 326 FunctionHandle function = Function(result, Any(region), 3, region);
325 function->InitParameter(0, param0); 327 function->InitParameter(0, param0);
326 function->InitParameter(1, param1); 328 function->InitParameter(1, param1);
327 function->InitParameter(2, param2); 329 function->InitParameter(2, param2);
328 return function; 330 return function;
329 } 331 }
330 332
331 static TypeHandle Union(TypeHandle type1, TypeHandle type2, Region* reg); 333 static TypeHandle Union(TypeHandle type1, TypeHandle type2, Region* reg);
332 static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region* reg); 334 static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region* reg);
335 static TypeImpl* Union(TypeImpl* type1, TypeImpl* type2) {
336 return BitsetType::New(type1->AsBitset() | type2->AsBitset());
337 }
338 static TypeImpl* Intersect(TypeImpl* type1, TypeImpl* type2) {
339 return BitsetType::New(type1->AsBitset() & type2->AsBitset());
340 }
333 341
334 static TypeHandle Of(double value, Region* region) { 342 static TypeHandle Of(double value, Region* region) {
335 return Config::from_bitset(BitsetType::Lub(value), region); 343 return Config::from_bitset(BitsetType::Lub(value), region);
336 } 344 }
337 static TypeHandle Of(i::Object* value, Region* region) { 345 static TypeHandle Of(i::Object* value, Region* region) {
338 return Config::from_bitset(BitsetType::Lub(value), region); 346 return Config::from_bitset(BitsetType::Lub(value), region);
339 } 347 }
340 static TypeHandle Of(i::Handle<i::Object> value, Region* region) { 348 static TypeHandle Of(i::Handle<i::Object> value, Region* region) {
341 return Of(*value, region); 349 return Of(*value, region);
342 } 350 }
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 class Base {}; 859 class Base {};
852 typedef void* Struct; 860 typedef void* Struct;
853 typedef i::Zone Region; 861 typedef i::Zone Region;
854 template<class T> struct Handle { typedef T* type; }; 862 template<class T> struct Handle { typedef T* type; };
855 863
856 // TODO(neis): This will be removed again once we have struct_get_double(). 864 // TODO(neis): This will be removed again once we have struct_get_double().
857 static inline i::Isolate* isolate(Region* region) { 865 static inline i::Isolate* isolate(Region* region) {
858 return region->isolate(); 866 return region->isolate();
859 } 867 }
860 868
869 template<class T> static inline T* null_handle();
861 template<class T> static inline T* handle(T* type); 870 template<class T> static inline T* handle(T* type);
862 template<class T> static inline T* cast(Type* type); 871 template<class T> static inline T* cast(Type* type);
863 872
864 static inline bool is_bitset(Type* type); 873 static inline bool is_bitset(Type* type);
865 static inline bool is_class(Type* type); 874 static inline bool is_class(Type* type);
866 static inline bool is_struct(Type* type, int tag); 875 static inline bool is_struct(Type* type, int tag);
867 876
868 static inline int as_bitset(Type* type); 877 static inline int as_bitset(Type* type);
869 static inline i::Handle<i::Map> as_class(Type* type); 878 static inline i::Handle<i::Map> as_class(Type* type);
870 static inline Struct* as_struct(Type* type); 879 static inline Struct* as_struct(Type* type);
(...skipping 27 matching lines...) Expand all
898 typedef i::Object Base; 907 typedef i::Object Base;
899 typedef i::FixedArray Struct; 908 typedef i::FixedArray Struct;
900 typedef i::Isolate Region; 909 typedef i::Isolate Region;
901 template<class T> struct Handle { typedef i::Handle<T> type; }; 910 template<class T> struct Handle { typedef i::Handle<T> type; };
902 911
903 // TODO(neis): This will be removed again once we have struct_get_double(). 912 // TODO(neis): This will be removed again once we have struct_get_double().
904 static inline i::Isolate* isolate(Region* region) { 913 static inline i::Isolate* isolate(Region* region) {
905 return region; 914 return region;
906 } 915 }
907 916
917 template<class T> static inline i::Handle<T> null_handle();
908 template<class T> static inline i::Handle<T> handle(T* type); 918 template<class T> static inline i::Handle<T> handle(T* type);
909 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type); 919 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type);
910 920
911 static inline bool is_bitset(Type* type); 921 static inline bool is_bitset(Type* type);
912 static inline bool is_class(Type* type); 922 static inline bool is_class(Type* type);
913 static inline bool is_struct(Type* type, int tag); 923 static inline bool is_struct(Type* type, int tag);
914 924
915 static inline int as_bitset(Type* type); 925 static inline int as_bitset(Type* type);
916 static inline i::Handle<i::Map> as_class(Type* type); 926 static inline i::Handle<i::Map> as_class(Type* type);
917 static inline i::Handle<Struct> as_struct(Type* type); 927 static inline i::Handle<Struct> as_struct(Type* type);
(...skipping 28 matching lines...) Expand all
946 956
947 template<class Config> 957 template<class Config>
948 struct BoundsImpl { 958 struct BoundsImpl {
949 typedef TypeImpl<Config> Type; 959 typedef TypeImpl<Config> Type;
950 typedef typename Type::TypeHandle TypeHandle; 960 typedef typename Type::TypeHandle TypeHandle;
951 typedef typename Type::Region Region; 961 typedef typename Type::Region Region;
952 962
953 TypeHandle lower; 963 TypeHandle lower;
954 TypeHandle upper; 964 TypeHandle upper;
955 965
956 BoundsImpl() {} 966 BoundsImpl() : // Make sure accessing uninitialized bounds crashes big-time.
967 lower(Config::template null_handle<Type>()),
968 upper(Config::template null_handle<Type>()) {}
957 explicit BoundsImpl(TypeHandle t) : lower(t), upper(t) {} 969 explicit BoundsImpl(TypeHandle t) : lower(t), upper(t) {}
958 BoundsImpl(TypeHandle l, TypeHandle u) : lower(l), upper(u) { 970 BoundsImpl(TypeHandle l, TypeHandle u) : lower(l), upper(u) {
959 DCHECK(lower->Is(upper)); 971 DCHECK(lower->Is(upper));
960 } 972 }
961 973
962 // Unrestricted bounds. 974 // Unrestricted bounds.
963 static BoundsImpl Unbounded(Region* region) { 975 static BoundsImpl Unbounded(Region* region) {
964 return BoundsImpl(Type::None(region), Type::Any(region)); 976 return BoundsImpl(Type::None(region), Type::Any(region));
965 } 977 }
966 978
(...skipping 28 matching lines...) Expand all
995 bool Narrows(BoundsImpl that) { 1007 bool Narrows(BoundsImpl that) {
996 return that.lower->Is(this->lower) && this->upper->Is(that.upper); 1008 return that.lower->Is(this->lower) && this->upper->Is(that.upper);
997 } 1009 }
998 }; 1010 };
999 1011
1000 typedef BoundsImpl<ZoneTypeConfig> Bounds; 1012 typedef BoundsImpl<ZoneTypeConfig> Bounds;
1001 1013
1002 } } // namespace v8::internal 1014 } } // namespace v8::internal
1003 1015
1004 #endif // V8_TYPES_H_ 1016 #endif // V8_TYPES_H_
OLDNEW
« src/compiler/js-graph.cc ('K') | « src/compiler/verifier.cc ('k') | src/types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698