Index: runtime/vm/deopt_instructions.h |
=================================================================== |
--- runtime/vm/deopt_instructions.h (revision 28466) |
+++ runtime/vm/deopt_instructions.h (working copy) |
@@ -17,48 +17,33 @@ |
class Location; |
class Value; |
class MaterializeObjectInstr; |
+class StackFrame; |
// Holds all data relevant for execution of deoptimization instructions. |
class DeoptContext { |
public: |
- // 'num_args' is 0 if there are no arguments or if there are optional |
- // arguments. |
- DeoptContext(const Array& object_table, |
- intptr_t num_args, |
- DeoptReasonId deopt_reason); |
+ enum DestFrameOptions { |
+ kDestIsOriginalFrame, // Replace the original frame with deopt frame. |
+ kDestIsAllocated // Write deopt frame to a buffer. |
+ }; |
+ DeoptContext(const StackFrame* frame, |
+ const Code& code, |
+ DestFrameOptions dest_options, |
+ fpu_register_t* fpu_registers, |
+ intptr_t* cpu_registers); |
virtual ~DeoptContext(); |
- // Sets the sources (frame and registers) for this deoptimization. |
- // |
- // if 'frame_is_copy' is true, DeoptContext will delete the frame |
- // when it is done. |
- void SetSourceArgs(intptr_t* frame_start, |
- intptr_t frame_size, |
- fpu_register_t* fpu_registers, |
- intptr_t* cpu_registers, |
- bool frame_is_copy); |
+ // Returns the offset of the dest fp from the dest sp. Used in |
+ // runtime code to adjust the stack size before deoptimization. |
+ intptr_t DestStackAdjustment() const; |
- // Sets the destination fraem for this deoptimization. |
- // |
- // 'frame_start' oints to the fixed size portion of the frame under |
- // sp. |
- // |
- // DeoptContext does not claim ownership of the frame memory. |
- void SetDestArgs(intptr_t* frame_start, intptr_t frame_size); |
- |
intptr_t* GetSourceFrameAddressAt(intptr_t index) const { |
ASSERT(source_frame_ != NULL); |
ASSERT((0 <= index) && (index < source_frame_size_)); |
return &source_frame_[index]; |
} |
- intptr_t* GetDestFrameAddressAt(intptr_t index) const { |
- ASSERT(dest_frame_ != NULL); |
- ASSERT((0 <= index) && (index < dest_frame_size_)); |
- return &dest_frame_[index]; |
- } |
- |
intptr_t GetSourceFp() const; |
intptr_t GetSourcePp() const; |
intptr_t GetSourcePc() const; |
@@ -72,51 +57,53 @@ |
} |
intptr_t RegisterValue(Register reg) const { |
+ ASSERT(cpu_registers_ != NULL); |
return cpu_registers_[reg]; |
} |
double FpuRegisterValue(FpuRegister reg) const { |
+ ASSERT(fpu_registers_ != NULL); |
return *reinterpret_cast<double*>(&fpu_registers_[reg]); |
} |
int64_t FpuRegisterValueAsInt64(FpuRegister reg) const { |
+ ASSERT(fpu_registers_ != NULL); |
return *reinterpret_cast<int64_t*>(&fpu_registers_[reg]); |
} |
simd128_value_t FpuRegisterValueAsSimd128(FpuRegister reg) const { |
+ ASSERT(fpu_registers_ != NULL); |
const float* address = reinterpret_cast<float*>(&fpu_registers_[reg]); |
return simd128_value_t().readFrom(address); |
} |
+ void set_dest_frame(intptr_t* dest_frame) { |
+ ASSERT(dest_frame != NULL && dest_frame_ == NULL); |
+ dest_frame_ = dest_frame; |
+ } |
+ |
Isolate* isolate() const { return isolate_; } |
intptr_t source_frame_size() const { return source_frame_size_; } |
+ intptr_t dest_frame_size() const { return dest_frame_size_; } |
+ RawCode* code() const { return code_; } |
+ |
DeoptReasonId deopt_reason() const { return deopt_reason_; } |
- void VisitObjectPointers(ObjectPointerVisitor* visitor); |
+ RawDeoptInfo* deopt_info() const { return deopt_info_; } |
- void PrepareForDeferredMaterialization(intptr_t count) { |
- if (count > 0) { |
- deferred_objects_ = new DeferredObject*[count]; |
- deferred_objects_count_ = count; |
- } |
- } |
+ // Fills the destination frame but defers materialization of |
+ // objects. |
+ void FillDestFrame(); |
- DeferredObject* GetDeferredObject(intptr_t idx) const { |
- return deferred_objects_[idx]; |
- } |
+ // Materializes all deferred objects. Returns the total number of |
+ // artificial arguments used during deoptimization. |
+ intptr_t MaterializeDeferredObjects(); |
- // Sets the materialized value for some deferred object. |
- // |
- // Claims ownership of the memory for 'object'. |
- void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) { |
- deferred_objects_[idx] = object; |
- } |
+ RawArray* DestFrameAsArray(); |
- intptr_t DeferredObjectsCount() const { |
- return deferred_objects_count_; |
- } |
+ void VisitObjectPointers(ObjectPointerVisitor* visitor); |
void DeferMaterializedObjectRef(intptr_t idx, intptr_t* slot) { |
deferred_object_refs_ = new DeferredObjectRef( |
@@ -155,21 +142,48 @@ |
deferred_boxes_); |
} |
- // Materializes all deferred objects. Returns the total number of |
- // artificial arguments used during deoptimization. |
- intptr_t MaterializeDeferredObjects(); |
+ DeferredObject* GetDeferredObject(intptr_t idx) const { |
+ return deferred_objects_[idx]; |
+ } |
private: |
+ intptr_t* GetDestFrameAddressAt(intptr_t index) const { |
+ ASSERT(dest_frame_ != NULL); |
+ ASSERT((0 <= index) && (index < dest_frame_size_)); |
+ return &dest_frame_[index]; |
+ } |
+ |
+ void PrepareForDeferredMaterialization(intptr_t count) { |
+ if (count > 0) { |
+ deferred_objects_ = new DeferredObject*[count]; |
+ deferred_objects_count_ = count; |
+ } |
+ } |
+ |
+ // Sets the materialized value for some deferred object. |
+ // |
+ // Claims ownership of the memory for 'object'. |
+ void SetDeferredObjectAt(intptr_t idx, DeferredObject* object) { |
+ deferred_objects_[idx] = object; |
+ } |
+ |
+ intptr_t DeferredObjectsCount() const { |
+ return deferred_objects_count_; |
+ } |
+ |
+ RawCode* code_; |
RawArray* object_table_; |
+ RawDeoptInfo* deopt_info_; |
+ bool dest_frame_is_allocated_; |
intptr_t* dest_frame_; |
intptr_t dest_frame_size_; |
- bool source_frame_is_copy_; |
+ bool source_frame_is_allocated_; |
intptr_t* source_frame_; |
intptr_t source_frame_size_; |
intptr_t* cpu_registers_; |
fpu_register_t* fpu_registers_; |
- const intptr_t num_args_; |
- const DeoptReasonId deopt_reason_; |
+ intptr_t num_args_; |
+ DeoptReasonId deopt_reason_; |
intptr_t caller_fp_; |
Isolate* isolate_; |