Index: runtime/vm/thread.h |
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h |
index 4b9b9c9c6ba36d48000881410b6b9c330c8835f3..0dccea56de27e2b0e45d9c9b7c14a1a2404b8517 100644 |
--- a/runtime/vm/thread.h |
+++ b/runtime/vm/thread.h |
@@ -312,6 +312,35 @@ LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD) |
class Log* log() const; |
+ static const intptr_t kNoDeoptId = -1; |
+ static const intptr_t kDeoptIdStep = 2; |
+ static const intptr_t kDeoptIdBeforeOffset = 0; |
+ static const intptr_t kDeoptIdAfterOffset = 1; |
+ intptr_t deopt_id() const { return deopt_id_; } |
+ void set_deopt_id(int value) { |
+ ASSERT(value >= 0); |
+ deopt_id_ = value; |
+ } |
+ intptr_t GetNextDeoptId() { |
+ ASSERT(deopt_id_ != kNoDeoptId); |
+ const intptr_t id = deopt_id_; |
+ deopt_id_ += kDeoptIdStep; |
+ return id; |
+ } |
+ |
+ static intptr_t ToDeoptAfter(intptr_t deopt_id) { |
+ ASSERT(IsDeoptBefore(deopt_id)); |
+ return deopt_id + kDeoptIdAfterOffset; |
+ } |
+ |
+ static bool IsDeoptBefore(intptr_t deopt_id) { |
+ return (deopt_id % kDeoptIdStep) == kDeoptIdBeforeOffset; |
+ } |
+ |
+ static bool IsDeoptAfter(intptr_t deopt_id) { |
+ return (deopt_id % kDeoptIdStep) == kDeoptIdAfterOffset; |
+ } |
+ |
LongJumpScope* long_jump_base() const { return state_.long_jump_base; } |
void set_long_jump_base(LongJumpScope* value) { |
state_.long_jump_base = value; |
@@ -382,6 +411,7 @@ LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD) |
Mutex timeline_block_lock_; |
StoreBufferBlock* store_buffer_block_; |
class Log* log_; |
+ intptr_t deopt_id_; // Compilation specific counter. |
uword vm_tag_; |
#define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \ |
type_name member_name; |