Index: src/number-info.h |
=================================================================== |
--- src/number-info.h (revision 4025) |
+++ src/number-info.h (working copy) |
@@ -31,42 +31,138 @@ |
namespace v8 { |
namespace internal { |
-class NumberInfo : public AllStatic { |
+// Unknown |
+// | |
+// Number |
+// / | |
+// HeapNumber Integer32 |
+// | | |
+// | Smi |
+// | / |
+// Uninitialized. |
+ |
+class NumberInfo { |
public: |
- enum Type { |
- kUnknown = 0, |
- kNumber = 1, |
- kSmi = 3, |
- kHeapNumber = 5, |
- kUninitialized = 7 |
- }; |
+ NumberInfo() { } |
+ static inline NumberInfo Unknown(); |
+ // We know it's a number of some sort. |
+ static inline NumberInfo Number(); |
+ // We know it's signed or unsigned 32 bit integer. |
+ static inline NumberInfo Integer32(); |
+ // We know it's a Smi. |
+ static inline NumberInfo Smi(); |
+ // We know it's a heap number. |
+ static inline NumberInfo HeapNumber(); |
+ // We haven't started collecting info yet. |
+ static inline NumberInfo Uninitialized(); |
+ |
+ // Return compact representation. Very sensitive to enum values above! |
fschneider
2010/03/05 15:01:07
above -> below
|
+ int ThreeBitRepresentation() { |
+ ASSERT(type_ != kUninitializedType); |
+ int answer = type_ > 6 ? type_ -2 : type_; |
+ ASSERT(answer >= 0); |
+ ASSERT(answer <= 7); |
+ return answer; |
+ } |
+ |
+ // Decode compact representation. Very sensitive to enum values above! |
+ static NumberInfo ExpandedRepresentation(int three_bit_representation) { |
+ Type t = static_cast<Type>(three_bit_representation >= 6 ? |
+ three_bit_representation + 2 : |
+ three_bit_representation); |
+ ASSERT(t == kUnknownType || |
+ t == kNumberType || |
+ t == kInteger32Type || |
+ t == kSmiType || |
+ t == kHeapNumberType); |
+ return NumberInfo(t); |
+ } |
+ |
+ int ToInt() { |
+ return type_; |
+ } |
+ |
+ static NumberInfo FromInt(int bit_representation) { |
+ Type t = static_cast<Type>(bit_representation); |
+ ASSERT(t == kUnknownType || |
+ t == kNumberType || |
+ t == kInteger32Type || |
+ t == kSmiType || |
+ t == kHeapNumberType); |
+ return NumberInfo(t); |
+ } |
+ |
// Return the weakest (least precise) common type. |
- static Type Combine(Type a, Type b) { |
- // Make use of the order of enum values. |
- return static_cast<Type>(a & b); |
+ static NumberInfo Combine(NumberInfo a, NumberInfo b) { |
+ return NumberInfo(static_cast<Type>(a.type_ & b.type_)); |
} |
- static bool IsNumber(Type a) { |
- ASSERT(a != kUninitialized); |
- return ((a & kNumber) != 0); |
+ inline bool IsUnknown() { |
+ return type_ == kUnknownType; |
} |
- static const char* ToString(Type a) { |
- switch (a) { |
- case kUnknown: return "UnknownType"; |
- case kNumber: return "NumberType"; |
- case kSmi: return "SmiType"; |
- case kHeapNumber: return "HeapNumberType"; |
- case kUninitialized: |
+ inline bool IsNumber() { |
+ ASSERT(type_ != kUninitializedType); |
+ return ((type_ & kNumberType) != 0); |
+ } |
+ |
+ inline bool IsSmi() { |
+ ASSERT(type_ != kUninitializedType); |
+ return ((type_ & kSmiType) == kSmiType); |
+ } |
+ |
+ inline bool IsInteger32() { |
+ ASSERT(type_ != kUninitializedType); |
+ return ((type_ & kInteger32Type) == kInteger32Type); |
+ } |
+ |
+ inline bool IsHeapNumber() { |
+ ASSERT(type_ != kUninitializedType); |
+ return ((type_ & kHeapNumberType) == kHeapNumberType); |
+ } |
+ |
+ inline bool IsUninitialized() { |
+ return type_ == kUninitializedType; |
+ } |
+ |
+ const char* ToString() { |
+ switch (type_) { |
+ case kUnknownType: return "UnknownType"; |
+ case kNumberType: return "NumberType"; |
+ case kSmiType: return "SmiType"; |
+ case kHeapNumberType: return "HeapNumberType"; |
+ case kInteger32Type: return "Integer32Type"; |
+ case kUninitializedType: |
UNREACHABLE(); |
return "UninitializedType"; |
} |
UNREACHABLE(); |
return "Unreachable code"; |
} |
+ |
+ private: |
+ enum Type { |
+ kUnknownType = 0, |
+ kNumberType = 1, |
+ kInteger32Type = 3, |
+ kSmiType = 7, |
+ kHeapNumberType = 9, |
+ kUninitializedType = 15 |
+ }; |
+ explicit inline NumberInfo(Type t) : type_(t) { } |
+ |
+ Type type_; |
}; |
+ |
+NumberInfo NumberInfo::Unknown() { return NumberInfo(kUnknownType); } |
+NumberInfo NumberInfo::Number() { return NumberInfo(kNumberType); } |
+NumberInfo NumberInfo::Integer32() { return NumberInfo(kInteger32Type); } |
+NumberInfo NumberInfo::Smi() { return NumberInfo(kSmiType); } |
+NumberInfo NumberInfo::HeapNumber() { return NumberInfo(kHeapNumberType); } |
+NumberInfo NumberInfo::Uninitialized() { return NumberInfo(kUninitializedType); } |
+ |
} } // namespace v8::internal |
#endif // V8_NUMBER_INFO_H_ |