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

Side by Side Diff: src/types.h

Issue 658543002: Better typing and type verification (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments 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
« no previous file with comments | « src/compiler/verifier.cc ('k') | src/types.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/conversions.h" 8 #include "src/conversions.h"
9 #include "src/factory.h" 9 #include "src/factory.h"
10 #include "src/handles.h" 10 #include "src/handles.h"
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 V(String, kInternalizedString | kOtherString) \ 212 V(String, kInternalizedString | kOtherString) \
213 V(UniqueName, kSymbol | kInternalizedString) \ 213 V(UniqueName, kSymbol | kInternalizedString) \
214 V(Name, kSymbol | kString) \ 214 V(Name, kSymbol | kString) \
215 V(NumberOrString, kNumber | kString) \ 215 V(NumberOrString, kNumber | kString) \
216 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \ 216 V(Primitive, kNumber | kName | kBoolean | kNull | kUndefined) \
217 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \ 217 V(DetectableObject, kArray | kFunction | kRegExp | kOtherObject) \
218 V(DetectableReceiver, kDetectableObject | kProxy) \ 218 V(DetectableReceiver, kDetectableObject | kProxy) \
219 V(Detectable, kDetectableReceiver | kNumber | kName) \ 219 V(Detectable, kDetectableReceiver | kNumber | kName) \
220 V(Object, kDetectableObject | kUndetectable) \ 220 V(Object, kDetectableObject | kUndetectable) \
221 V(Receiver, kObject | kProxy) \ 221 V(Receiver, kObject | kProxy) \
222 V(NonNumber, kBoolean | kName | kNull | kReceiver | \ 222 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \
223 kUndefined | kInternal) \ 223 kReceiver) \
224 V(NonNumber, kUnique | kString | kInternal) \
224 V(Any, 0xfffffffeu) 225 V(Any, 0xfffffffeu)
225 226
226 /* 227 /*
227 * The following diagrams show how integers (in the mathematical sense) are 228 * The following diagrams show how integers (in the mathematical sense) are
228 * divided among the different atomic numerical types. 229 * divided among the different atomic numerical types.
229 * 230 *
230 * If SmiValuesAre31Bits(): 231 * If SmiValuesAre31Bits():
231 * 232 *
232 * ON OS32 OSS US OU31 OU32 ON 233 * ON OS32 OSS US OU31 OU32 ON
233 * ______[_______[_______[_______[_______[_______[_______ 234 * ______[_______[_______[_______[_______[_______[_______
(...skipping 21 matching lines...) Expand all
255 256
256 // ----------------------------------------------------------------------------- 257 // -----------------------------------------------------------------------------
257 // The abstract Type class, parameterized over the low-level representation. 258 // The abstract Type class, parameterized over the low-level representation.
258 259
259 // struct Config { 260 // struct Config {
260 // typedef TypeImpl<Config> Type; 261 // typedef TypeImpl<Config> Type;
261 // typedef Base; 262 // typedef Base;
262 // typedef Struct; 263 // typedef Struct;
263 // typedef Region; 264 // typedef Region;
264 // template<class> struct Handle { typedef type; } // No template typedefs... 265 // template<class> struct Handle { typedef type; } // No template typedefs...
266 // template<class T> static Handle<T>::type null_handle();
265 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t) 267 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t)
266 // template<class T> static Handle<T>::type cast(Handle<Type>::type); 268 // template<class T> static Handle<T>::type cast(Handle<Type>::type);
267 // static bool is_bitset(Type*); 269 // static bool is_bitset(Type*);
268 // static bool is_class(Type*); 270 // static bool is_class(Type*);
269 // static bool is_struct(Type*, int tag); 271 // static bool is_struct(Type*, int tag);
270 // static bitset as_bitset(Type*); 272 // static bitset as_bitset(Type*);
271 // static i::Handle<i::Map> as_class(Type*); 273 // static i::Handle<i::Map> as_class(Type*);
272 // static Handle<Struct>::type as_struct(Type*); 274 // static Handle<Struct>::type as_struct(Type*);
273 // static Type* from_bitset(bitset); 275 // static Type* from_bitset(bitset);
274 // static Handle<Type>::type from_bitset(bitset, Region*); 276 // static Handle<Type>::type from_bitset(bitset, Region*);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 TypeHandle param2, Region* region) { 367 TypeHandle param2, Region* region) {
366 FunctionHandle function = Function(result, Any(region), 3, region); 368 FunctionHandle function = Function(result, Any(region), 3, region);
367 function->InitParameter(0, param0); 369 function->InitParameter(0, param0);
368 function->InitParameter(1, param1); 370 function->InitParameter(1, param1);
369 function->InitParameter(2, param2); 371 function->InitParameter(2, param2);
370 return function; 372 return function;
371 } 373 }
372 374
373 static TypeHandle Union(TypeHandle type1, TypeHandle type2, Region* reg); 375 static TypeHandle Union(TypeHandle type1, TypeHandle type2, Region* reg);
374 static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region* reg); 376 static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region* reg);
377 static TypeImpl* Union(TypeImpl* type1, TypeImpl* type2) {
378 return BitsetType::New(type1->AsBitset() | type2->AsBitset());
379 }
380 static TypeImpl* Intersect(TypeImpl* type1, TypeImpl* type2) {
381 return BitsetType::New(type1->AsBitset() & type2->AsBitset());
382 }
375 383
376 static TypeHandle Of(double value, Region* region) { 384 static TypeHandle Of(double value, Region* region) {
377 return Config::from_bitset(BitsetType::Lub(value), region); 385 return Config::from_bitset(BitsetType::Lub(value), region);
378 } 386 }
379 static TypeHandle Of(i::Object* value, Region* region) { 387 static TypeHandle Of(i::Object* value, Region* region) {
380 return Config::from_bitset(BitsetType::Lub(value), region); 388 return Config::from_bitset(BitsetType::Lub(value), region);
381 } 389 }
382 static TypeHandle Of(i::Handle<i::Object> value, Region* region) { 390 static TypeHandle Of(i::Handle<i::Object> value, Region* region) {
383 return Of(*value, region); 391 return Of(*value, region);
384 } 392 }
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 // Zone-allocated types; they are either (odd) integers to represent bitsets, or 910 // Zone-allocated types; they are either (odd) integers to represent bitsets, or
903 // (even) pointers to structures for everything else. 911 // (even) pointers to structures for everything else.
904 912
905 struct ZoneTypeConfig { 913 struct ZoneTypeConfig {
906 typedef TypeImpl<ZoneTypeConfig> Type; 914 typedef TypeImpl<ZoneTypeConfig> Type;
907 class Base {}; 915 class Base {};
908 typedef void* Struct; 916 typedef void* Struct;
909 typedef i::Zone Region; 917 typedef i::Zone Region;
910 template<class T> struct Handle { typedef T* type; }; 918 template<class T> struct Handle { typedef T* type; };
911 919
920 template<class T> static inline T* null_handle();
912 template<class T> static inline T* handle(T* type); 921 template<class T> static inline T* handle(T* type);
913 template<class T> static inline T* cast(Type* type); 922 template<class T> static inline T* cast(Type* type);
914 923
915 static inline bool is_bitset(Type* type); 924 static inline bool is_bitset(Type* type);
916 static inline bool is_class(Type* type); 925 static inline bool is_class(Type* type);
917 static inline bool is_struct(Type* type, int tag); 926 static inline bool is_struct(Type* type, int tag);
918 927
919 static inline Type::bitset as_bitset(Type* type); 928 static inline Type::bitset as_bitset(Type* type);
920 static inline i::Handle<i::Map> as_class(Type* type); 929 static inline i::Handle<i::Map> as_class(Type* type);
921 static inline Struct* as_struct(Type* type); 930 static inline Struct* as_struct(Type* type);
(...skipping 22 matching lines...) Expand all
944 // Heap-allocated types; either smis for bitsets, maps for classes, boxes for 953 // Heap-allocated types; either smis for bitsets, maps for classes, boxes for
945 // constants, or fixed arrays for unions. 954 // constants, or fixed arrays for unions.
946 955
947 struct HeapTypeConfig { 956 struct HeapTypeConfig {
948 typedef TypeImpl<HeapTypeConfig> Type; 957 typedef TypeImpl<HeapTypeConfig> Type;
949 typedef i::Object Base; 958 typedef i::Object Base;
950 typedef i::FixedArray Struct; 959 typedef i::FixedArray Struct;
951 typedef i::Isolate Region; 960 typedef i::Isolate Region;
952 template<class T> struct Handle { typedef i::Handle<T> type; }; 961 template<class T> struct Handle { typedef i::Handle<T> type; };
953 962
963 template<class T> static inline i::Handle<T> null_handle();
954 template<class T> static inline i::Handle<T> handle(T* type); 964 template<class T> static inline i::Handle<T> handle(T* type);
955 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type); 965 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type);
956 966
957 static inline bool is_bitset(Type* type); 967 static inline bool is_bitset(Type* type);
958 static inline bool is_class(Type* type); 968 static inline bool is_class(Type* type);
959 static inline bool is_struct(Type* type, int tag); 969 static inline bool is_struct(Type* type, int tag);
960 970
961 static inline Type::bitset as_bitset(Type* type); 971 static inline Type::bitset as_bitset(Type* type);
962 static inline i::Handle<i::Map> as_class(Type* type); 972 static inline i::Handle<i::Map> as_class(Type* type);
963 static inline i::Handle<Struct> as_struct(Type* type); 973 static inline i::Handle<Struct> as_struct(Type* type);
(...skipping 28 matching lines...) Expand all
992 1002
993 template<class Config> 1003 template<class Config>
994 struct BoundsImpl { 1004 struct BoundsImpl {
995 typedef TypeImpl<Config> Type; 1005 typedef TypeImpl<Config> Type;
996 typedef typename Type::TypeHandle TypeHandle; 1006 typedef typename Type::TypeHandle TypeHandle;
997 typedef typename Type::Region Region; 1007 typedef typename Type::Region Region;
998 1008
999 TypeHandle lower; 1009 TypeHandle lower;
1000 TypeHandle upper; 1010 TypeHandle upper;
1001 1011
1002 BoundsImpl() {} 1012 BoundsImpl() : // Make sure accessing uninitialized bounds crashes big-time.
1013 lower(Config::template null_handle<Type>()),
1014 upper(Config::template null_handle<Type>()) {}
1003 explicit BoundsImpl(TypeHandle t) : lower(t), upper(t) {} 1015 explicit BoundsImpl(TypeHandle t) : lower(t), upper(t) {}
1004 BoundsImpl(TypeHandle l, TypeHandle u) : lower(l), upper(u) { 1016 BoundsImpl(TypeHandle l, TypeHandle u) : lower(l), upper(u) {
1005 DCHECK(lower->Is(upper)); 1017 DCHECK(lower->Is(upper));
1006 } 1018 }
1007 1019
1008 // Unrestricted bounds. 1020 // Unrestricted bounds.
1009 static BoundsImpl Unbounded(Region* region) { 1021 static BoundsImpl Unbounded(Region* region) {
1010 return BoundsImpl(Type::None(region), Type::Any(region)); 1022 return BoundsImpl(Type::None(region), Type::Any(region));
1011 } 1023 }
1012 1024
(...skipping 28 matching lines...) Expand all
1041 bool Narrows(BoundsImpl that) { 1053 bool Narrows(BoundsImpl that) {
1042 return that.lower->Is(this->lower) && this->upper->Is(that.upper); 1054 return that.lower->Is(this->lower) && this->upper->Is(that.upper);
1043 } 1055 }
1044 }; 1056 };
1045 1057
1046 typedef BoundsImpl<ZoneTypeConfig> Bounds; 1058 typedef BoundsImpl<ZoneTypeConfig> Bounds;
1047 1059
1048 } } // namespace v8::internal 1060 } } // namespace v8::internal
1049 1061
1050 #endif // V8_TYPES_H_ 1062 #endif // V8_TYPES_H_
OLDNEW
« no previous file with comments | « src/compiler/verifier.cc ('k') | src/types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698