Index: runtime/vm/object.h |
=================================================================== |
--- runtime/vm/object.h (revision 35415) |
+++ runtime/vm/object.h (working copy) |
@@ -3180,6 +3180,42 @@ |
}; |
+#define DEOPT_REASONS(V) \ |
Ivan Posva
2014/04/25 20:59:23
I would be more comfortable if this was within a c
regis
2014/04/25 23:38:28
Done.
But I had to move class ICData before class
|
+ V(Unknown) \ |
+ V(InstanceGetter) \ |
+ V(PolymorphicInstanceCallTestFail) \ |
+ V(InstanceCallNoICData) \ |
+ V(IntegerToDouble) \ |
+ V(BinarySmiOp) \ |
+ V(BinaryMintOp) \ |
+ V(UnaryMintOp) \ |
+ V(ShiftMintOp) \ |
+ V(BinaryDoubleOp) \ |
+ V(InstanceSetter) \ |
+ V(Equality) \ |
+ V(RelationalOp) \ |
+ V(EqualityClassCheck) \ |
+ V(NoTypeFeedback) \ |
+ V(UnaryOp) \ |
+ V(UnboxInteger) \ |
+ V(CheckClass) \ |
+ V(HoistedCheckClass) \ |
+ V(CheckSmi) \ |
+ V(CheckArrayBound) \ |
+ V(AtCall) \ |
+ V(DoubleToSmi) \ |
+ V(Int32Load) \ |
+ V(Uint32Load) \ |
+ V(GuardField) \ |
+ V(NumReasons) \ |
+ |
+enum DeoptReasonId { |
+#define DEFINE_ENUM_LIST(name) kDeopt##name, |
+DEOPT_REASONS(DEFINE_ENUM_LIST) |
+#undef DEFINE_ENUM_LIST |
+}; |
+ |
+ |
class Code : public Object { |
public: |
RawInstructions* instructions() const { return raw_ptr()->instructions_; } |
@@ -3257,7 +3293,7 @@ |
return raw_ptr()->static_calls_target_table_; |
} |
- RawDeoptInfo* GetDeoptInfoAtPc(uword pc, intptr_t* deopt_reason) const; |
+ RawDeoptInfo* GetDeoptInfoAtPc(uword pc, DeoptReasonId* deopt_reason) const; |
// Returns null if there is no static call at 'pc'. |
RawFunction* GetStaticCallTargetFunctionAt(uword pc) const; |
@@ -3608,8 +3644,8 @@ |
// corresponding targets. |
class ICData : public Object { |
public: |
- RawFunction* function() const { |
- return raw_ptr()->function_; |
+ RawFunction* owner() const { |
+ return raw_ptr()->owner_; |
} |
RawString* target_name() const { |
@@ -3620,25 +3656,24 @@ |
return raw_ptr()->args_descriptor_; |
} |
- intptr_t num_args_tested() const { |
- return raw_ptr()->num_args_tested_; |
- } |
+ intptr_t NumArgsTested() const; |
intptr_t deopt_id() const { |
return raw_ptr()->deopt_id_; |
} |
- intptr_t deopt_reason() const { |
- return raw_ptr()->deopt_reason_; |
- } |
+ bool HasDeoptReasons() const { return DeoptReasons() > 0; } |
srdjan
2014/04/25 20:54:16
!= 0, since it cannot be negative.
regis
2014/04/25 23:38:28
Done.
|
+ uint32_t DeoptReasons() const; |
+ void SetDeoptReasons(uint32_t reasons) const; |
- void set_deopt_reason(intptr_t reason) const; |
+ bool HasDeoptReason(DeoptReasonId reason) const; |
+ void AddDeoptReason(DeoptReasonId reason) const; |
- bool is_closure_call() const { |
- return raw_ptr()->is_closure_call_ == 1; |
- } |
+ bool IssuedJSWarning() const; |
+ void SetIssuedJSWarning() const; |
- void set_is_closure_call(bool value) const; |
+ bool IsClosureCall() const; |
+ void SetIsClosureCall() const; |
intptr_t NumberOfChecks() const; |
@@ -3650,10 +3685,18 @@ |
return OFFSET_OF(RawICData, target_name_); |
} |
- static intptr_t num_args_tested_offset() { |
- return OFFSET_OF(RawICData, num_args_tested_); |
+ static intptr_t state_bits_offset() { |
+ return OFFSET_OF(RawICData, state_bits_); |
} |
+ static intptr_t NumArgsTestedShift() { |
+ return kNumArgsTestedBits; |
+ } |
+ |
+ static intptr_t NumArgsTestedMask() { |
+ return (1 << kNumArgsTestedSize) - 1; |
+ } |
+ |
static intptr_t arguments_descriptor_offset() { |
return OFFSET_OF(RawICData, args_descriptor_); |
} |
@@ -3662,14 +3705,10 @@ |
return OFFSET_OF(RawICData, ic_data_); |
} |
- static intptr_t function_offset() { |
- return OFFSET_OF(RawICData, function_); |
+ static intptr_t owner_offset() { |
+ return OFFSET_OF(RawICData, owner_); |
} |
- static intptr_t is_closure_call_offset() { |
- return OFFSET_OF(RawICData, is_closure_call_); |
- } |
- |
// Used for unoptimized static calls when no class-ids are checked. |
void AddTarget(const Function& target) const; |
@@ -3720,7 +3759,7 @@ |
bool HasOneTarget() const; |
bool HasReceiverClassId(intptr_t class_id) const; |
- static RawICData* New(const Function& caller_function, |
+ static RawICData* New(const Function& owner, |
const String& target_name, |
const Array& arguments_descriptor, |
intptr_t deopt_id, |
@@ -3741,13 +3780,30 @@ |
return raw_ptr()->ic_data_; |
} |
- void set_function(const Function& value) const; |
+ void set_owner(const Function& value) const; |
void set_target_name(const String& value) const; |
void set_arguments_descriptor(const Array& value) const; |
void set_deopt_id(intptr_t value) const; |
- void set_num_args_tested(intptr_t value) const; |
+ void SetNumArgsTested(intptr_t value) const; |
void set_ic_data(const Array& value) const; |
+ void set_state_bits(uint32_t bits) const; |
+ enum { |
+ kNumArgsTestedBits = 0, |
Ivan Posva
2014/04/25 20:59:23
Pos and Size?
regis
2014/04/25 23:38:28
Done.
|
+ kNumArgsTestedSize = 2, |
+ kDeoptReasonBits = kNumArgsTestedBits + kNumArgsTestedSize, |
+ kDeoptReasonSize = kDeoptNumReasons, |
+ kIssuedJSWarningBit = kDeoptReasonBits + kDeoptReasonSize, |
+ kIsClosureCallBit = kIssuedJSWarningBit + 1, |
+ }; |
+ |
+ class NumArgsTestedBits : public BitField<uint32_t, |
+ kNumArgsTestedBits, kNumArgsTestedSize> {}; // NOLINT |
+ class DeoptReasonBits : public BitField<uint32_t, |
+ kDeoptReasonBits, kDeoptReasonSize> {}; // NOLINT |
+ class IssuedJSWarningBit : public BitField<bool, kIssuedJSWarningBit, 1> {}; |
+ class IsClosureCallBit : public BitField<bool, kIsClosureCallBit, 1> {}; |
+ |
#if defined(DEBUG) |
// Used in asserts to verify that a check is not added twice. |
bool HasCheck(const GrowableArray<intptr_t>& cids) const; |