Index: runtime/vm/deopt_instructions.h |
=================================================================== |
--- runtime/vm/deopt_instructions.h (revision 10463) |
+++ runtime/vm/deopt_instructions.h (working copy) |
@@ -6,6 +6,7 @@ |
#define VM_DEOPT_INSTRUCTIONS_H_ |
#include "vm/allocation.h" |
+#include "vm/assembler.h" |
#include "vm/growable_array.h" |
#include "vm/object.h" |
@@ -14,6 +15,57 @@ |
class Location; |
class Value; |
+// Holds all data relevant for execution of deoptimization instructions. |
+class DeoptimizationContext : public ValueObject { |
+ public: |
+ // 'to_frame_start' points to the return address just below the frame's |
+ // stack pointer. 'num_args' is 0 if there are no arguments or if there |
+ // are optional arguments. |
+ DeoptimizationContext(intptr_t* to_frame_start, |
+ intptr_t to_frame_size, |
+ const Array& object_table, |
+ intptr_t num_args); |
+ |
+ intptr_t* GetFromFrameAddressAt(intptr_t index) const { |
+ ASSERT((0 <= index) && (index < from_frame_size_)); |
+ return &from_frame_[index]; |
+ } |
+ |
+ intptr_t* GetToFrameAddressAt(intptr_t index) const { |
+ ASSERT((0 <= index) && (index < to_frame_size_)); |
+ return &to_frame_[index]; |
+ } |
+ |
+ intptr_t* GetFromFpAddress() const; |
+ intptr_t* GetFromPcAddress() const; |
+ |
+ RawObject* ObjectAt(intptr_t index) const { |
+ return object_table_.At(index); |
+ } |
+ |
+ intptr_t RegisterValue(Register reg) const { |
+ return registers_copy_[reg]; |
+ } |
+ |
+ Isolate* isolate() const { return isolate_; } |
+ |
+ intptr_t from_frame_size() const { return from_frame_size_; } |
+ |
+ private: |
+ const Array& object_table_; |
+ intptr_t* to_frame_; |
+ const intptr_t to_frame_size_; |
+ intptr_t* from_frame_; |
+ intptr_t from_frame_size_; |
+ intptr_t* registers_copy_; |
+ const intptr_t num_args_; |
+ Isolate* isolate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DeoptimizationContext); |
+}; |
+ |
+ |
+ |
// Represents one deopt instruction, e.g, setup return address, store object, |
// store register, etc. The target is defined by instruction's position in |
// the deopt-info array. |
@@ -21,8 +73,14 @@ |
public: |
static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index); |
+ DeoptInstr() {} |
+ virtual ~DeoptInstr() {} |
+ |
virtual const char* ToCString() const = 0; |
+ virtual void Execute(DeoptimizationContext* deopt_context, |
+ intptr_t to_index) = 0; |
+ |
protected: |
enum Kind { |
kSetRetAddress, |
@@ -34,8 +92,6 @@ |
kSetCallerPc, |
}; |
- DeoptInstr() {} |
- |
virtual DeoptInstr::Kind kind() const = 0; |
virtual intptr_t from_index() const = 0; |