Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index cdf9ddb515c0212cd24dd0a2446c5f6802c7f57b..f6599f5b082601a7a91a41959b46e49a89b8cec4 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -3547,6 +3547,10 @@ class ICData : public Object { |
return raw_ptr()->deopt_id_; |
} |
+ uint32_t range_feedback() const { |
+ return raw_ptr()->range_feedback_; |
+ } |
+ |
#define DEOPT_REASONS(V) \ |
V(Unknown) \ |
V(InstanceGetter) \ |
@@ -3641,6 +3645,10 @@ class ICData : public Object { |
return OFFSET_OF(RawICData, owner_); |
} |
+ static intptr_t range_feedback_offset() { |
+ return OFFSET_OF(RawICData, range_feedback_); |
+ } |
+ |
// Used for unoptimized static calls when no class-ids are checked. |
void AddTarget(const Function& target) const; |
@@ -3715,6 +3723,38 @@ class ICData : public Object { |
void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first, |
GrowableArray<intptr_t>* second) const; |
+ enum RangeFeedback { |
+ kSmiRange, kInt32Range, kUint32Range, kInt64Range |
+ }; |
+ |
+ enum { |
+ kSignBit = 1 << 0, |
+ kInt32Bit = 1 << 1, |
+ kUint32Bit = 1 << 2, |
+ kInt64Bit = 1 << 3, |
+ kBitsPerRangeFeedback = 4, |
+ kRangeFeedbackMask = (1 << kBitsPerRangeFeedback) - 1 |
+ }; |
srdjan
2014/12/15 16:39:01
I think it would be more readable to say, e.g., kI
Vyacheslav Egorov (Google)
2014/12/15 17:20:05
Done.
|
+ |
+ static const char* RangeFeedbackToString(RangeFeedback feedback) { |
+ switch (feedback) { |
+ case kSmiRange: |
+ return "smi"; |
+ case kInt32Range: |
+ return "int32"; |
+ case kUint32Range: |
+ return "uint32"; |
+ case kInt64Range: |
+ return "int64"; |
+ default: |
+ UNREACHABLE(); |
+ return "?"; |
+ } |
+ } |
+ |
+ bool HasRangeFeedback() const; |
+ RangeFeedback DecodeRangeFeedbackAt(intptr_t idx) const; |
+ |
private: |
RawArray* ic_data() const { |
return raw_ptr()->ic_data_; |
@@ -3727,6 +3767,7 @@ class ICData : public Object { |
void SetNumArgsTested(intptr_t value) const; |
void set_ic_data(const Array& value) const; |
void set_state_bits(uint32_t bits) const; |
+ void set_range_feedback(uint32_t feedback); |
enum { |
kNumArgsTestedPos = 0, |