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

Side by Side Diff: src/types.h

Issue 882063002: [turbofan] Use unboxed doubles in range types. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Make tests less fragile. Created 5 years, 10 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
« no previous file with comments | « src/compiler/typer.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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 SEMANTIC_BITSET_TYPE_LIST(V) 263 SEMANTIC_BITSET_TYPE_LIST(V)
264 264
265 265
266 // ----------------------------------------------------------------------------- 266 // -----------------------------------------------------------------------------
267 // The abstract Type class, parameterized over the low-level representation. 267 // The abstract Type class, parameterized over the low-level representation.
268 268
269 // struct Config { 269 // struct Config {
270 // typedef TypeImpl<Config> Type; 270 // typedef TypeImpl<Config> Type;
271 // typedef Base; 271 // typedef Base;
272 // typedef Struct; 272 // typedef Struct;
273 // typedef Range;
273 // typedef Region; 274 // typedef Region;
274 // template<class> struct Handle { typedef type; } // No template typedefs... 275 // template<class> struct Handle { typedef type; } // No template typedefs...
275 // template<class T> static Handle<T>::type null_handle(); 276 // template<class T> static Handle<T>::type null_handle();
276 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t) 277 // template<class T> static Handle<T>::type handle(T* t); // !is_bitset(t)
277 // template<class T> static Handle<T>::type cast(Handle<Type>::type); 278 // template<class T> static Handle<T>::type cast(Handle<Type>::type);
279 //
278 // static bool is_bitset(Type*); 280 // static bool is_bitset(Type*);
279 // static bool is_class(Type*); 281 // static bool is_class(Type*);
280 // static bool is_struct(Type*, int tag); 282 // static bool is_struct(Type*, int tag);
283 // static bool is_range(Type*);
284 //
281 // static bitset as_bitset(Type*); 285 // static bitset as_bitset(Type*);
282 // static i::Handle<i::Map> as_class(Type*); 286 // static i::Handle<i::Map> as_class(Type*);
283 // static Handle<Struct>::type as_struct(Type*); 287 // static Handle<Struct>::type as_struct(Type*);
288 // static Handle<Range>::type as_range(Type*);
289 //
284 // static Type* from_bitset(bitset); 290 // static Type* from_bitset(bitset);
285 // static Handle<Type>::type from_bitset(bitset, Region*); 291 // static Handle<Type>::type from_bitset(bitset, Region*);
286 // static Handle<Type>::type from_class(i::Handle<Map>, Region*); 292 // static Handle<Type>::type from_class(i::Handle<Map>, Region*);
287 // static Handle<Type>::type from_struct(Handle<Struct>::type, int tag); 293 // static Handle<Type>::type from_struct(Handle<Struct>::type, int tag);
294 // static Handle<Type>::type from_range(Handle<Range>::type);
295 //
288 // static Handle<Struct>::type struct_create(int tag, int length, Region*); 296 // static Handle<Struct>::type struct_create(int tag, int length, Region*);
289 // static void struct_shrink(Handle<Struct>::type, int length); 297 // static void struct_shrink(Handle<Struct>::type, int length);
290 // static int struct_tag(Handle<Struct>::type); 298 // static int struct_tag(Handle<Struct>::type);
291 // static int struct_length(Handle<Struct>::type); 299 // static int struct_length(Handle<Struct>::type);
292 // static Handle<Type>::type struct_get(Handle<Struct>::type, int); 300 // static Handle<Type>::type struct_get(Handle<Struct>::type, int);
293 // static void struct_set(Handle<Struct>::type, int, Handle<Type>::type); 301 // static void struct_set(Handle<Struct>::type, int, Handle<Type>::type);
294 // template<class V> 302 // template<class V>
295 // static i::Handle<V> struct_get_value(Handle<Struct>::type, int); 303 // static i::Handle<V> struct_get_value(Handle<Struct>::type, int);
296 // template<class V> 304 // template<class V>
297 // static void struct_set_value(Handle<Struct>::type, int, i::Handle<V>); 305 // static void struct_set_value(Handle<Struct>::type, int, i::Handle<V>);
306 //
307 // static Handle<Range>::type range_create(Region*);
308 // static int range_get_bitset(Handle<Range>::type);
309 // static void range_set_bitset(Handle<Range>::type, int);
310 // static double range_get_double(Handle<Range>::type, int);
311 // static void range_set_double(Handle<Range>::type, int, double, Region*);
298 // } 312 // }
299 template<class Config> 313 template<class Config>
300 class TypeImpl : public Config::Base { 314 class TypeImpl : public Config::Base {
301 public: 315 public:
302 // Auxiliary types. 316 // Auxiliary types.
303 317
304 typedef uint32_t bitset; // Internal 318 typedef uint32_t bitset; // Internal
305 class BitsetType; // Internal 319 class BitsetType; // Internal
306 class StructuralType; // Internal 320 class StructuralType; // Internal
307 class UnionType; // Internal 321 class UnionType; // Internal
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 static TypeHandle UnsignedSmall(Region* region) { 361 static TypeHandle UnsignedSmall(Region* region) {
348 return BitsetType::New(BitsetType::UnsignedSmall(), region); 362 return BitsetType::New(BitsetType::UnsignedSmall(), region);
349 } 363 }
350 364
351 static TypeHandle Class(i::Handle<i::Map> map, Region* region) { 365 static TypeHandle Class(i::Handle<i::Map> map, Region* region) {
352 return ClassType::New(map, region); 366 return ClassType::New(map, region);
353 } 367 }
354 static TypeHandle Constant(i::Handle<i::Object> value, Region* region) { 368 static TypeHandle Constant(i::Handle<i::Object> value, Region* region) {
355 return ConstantType::New(value, region); 369 return ConstantType::New(value, region);
356 } 370 }
357 static TypeHandle Range( 371 static TypeHandle Range(double min, double max, Region* region) {
358 i::Handle<i::Object> min, i::Handle<i::Object> max, Region* region) {
359 return RangeType::New( 372 return RangeType::New(
360 min, max, BitsetType::New(REPRESENTATION(BitsetType::kTagged | 373 min, max, BitsetType::New(REPRESENTATION(BitsetType::kTagged |
361 BitsetType::kUntaggedNumber), 374 BitsetType::kUntaggedNumber),
362 region), 375 region),
363 region); 376 region);
364 } 377 }
365 static TypeHandle Context(TypeHandle outer, Region* region) { 378 static TypeHandle Context(TypeHandle outer, Region* region) {
366 return ContextType::New(outer, region); 379 return ContextType::New(outer, region);
367 } 380 }
368 static TypeHandle Array(TypeHandle element, Region* region) { 381 static TypeHandle Array(TypeHandle element, Region* region) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 bool NowIs(TypeImpl* that); 459 bool NowIs(TypeImpl* that);
447 template<class TypeHandle> 460 template<class TypeHandle>
448 bool NowIs(TypeHandle that) { return this->NowIs(*that); } 461 bool NowIs(TypeHandle that) { return this->NowIs(*that); }
449 inline bool NowContains(i::Object* val); 462 inline bool NowContains(i::Object* val);
450 bool NowContains(i::Handle<i::Object> val) { return this->NowContains(*val); } 463 bool NowContains(i::Handle<i::Object> val) { return this->NowContains(*val); }
451 464
452 bool NowStable(); 465 bool NowStable();
453 466
454 // Inspection. 467 // Inspection.
455 468
469 bool IsRange() { return Config::is_range(this); }
456 bool IsClass() { 470 bool IsClass() {
457 return Config::is_class(this) 471 return Config::is_class(this)
458 || Config::is_struct(this, StructuralType::kClassTag); 472 || Config::is_struct(this, StructuralType::kClassTag);
459 } 473 }
460 bool IsConstant() { 474 bool IsConstant() {
461 return Config::is_struct(this, StructuralType::kConstantTag); 475 return Config::is_struct(this, StructuralType::kConstantTag);
462 } 476 }
463 bool IsRange() {
464 return Config::is_struct(this, StructuralType::kRangeTag);
465 }
466 bool IsContext() { 477 bool IsContext() {
467 return Config::is_struct(this, StructuralType::kContextTag); 478 return Config::is_struct(this, StructuralType::kContextTag);
468 } 479 }
469 bool IsArray() { 480 bool IsArray() {
470 return Config::is_struct(this, StructuralType::kArrayTag); 481 return Config::is_struct(this, StructuralType::kArrayTag);
471 } 482 }
472 bool IsFunction() { 483 bool IsFunction() {
473 return Config::is_struct(this, StructuralType::kFunctionTag); 484 return Config::is_struct(this, StructuralType::kFunctionTag);
474 } 485 }
475 486
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 // Printing. 527 // Printing.
517 528
518 enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM }; 529 enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM };
519 530
520 void PrintTo(std::ostream& os, PrintDimension dim = BOTH_DIMS); // NOLINT 531 void PrintTo(std::ostream& os, PrintDimension dim = BOTH_DIMS); // NOLINT
521 532
522 #ifdef DEBUG 533 #ifdef DEBUG
523 void Print(); 534 void Print();
524 #endif 535 #endif
525 536
537 bool IsUnionForTesting() { return IsUnion(); }
538
526 protected: 539 protected:
527 // Friends. 540 // Friends.
528 541
529 template<class> friend class Iterator; 542 template<class> friend class Iterator;
530 template<class> friend class TypeImpl; 543 template<class> friend class TypeImpl;
531 544
532 // Handle conversion. 545 // Handle conversion.
533 546
534 template<class T> 547 template<class T>
535 static typename Config::template Handle<T>::type handle(T* type) { 548 static typename Config::template Handle<T>::type handle(T* type) {
(...skipping 22 matching lines...) Expand all
558 bool SlowIs(TypeImpl* that); 571 bool SlowIs(TypeImpl* that);
559 572
560 static bool IsInteger(double x) { 573 static bool IsInteger(double x) {
561 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities. 574 return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities.
562 } 575 }
563 static bool IsInteger(i::Object* x) { 576 static bool IsInteger(i::Object* x) {
564 return x->IsNumber() && IsInteger(x->Number()); 577 return x->IsNumber() && IsInteger(x->Number());
565 } 578 }
566 579
567 struct Limits { 580 struct Limits {
568 i::Handle<i::Object> min; 581 double min;
569 i::Handle<i::Object> max; 582 double max;
570 bitset representation; 583 bitset representation;
571 Limits(i::Handle<i::Object> min, i::Handle<i::Object> max, 584 Limits(double min, double max, bitset representation)
572 bitset representation)
573 : min(min), max(max), representation(representation) {} 585 : min(min), max(max), representation(representation) {}
574 explicit Limits(RangeType* range) 586 explicit Limits(RangeType* range)
575 : min(range->Min()), 587 : min(range->Min()),
576 max(range->Max()), 588 max(range->Max()),
577 representation(REPRESENTATION(range->Bound()->AsBitset())) {} 589 representation(REPRESENTATION(range->Bound())) {}
578 static Limits Empty(Region* region) { 590 static Limits Empty(Region* region) {
579 // TODO(jarin) Get rid of the heap numbers. 591 return Limits(1, 0, BitsetType::kNone);
580 i::Factory* f = i::Isolate::Current()->factory();
581 i::Handle<i::Object> min = f->NewNumber(1);
582 i::Handle<i::Object> max = f->NewNumber(0);
583 return Limits(min, max, BitsetType::kNone);
584 } 592 }
585 }; 593 };
586 594
587 static bool IsEmpty(Limits lim); 595 static bool IsEmpty(Limits lim);
588 static Limits Intersect(Limits lhs, Limits rhs); 596 static Limits Intersect(Limits lhs, Limits rhs);
589 static Limits Union(Limits lhs, Limits rhs); 597 static Limits Union(Limits lhs, Limits rhs);
590 static bool Overlap(RangeType* lhs, RangeType* rhs); 598 static bool Overlap(RangeType* lhs, RangeType* rhs);
591 static bool Contains(RangeType* lhs, RangeType* rhs); 599 static bool Contains(RangeType* lhs, RangeType* rhs);
592 static bool Contains(RangeType* range, ConstantType* constant); 600 static bool Contains(RangeType* range, ConstantType* constant);
593 static bool Contains(RangeType* range, i::Object* val); 601 static bool Contains(RangeType* range, i::Object* val);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 template<class Config> 699 template<class Config>
692 class TypeImpl<Config>::StructuralType : public TypeImpl<Config> { 700 class TypeImpl<Config>::StructuralType : public TypeImpl<Config> {
693 protected: 701 protected:
694 template<class> friend class TypeImpl; 702 template<class> friend class TypeImpl;
695 friend struct ZoneTypeConfig; // For tags. 703 friend struct ZoneTypeConfig; // For tags.
696 friend struct HeapTypeConfig; 704 friend struct HeapTypeConfig;
697 705
698 enum Tag { 706 enum Tag {
699 kClassTag, 707 kClassTag,
700 kConstantTag, 708 kConstantTag,
701 kRangeTag,
702 kContextTag, 709 kContextTag,
703 kArrayTag, 710 kArrayTag,
704 kFunctionTag, 711 kFunctionTag,
705 kUnionTag 712 kUnionTag
706 }; 713 };
707 714
708 int Length() { 715 int Length() {
709 return Config::struct_length(Config::as_struct(this)); 716 return Config::struct_length(Config::as_struct(this));
710 } 717 }
711 TypeHandle Get(int i) { 718 TypeHandle Get(int i) {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 return static_cast<ConstantType*>(type); 824 return static_cast<ConstantType*>(type);
818 } 825 }
819 }; 826 };
820 // TODO(neis): Also cache value if numerical. 827 // TODO(neis): Also cache value if numerical.
821 // TODO(neis): Allow restricting the representation. 828 // TODO(neis): Allow restricting the representation.
822 829
823 830
824 // ----------------------------------------------------------------------------- 831 // -----------------------------------------------------------------------------
825 // Range types. 832 // Range types.
826 833
827 template<class Config> 834 template <class Config>
828 class TypeImpl<Config>::RangeType : public StructuralType { 835 class TypeImpl<Config>::RangeType : public TypeImpl<Config> {
829 public: 836 public:
830 TypeHandle Bound() { return this->Get(0); } 837 bitset Bound() { return Config::range_get_bitset(Config::as_range(this)); }
831 i::Handle<i::Object> Min() { return this->template GetValue<i::Object>(1); } 838 double Min() { return Config::range_get_double(Config::as_range(this), 0); }
832 i::Handle<i::Object> Max() { return this->template GetValue<i::Object>(2); } 839 double Max() { return Config::range_get_double(Config::as_range(this), 1); }
833 840
834 static RangeHandle New(i::Handle<i::Object> min, i::Handle<i::Object> max, 841 static RangeHandle New(double min, double max, TypeHandle representation,
835 TypeHandle representation, Region* region) { 842 Region* region) {
836 DCHECK(IsInteger(min->Number()) && IsInteger(max->Number())); 843 DCHECK(IsInteger(min) && IsInteger(max));
837 DCHECK(min->Number() <= max->Number()); 844 DCHECK(min <= max);
838 bitset representation_bits = representation->AsBitset(); 845 bitset representation_bits = representation->AsBitset();
839 DCHECK(REPRESENTATION(representation_bits) == representation_bits); 846 DCHECK(REPRESENTATION(representation_bits) == representation_bits);
840 847
841 RangeHandle type = Config::template cast<RangeType>( 848 typename Config::template Handle<typename Config::Range>::type range =
842 StructuralType::New(StructuralType::kRangeTag, 3, region)); 849 Config::range_create(region);
843 850
844 bitset bits = SEMANTIC(BitsetType::Lub(min->Number(), max->Number())) | 851 bitset bits = SEMANTIC(BitsetType::Lub(min, max)) | representation_bits;
845 representation_bits; 852 Config::range_set_bitset(range, bits);
846 type->Set(0, BitsetType::New(bits, region)); 853 Config::range_set_double(range, 0, min, region);
847 type->SetValue(1, min); 854 Config::range_set_double(range, 1, max, region);
848 type->SetValue(2, max); 855 return Config::template cast<RangeType>(Config::from_range(range));
849 return type;
850 } 856 }
851 857
852 static RangeHandle New(Limits lim, Region* region) { 858 static RangeHandle New(Limits lim, Region* region) {
853 return New(lim.min, lim.max, BitsetType::New(lim.representation, region), 859 return New(lim.min, lim.max, BitsetType::New(lim.representation, region),
854 region); 860 region);
855 } 861 }
856 862
857 static RangeType* cast(TypeImpl* type) { 863 static RangeType* cast(TypeImpl* type) {
858 DCHECK(type->IsRange()); 864 DCHECK(type->IsRange());
859 return static_cast<RangeType*>(type); 865 return static_cast<RangeType*>(type);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 969
964 970
965 // ----------------------------------------------------------------------------- 971 // -----------------------------------------------------------------------------
966 // Zone-allocated types; they are either (odd) integers to represent bitsets, or 972 // Zone-allocated types; they are either (odd) integers to represent bitsets, or
967 // (even) pointers to structures for everything else. 973 // (even) pointers to structures for everything else.
968 974
969 struct ZoneTypeConfig { 975 struct ZoneTypeConfig {
970 typedef TypeImpl<ZoneTypeConfig> Type; 976 typedef TypeImpl<ZoneTypeConfig> Type;
971 class Base {}; 977 class Base {};
972 typedef void* Struct; 978 typedef void* Struct;
979 // Hack: the Struct and Range types can be aliased in memory, the first
980 // pointer word of each both must be the tag (kRangeStructTag for Range,
981 // anything else for Struct) so that we can differentiate them.
982 struct Range {
983 void* tag;
984 int bitset;
985 double limits[2];
986 };
973 typedef i::Zone Region; 987 typedef i::Zone Region;
974 template<class T> struct Handle { typedef T* type; }; 988 template<class T> struct Handle { typedef T* type; };
975 989
990 static const int kRangeStructTag = 0x1000;
991
976 template<class T> static inline T* null_handle(); 992 template<class T> static inline T* null_handle();
977 template<class T> static inline T* handle(T* type); 993 template<class T> static inline T* handle(T* type);
978 template<class T> static inline T* cast(Type* type); 994 template<class T> static inline T* cast(Type* type);
979 995
980 static inline bool is_bitset(Type* type); 996 static inline bool is_bitset(Type* type);
981 static inline bool is_class(Type* type); 997 static inline bool is_class(Type* type);
982 static inline bool is_struct(Type* type, int tag); 998 static inline bool is_struct(Type* type, int tag);
999 static inline bool is_range(Type* type);
983 1000
984 static inline Type::bitset as_bitset(Type* type); 1001 static inline Type::bitset as_bitset(Type* type);
985 static inline i::Handle<i::Map> as_class(Type* type); 1002 static inline i::Handle<i::Map> as_class(Type* type);
986 static inline Struct* as_struct(Type* type); 1003 static inline Struct* as_struct(Type* type);
1004 static inline Range* as_range(Type* type);
987 1005
988 static inline Type* from_bitset(Type::bitset); 1006 static inline Type* from_bitset(Type::bitset);
989 static inline Type* from_bitset(Type::bitset, Zone* zone); 1007 static inline Type* from_bitset(Type::bitset, Zone* zone);
990 static inline Type* from_class(i::Handle<i::Map> map, Zone* zone); 1008 static inline Type* from_class(i::Handle<i::Map> map, Zone* zone);
991 static inline Type* from_struct(Struct* structured); 1009 static inline Type* from_struct(Struct* structured);
1010 static inline Type* from_range(Range* range);
992 1011
993 static inline Struct* struct_create(int tag, int length, Zone* zone); 1012 static inline Struct* struct_create(int tag, int length, Zone* zone);
994 static inline void struct_shrink(Struct* structure, int length); 1013 static inline void struct_shrink(Struct* structure, int length);
995 static inline int struct_tag(Struct* structure); 1014 static inline int struct_tag(Struct* structure);
996 static inline int struct_length(Struct* structure); 1015 static inline int struct_length(Struct* structure);
997 static inline Type* struct_get(Struct* structure, int i); 1016 static inline Type* struct_get(Struct* structure, int i);
998 static inline void struct_set(Struct* structure, int i, Type* type); 1017 static inline void struct_set(Struct* structure, int i, Type* type);
999 template<class V> 1018 template<class V>
1000 static inline i::Handle<V> struct_get_value(Struct* structure, int i); 1019 static inline i::Handle<V> struct_get_value(Struct* structure, int i);
1001 template<class V> static inline void struct_set_value( 1020 template<class V> static inline void struct_set_value(
1002 Struct* structure, int i, i::Handle<V> x); 1021 Struct* structure, int i, i::Handle<V> x);
1022
1023 static inline Range* range_create(Zone* zone);
1024 static inline int range_get_bitset(Range* range);
1025 static inline void range_set_bitset(Range* range, int);
1026 static inline double range_get_double(Range*, int index);
1027 static inline void range_set_double(Range*, int index, double value, Zone*);
1003 }; 1028 };
1004 1029
1005 typedef TypeImpl<ZoneTypeConfig> Type; 1030 typedef TypeImpl<ZoneTypeConfig> Type;
1006 1031
1007 1032
1008 // ----------------------------------------------------------------------------- 1033 // -----------------------------------------------------------------------------
1009 // Heap-allocated types; either smis for bitsets, maps for classes, boxes for 1034 // Heap-allocated types; either smis for bitsets, maps for classes, boxes for
1010 // constants, or fixed arrays for unions. 1035 // constants, or fixed arrays for unions.
1011 1036
1012 struct HeapTypeConfig { 1037 struct HeapTypeConfig {
1013 typedef TypeImpl<HeapTypeConfig> Type; 1038 typedef TypeImpl<HeapTypeConfig> Type;
1014 typedef i::Object Base; 1039 typedef i::Object Base;
1015 typedef i::FixedArray Struct; 1040 typedef i::FixedArray Struct;
1041 typedef i::FixedArray Range;
1016 typedef i::Isolate Region; 1042 typedef i::Isolate Region;
1017 template<class T> struct Handle { typedef i::Handle<T> type; }; 1043 template<class T> struct Handle { typedef i::Handle<T> type; };
1018 1044
1045 static const int kRangeStructTag = 0xffff;
1046
1019 template<class T> static inline i::Handle<T> null_handle(); 1047 template<class T> static inline i::Handle<T> null_handle();
1020 template<class T> static inline i::Handle<T> handle(T* type); 1048 template<class T> static inline i::Handle<T> handle(T* type);
1021 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type); 1049 template<class T> static inline i::Handle<T> cast(i::Handle<Type> type);
1022 1050
1023 static inline bool is_bitset(Type* type); 1051 static inline bool is_bitset(Type* type);
1024 static inline bool is_class(Type* type); 1052 static inline bool is_class(Type* type);
1025 static inline bool is_struct(Type* type, int tag); 1053 static inline bool is_struct(Type* type, int tag);
1054 static inline bool is_range(Type* type);
1026 1055
1027 static inline Type::bitset as_bitset(Type* type); 1056 static inline Type::bitset as_bitset(Type* type);
1028 static inline i::Handle<i::Map> as_class(Type* type); 1057 static inline i::Handle<i::Map> as_class(Type* type);
1029 static inline i::Handle<Struct> as_struct(Type* type); 1058 static inline i::Handle<Struct> as_struct(Type* type);
1059 static inline i::Handle<Range> as_range(Type* type);
1030 1060
1031 static inline Type* from_bitset(Type::bitset); 1061 static inline Type* from_bitset(Type::bitset);
1032 static inline i::Handle<Type> from_bitset(Type::bitset, Isolate* isolate); 1062 static inline i::Handle<Type> from_bitset(Type::bitset, Isolate* isolate);
1033 static inline i::Handle<Type> from_class( 1063 static inline i::Handle<Type> from_class(
1034 i::Handle<i::Map> map, Isolate* isolate); 1064 i::Handle<i::Map> map, Isolate* isolate);
1035 static inline i::Handle<Type> from_struct(i::Handle<Struct> structure); 1065 static inline i::Handle<Type> from_struct(i::Handle<Struct> structure);
1066 static inline i::Handle<Type> from_range(i::Handle<Range> range);
1036 1067
1037 static inline i::Handle<Struct> struct_create( 1068 static inline i::Handle<Struct> struct_create(
1038 int tag, int length, Isolate* isolate); 1069 int tag, int length, Isolate* isolate);
1039 static inline void struct_shrink(i::Handle<Struct> structure, int length); 1070 static inline void struct_shrink(i::Handle<Struct> structure, int length);
1040 static inline int struct_tag(i::Handle<Struct> structure); 1071 static inline int struct_tag(i::Handle<Struct> structure);
1041 static inline int struct_length(i::Handle<Struct> structure); 1072 static inline int struct_length(i::Handle<Struct> structure);
1042 static inline i::Handle<Type> struct_get(i::Handle<Struct> structure, int i); 1073 static inline i::Handle<Type> struct_get(i::Handle<Struct> structure, int i);
1043 static inline void struct_set( 1074 static inline void struct_set(
1044 i::Handle<Struct> structure, int i, i::Handle<Type> type); 1075 i::Handle<Struct> structure, int i, i::Handle<Type> type);
1045 template<class V> 1076 template<class V>
1046 static inline i::Handle<V> struct_get_value( 1077 static inline i::Handle<V> struct_get_value(
1047 i::Handle<Struct> structure, int i); 1078 i::Handle<Struct> structure, int i);
1048 template<class V> 1079 template<class V>
1049 static inline void struct_set_value( 1080 static inline void struct_set_value(
1050 i::Handle<Struct> structure, int i, i::Handle<V> x); 1081 i::Handle<Struct> structure, int i, i::Handle<V> x);
1082
1083 static inline i::Handle<Range> range_create(Isolate* isolate);
1084 static inline int range_get_bitset(i::Handle<Range> range);
1085 static inline void range_set_bitset(i::Handle<Range> range, int value);
1086 static inline double range_get_double(i::Handle<Range> range, int index);
1087 static inline void range_set_double(i::Handle<Range> range, int index,
1088 double value, Isolate* isolate);
1051 }; 1089 };
1052 1090
1053 typedef TypeImpl<HeapTypeConfig> HeapType; 1091 typedef TypeImpl<HeapTypeConfig> HeapType;
1054 1092
1055 1093
1056 // ----------------------------------------------------------------------------- 1094 // -----------------------------------------------------------------------------
1057 // Type bounds. A simple struct to represent a pair of lower/upper types. 1095 // Type bounds. A simple struct to represent a pair of lower/upper types.
1058 1096
1059 template<class Config> 1097 template<class Config>
1060 struct BoundsImpl { 1098 struct BoundsImpl {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 bool Narrows(BoundsImpl that) { 1149 bool Narrows(BoundsImpl that) {
1112 return that.lower->Is(this->lower) && this->upper->Is(that.upper); 1150 return that.lower->Is(this->lower) && this->upper->Is(that.upper);
1113 } 1151 }
1114 }; 1152 };
1115 1153
1116 typedef BoundsImpl<ZoneTypeConfig> Bounds; 1154 typedef BoundsImpl<ZoneTypeConfig> Bounds;
1117 1155
1118 } } // namespace v8::internal 1156 } } // namespace v8::internal
1119 1157
1120 #endif // V8_TYPES_H_ 1158 #endif // V8_TYPES_H_
OLDNEW
« no previous file with comments | « src/compiler/typer.cc ('k') | src/types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698