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

Unified Diff: src/number-info.h

Issue 668151: Make more use of the NumberInfo data.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 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 side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698