Chromium Code Reviews| Index: src/type-info.h |
| diff --git a/src/type-info.h b/src/type-info.h |
| index 0ff99e994d913ddf4d1af2d08f3adff3130a82c2..aa36b8028fac06493ea6cf745c1ca10dbf5d1f36 100644 |
| --- a/src/type-info.h |
| +++ b/src/type-info.h |
| @@ -38,177 +38,20 @@ namespace internal { |
| const int kMaxKeyedPolymorphism = 4; |
| -// Unknown |
| -// | \____________ |
| -// | | |
| -// Primitive Non-primitive |
| -// | \_______ | |
| -// | | | |
| -// Number String | |
| -// / \ | | |
| -// Double Integer32 | / |
| -// | | / / |
| -// | Smi / / |
| -// | | / __/ |
| -// Uninitialized. |
| - |
| -class TypeInfo { |
| - public: |
| - TypeInfo() : type_(kUninitialized) { } |
| - |
| - static TypeInfo Unknown() { return TypeInfo(kUnknown); } |
| - // We know it's a primitive type. |
| - static TypeInfo Primitive() { return TypeInfo(kPrimitive); } |
| - // We know it's a number of some sort. |
| - static TypeInfo Number() { return TypeInfo(kNumber); } |
| - // We know it's a signed 32 bit integer. |
| - static TypeInfo Integer32() { return TypeInfo(kInteger32); } |
| - // We know it's a Smi. |
| - static TypeInfo Smi() { return TypeInfo(kSmi); } |
| - // We know it's a heap number. |
| - static TypeInfo Double() { return TypeInfo(kDouble); } |
| - // We know it's a string. |
| - static TypeInfo String() { return TypeInfo(kString); } |
| - // We know it's an internalized string. |
| - static TypeInfo InternalizedString() { return TypeInfo(kInternalizedString); } |
| - // We know it's a non-primitive (object) type. |
| - static TypeInfo NonPrimitive() { return TypeInfo(kNonPrimitive); } |
| - // We haven't started collecting info yet. |
| - static TypeInfo Uninitialized() { return TypeInfo(kUninitialized); } |
| - |
| - int ToInt() { |
| - return type_; |
| - } |
| - |
| - static TypeInfo FromInt(int bit_representation) { |
| - Type t = static_cast<Type>(bit_representation); |
| - ASSERT(t == kUnknown || |
| - t == kPrimitive || |
| - t == kNumber || |
| - t == kInteger32 || |
| - t == kSmi || |
| - t == kDouble || |
| - t == kString || |
| - t == kNonPrimitive); |
| - return TypeInfo(t); |
| - } |
| - |
| - // Return the weakest (least precise) common type. |
| - static TypeInfo Combine(TypeInfo a, TypeInfo b) { |
| - return TypeInfo(static_cast<Type>(a.type_ & b.type_)); |
| - } |
| - |
| - |
| - // Integer32 is an integer that can be represented as a signed |
| - // 32-bit integer. It has to be |
| - // in the range [-2^31, 2^31 - 1]. We also have to check for negative 0 |
| - // as it is not an Integer32. |
| - static inline bool IsInt32Double(double value) { |
| - const DoubleRepresentation minus_zero(-0.0); |
| - DoubleRepresentation rep(value); |
| - if (rep.bits == minus_zero.bits) return false; |
| - if (value >= kMinInt && value <= kMaxInt && |
| - value == static_cast<int32_t>(value)) { |
| - return true; |
| - } |
| - return false; |
| - } |
| - |
| - static TypeInfo FromValue(Handle<Object> value); |
| - |
| - bool Equals(const TypeInfo& other) { |
| - return type_ == other.type_; |
| - } |
| - |
| - inline bool IsUnknown() { |
| - ASSERT(type_ != kUninitialized); |
| - return type_ == kUnknown; |
| - } |
| - |
| - inline bool IsPrimitive() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kPrimitive) == kPrimitive); |
| - } |
| - |
| - inline bool IsNumber() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kNumber) == kNumber); |
| - } |
| - |
| - inline bool IsSmi() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kSmi) == kSmi); |
| - } |
| - |
| - inline bool IsInternalizedString() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kInternalizedString) == kInternalizedString); |
| - } |
| - |
| - inline bool IsNonInternalizedString() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kInternalizedString) == kString); |
| - } |
| - inline bool IsInteger32() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kInteger32) == kInteger32); |
| - } |
| - |
| - inline bool IsDouble() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kDouble) == kDouble); |
| - } |
| - |
| - inline bool IsString() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kString) == kString); |
| - } |
| - |
| - inline bool IsNonPrimitive() { |
| - ASSERT(type_ != kUninitialized); |
| - return ((type_ & kNonPrimitive) == kNonPrimitive); |
| - } |
| - |
| - inline bool IsUninitialized() { |
| - return type_ == kUninitialized; |
| - } |
| - |
| - const char* ToString() { |
| - switch (type_) { |
| - case kUnknown: return "Unknown"; |
| - case kPrimitive: return "Primitive"; |
| - case kNumber: return "Number"; |
| - case kInteger32: return "Integer32"; |
| - case kSmi: return "Smi"; |
| - case kInternalizedString: return "InternalizedString"; |
| - case kDouble: return "Double"; |
| - case kString: return "String"; |
| - case kNonPrimitive: return "Object"; |
| - case kUninitialized: return "Uninitialized"; |
| - } |
| - UNREACHABLE(); |
| - return "Unreachable code"; |
| - } |
| - |
| - private: |
| - enum Type { |
| - kUnknown = 0, // 0000000 |
| - kPrimitive = 0x10, // 0010000 |
| - kNumber = 0x11, // 0010001 |
| - kInteger32 = 0x13, // 0010011 |
| - kSmi = 0x17, // 0010111 |
| - kDouble = 0x19, // 0011001 |
| - kString = 0x30, // 0110000 |
| - kInternalizedString = 0x32, // 0110010 |
| - kNonPrimitive = 0x40, // 1000000 |
| - kUninitialized = 0x7f // 1111111 |
| - }; |
| - |
| - explicit inline TypeInfo(Type t) : type_(t) { } |
| - |
| - Type type_; |
| -}; |
| +// Integer32 is an integer that can be represented as a signed 32-bit |
| +// integer. It has to be in the range [-2^31, 2^31 - 1]. |
| +// We also have to check for negative 0 as it is not an Integer32. |
| +static inline bool IsInt32Double(double value) { |
|
rossberg
2013/12/16 09:21:13
We might consider moving this elsewhere, since it
Sven Panne
2013/12/16 09:50:40
... and perhaps refactor it to:
-----------------
Jakob Kummerow
2013/12/17 16:38:48
Done.
Jakob Kummerow
2013/12/17 16:38:48
Done.
Sven Panne
2013/12/18 07:05:11
Nope, it would exactly be the right thing: The who
|
| + const DoubleRepresentation minus_zero(-0.0); |
| + DoubleRepresentation rep(value); |
| + if (rep.bits == minus_zero.bits) return false; |
| + if (value >= kMinInt && value <= kMaxInt && |
| + value == static_cast<int32_t>(value)) { |
| + return true; |
| + } |
| + return false; |
| +} |
| enum StringStubFeedback { |