Index: src/number-info.h |
=================================================================== |
--- src/number-info.h (revision 4249) |
+++ src/number-info.h (working copy) |
@@ -33,19 +33,23 @@ |
// Unknown |
// | |
-// Number |
-// / | |
-// HeapNumber Integer32 |
-// | | |
-// | Smi |
-// | / |
-// Uninitialized. |
+// PrimitiveType |
+// | \--------| |
+// Number String |
+// / | | |
+// HeapNumber Integer32 | |
+// | | / |
+// | Smi / |
+// | / / |
+// Uninitialized. |
class NumberInfo { |
public: |
NumberInfo() { } |
static inline NumberInfo Unknown(); |
+ // We know it's a primitive type. |
+ static inline NumberInfo Primitive(); |
// We know it's a number of some sort. |
static inline NumberInfo Number(); |
// We know it's signed or unsigned 32 bit integer. |
@@ -54,13 +58,18 @@ |
static inline NumberInfo Smi(); |
// We know it's a heap number. |
static inline NumberInfo HeapNumber(); |
+ // We know it's a string. |
+ static inline NumberInfo String(); |
// We haven't started collecting info yet. |
static inline NumberInfo Uninitialized(); |
// Return compact representation. Very sensitive to enum values below! |
+ // Compacting drops information about primtive types and strings types. |
+ // We use the compact representation when we only care about number types. |
int ThreeBitRepresentation() { |
ASSERT(type_ != kUninitializedType); |
- int answer = type_ > 6 ? type_ -2 : type_; |
+ int answer = type_ & 0xf; |
+ answer = answer > 6 ? answer - 2 : answer; |
ASSERT(answer >= 0); |
ASSERT(answer <= 7); |
return answer; |
@@ -71,6 +80,7 @@ |
Type t = static_cast<Type>(three_bit_representation >= 6 ? |
three_bit_representation + 2 : |
three_bit_representation); |
+ t = (t == kUnknownType) ? t : static_cast<Type>(t | kPrimitiveType); |
ASSERT(t == kUnknownType || |
t == kNumberType || |
t == kInteger32Type || |
@@ -86,10 +96,12 @@ |
static NumberInfo FromInt(int bit_representation) { |
Type t = static_cast<Type>(bit_representation); |
ASSERT(t == kUnknownType || |
+ t == kPrimitiveType || |
t == kNumberType || |
t == kInteger32Type || |
t == kSmiType || |
- t == kHeapNumberType); |
+ t == kHeapNumberType || |
+ t == kStringType); |
return NumberInfo(t); |
} |
@@ -129,10 +141,12 @@ |
const char* ToString() { |
switch (type_) { |
case kUnknownType: return "UnknownType"; |
+ case kPrimitiveType: return "PrimitiveType"; |
case kNumberType: return "NumberType"; |
+ case kInteger32Type: return "Integer32Type"; |
case kSmiType: return "SmiType"; |
case kHeapNumberType: return "HeapNumberType"; |
- case kInteger32Type: return "Integer32Type"; |
+ case kStringType: return "StringType"; |
case kUninitializedType: |
UNREACHABLE(); |
return "UninitializedType"; |
@@ -142,13 +156,16 @@ |
} |
private: |
+ // We use 6 bits to represent the types. |
enum Type { |
- kUnknownType = 0, |
- kNumberType = 1, |
- kInteger32Type = 3, |
- kSmiType = 7, |
- kHeapNumberType = 9, |
- kUninitializedType = 15 |
+ kUnknownType = 0, // 000000 |
+ kPrimitiveType = 0x10, // 010000 |
+ kNumberType = 0x11, // 010001 |
+ kInteger32Type = 0x13, // 010011 |
+ kSmiType = 0x17, // 010111 |
+ kHeapNumberType = 0x19, // 011001 |
+ kStringType = 0x30, // 110000 |
+ kUninitializedType = 0x3f // 111111 |
}; |
explicit inline NumberInfo(Type t) : type_(t) { } |
@@ -161,6 +178,11 @@ |
} |
+NumberInfo NumberInfo::Primitive() { |
+ return NumberInfo(kPrimitiveType); |
+} |
+ |
+ |
NumberInfo NumberInfo::Number() { |
return NumberInfo(kNumberType); |
} |
@@ -181,6 +203,11 @@ |
} |
+NumberInfo NumberInfo::String() { |
+ return NumberInfo(kStringType); |
+} |
+ |
+ |
NumberInfo NumberInfo::Uninitialized() { |
return NumberInfo(kUninitializedType); |
} |