| Index: runtime/vm/deopt_instructions.cc
|
| ===================================================================
|
| --- runtime/vm/deopt_instructions.cc (revision 28111)
|
| +++ runtime/vm/deopt_instructions.cc (working copy)
|
| @@ -18,71 +18,158 @@
|
| DECLARE_FLAG(bool, trace_deoptimization);
|
| DECLARE_FLAG(bool, trace_deoptimization_verbose);
|
|
|
| -DeoptimizationContext::DeoptimizationContext(intptr_t* to_frame_start,
|
| - intptr_t to_frame_size,
|
| - const Array& object_table,
|
| - intptr_t num_args,
|
| - DeoptReasonId deopt_reason)
|
| - : object_table_(object_table),
|
| - to_frame_(to_frame_start),
|
| - to_frame_size_(to_frame_size),
|
| - from_frame_(NULL),
|
| - from_frame_size_(0),
|
| - registers_copy_(NULL),
|
| - fpu_registers_copy_(NULL),
|
| +DeoptContext::DeoptContext(const Array& object_table,
|
| + intptr_t num_args,
|
| + DeoptReasonId deopt_reason)
|
| + : object_table_(object_table.raw()),
|
| + dest_frame_(NULL),
|
| + dest_frame_size_(0),
|
| + source_frame_is_copy_(false),
|
| + source_frame_(NULL),
|
| + source_frame_size_(0),
|
| + cpu_registers_(NULL),
|
| + fpu_registers_(NULL),
|
| num_args_(num_args),
|
| deopt_reason_(deopt_reason),
|
| - isolate_(Isolate::Current()) {
|
| - from_frame_ = isolate_->deopt_frame_copy();
|
| - from_frame_size_ = isolate_->deopt_frame_copy_size();
|
| - registers_copy_ = isolate_->deopt_cpu_registers_copy();
|
| - fpu_registers_copy_ = isolate_->deopt_fpu_registers_copy();
|
| - // The deoptimized frame is filled starting just below the sp of its caller
|
| - // down to kDartFrameFixedSize words below its own sp.
|
| - // The chain of frame pointers is recreated from the fp of the caller.
|
| - caller_fp_ = GetFromFp();
|
| + isolate_(Isolate::Current()),
|
| + deferred_boxes_(NULL),
|
| + deferred_object_refs_(NULL),
|
| + deferred_objects_count_(0),
|
| + deferred_objects_(NULL) {
|
| }
|
|
|
|
|
| -intptr_t DeoptimizationContext::GetFromFp() const {
|
| - return from_frame_[from_frame_size_ - 1 - num_args_ - kParamEndSlotFromFp];
|
| +DeoptContext::~DeoptContext() {
|
| + // Delete memory for source frame and registers.
|
| + if (source_frame_is_copy_) {
|
| + delete[] source_frame_;
|
| + }
|
| + source_frame_ = NULL;
|
| + delete[] fpu_registers_;
|
| + delete[] cpu_registers_;
|
| + fpu_registers_ = NULL;
|
| + cpu_registers_ = NULL;
|
| +
|
| + // Delete all deferred objects.
|
| + for (intptr_t i = 0; i < deferred_objects_count_; i++) {
|
| + delete deferred_objects_[i];
|
| + }
|
| + delete[] deferred_objects_;
|
| + deferred_objects_ = NULL;
|
| + deferred_objects_count_ = 0;
|
| }
|
|
|
|
|
| -intptr_t DeoptimizationContext::GetFromPp() const {
|
| - return from_frame_[from_frame_size_ - 1 - num_args_ - kParamEndSlotFromFp +
|
| - StackFrame::SavedCallerPpSlotFromFp()];
|
| +void DeoptContext::SetSourceArgs(intptr_t* frame_start,
|
| + intptr_t frame_size,
|
| + fpu_register_t* fpu_registers,
|
| + intptr_t* cpu_registers,
|
| + bool source_frame_is_copy) {
|
| + ASSERT(frame_start != NULL);
|
| + ASSERT(frame_size >= 0);
|
| + ASSERT(source_frame_ == NULL);
|
| + ASSERT(cpu_registers_ == NULL && fpu_registers_ == NULL);
|
| + source_frame_ = frame_start;
|
| + source_frame_size_ = frame_size;
|
| + caller_fp_ = GetSourceFp();
|
| + cpu_registers_ = cpu_registers;
|
| + fpu_registers_ = fpu_registers;
|
| + source_frame_is_copy_ = source_frame_is_copy;
|
| }
|
|
|
|
|
| -intptr_t DeoptimizationContext::GetFromPc() const {
|
| - return from_frame_[from_frame_size_ - num_args_ + kSavedPcSlotFromSp];
|
| +void DeoptContext::SetDestArgs(intptr_t* frame_start,
|
| + intptr_t frame_size) {
|
| + ASSERT(frame_start != NULL);
|
| + ASSERT(frame_size >= 0);
|
| + ASSERT(dest_frame_ == NULL);
|
| + dest_frame_ = frame_start;
|
| + dest_frame_size_ = frame_size;
|
| }
|
|
|
|
|
| -intptr_t DeoptimizationContext::GetCallerFp() const {
|
| +void DeoptContext::VisitObjectPointers(ObjectPointerVisitor* visitor) {
|
| + visitor->VisitPointer(reinterpret_cast<RawObject**>(&object_table_));
|
| +}
|
| +
|
| +
|
| +intptr_t DeoptContext::GetSourceFp() const {
|
| + return source_frame_[source_frame_size_ - 1 - num_args_ -
|
| + kParamEndSlotFromFp];
|
| +}
|
| +
|
| +
|
| +intptr_t DeoptContext::GetSourcePp() const {
|
| + return source_frame_[source_frame_size_ - 1 - num_args_ -
|
| + kParamEndSlotFromFp +
|
| + StackFrame::SavedCallerPpSlotFromFp()];
|
| +}
|
| +
|
| +
|
| +intptr_t DeoptContext::GetSourcePc() const {
|
| + return source_frame_[source_frame_size_ - num_args_ + kSavedPcSlotFromSp];
|
| +}
|
| +
|
| +
|
| +intptr_t DeoptContext::GetCallerFp() const {
|
| return caller_fp_;
|
| }
|
|
|
|
|
| -void DeoptimizationContext::SetCallerFp(intptr_t caller_fp) {
|
| +void DeoptContext::SetCallerFp(intptr_t caller_fp) {
|
| caller_fp_ = caller_fp;
|
| }
|
|
|
|
|
| +static void FillDeferredSlots(DeferredSlot** slot_list) {
|
| + DeferredSlot* slot = *slot_list;
|
| + *slot_list = NULL;
|
| +
|
| + while (slot != NULL) {
|
| + DeferredSlot* current = slot;
|
| + slot = slot->next();
|
| +
|
| + current->Materialize();
|
| +
|
| + delete current;
|
| + }
|
| +}
|
| +
|
| +
|
| +// Materializes all deferred objects. Returns the total number of
|
| +// artificial arguments used during deoptimization.
|
| +intptr_t DeoptContext::MaterializeDeferredObjects() {
|
| + // First materialize all unboxed "primitive" values (doubles, mints, simd)
|
| + // then materialize objects. The order is important: objects might be
|
| + // referencing boxes allocated on the first step. At the same time
|
| + // objects can't be referencing other deferred objects because storing
|
| + // an object into a field is always conservatively treated as escaping by
|
| + // allocation sinking and load forwarding.
|
| + FillDeferredSlots(&deferred_boxes_);
|
| + FillDeferredSlots(&deferred_object_refs_);
|
| +
|
| + // Compute total number of artificial arguments used during deoptimization.
|
| + intptr_t deopt_arguments = 0;
|
| + for (intptr_t i = 0; i < DeferredObjectsCount(); i++) {
|
| + deopt_arguments += GetDeferredObject(i)->ArgumentCount();
|
| + }
|
| + return deopt_arguments;
|
| +}
|
| +
|
| +
|
| // Deoptimization instruction moving value from optimized frame at
|
| -// 'from_index' to specified slots in the unoptimized frame.
|
| -// 'from_index' represents the slot index of the frame (0 being first argument)
|
| -// and accounts for saved return address, frame pointer, pool pointer and pc
|
| -// marker.
|
| +// 'source_index' to specified slots in the unoptimized frame.
|
| +// 'source_index' represents the slot index of the frame (0 being
|
| +// first argument) and accounts for saved return address, frame
|
| +// pointer, pool pointer and pc marker.
|
| class DeoptStackSlotInstr : public DeoptInstr {
|
| public:
|
| - explicit DeoptStackSlotInstr(intptr_t from_index)
|
| - : stack_slot_index_(from_index) {
|
| + explicit DeoptStackSlotInstr(intptr_t source_index)
|
| + : stack_slot_index_(source_index) {
|
| ASSERT(stack_slot_index_ >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return stack_slot_index_; }
|
| + virtual intptr_t source_index() const { return stack_slot_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kStackSlot; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -90,11 +177,12 @@
|
| "s%" Pd "", stack_slot_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - intptr_t from_index =
|
| - deopt_context->from_frame_size() - stack_slot_index_ - 1;
|
| - intptr_t* from_addr = deopt_context->GetFromFrameAddressAt(from_index);
|
| - *to_addr = *from_addr;
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + intptr_t source_index =
|
| + deopt_context->source_frame_size() - stack_slot_index_ - 1;
|
| + intptr_t* source_addr =
|
| + deopt_context->GetSourceFrameAddressAt(source_index);
|
| + *dest_addr = *source_addr;
|
| }
|
|
|
| private:
|
| @@ -106,12 +194,12 @@
|
|
|
| class DeoptDoubleStackSlotInstr : public DeoptInstr {
|
| public:
|
| - explicit DeoptDoubleStackSlotInstr(intptr_t from_index)
|
| - : stack_slot_index_(from_index) {
|
| + explicit DeoptDoubleStackSlotInstr(intptr_t source_index)
|
| + : stack_slot_index_(source_index) {
|
| ASSERT(stack_slot_index_ >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return stack_slot_index_; }
|
| + virtual intptr_t source_index() const { return stack_slot_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kDoubleStackSlot; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -119,14 +207,14 @@
|
| "ds%" Pd "", stack_slot_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - intptr_t from_index =
|
| - deopt_context->from_frame_size() - stack_slot_index_ - 1;
|
| - double* from_addr = reinterpret_cast<double*>(
|
| - deopt_context->GetFromFrameAddressAt(from_index));
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferDoubleMaterialization(
|
| - *from_addr, reinterpret_cast<RawDouble**>(to_addr));
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + intptr_t source_index =
|
| + deopt_context->source_frame_size() - stack_slot_index_ - 1;
|
| + double* source_addr = reinterpret_cast<double*>(
|
| + deopt_context->GetSourceFrameAddressAt(source_index));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferDoubleMaterialization(
|
| + *source_addr, reinterpret_cast<RawDouble**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -138,12 +226,12 @@
|
|
|
| class DeoptInt64StackSlotInstr : public DeoptInstr {
|
| public:
|
| - explicit DeoptInt64StackSlotInstr(intptr_t from_index)
|
| - : stack_slot_index_(from_index) {
|
| + explicit DeoptInt64StackSlotInstr(intptr_t source_index)
|
| + : stack_slot_index_(source_index) {
|
| ASSERT(stack_slot_index_ >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return stack_slot_index_; }
|
| + virtual intptr_t source_index() const { return stack_slot_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kInt64StackSlot; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -151,18 +239,18 @@
|
| "ms%" Pd "", stack_slot_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - intptr_t from_index =
|
| - deopt_context->from_frame_size() - stack_slot_index_ - 1;
|
| - int64_t* from_addr = reinterpret_cast<int64_t*>(
|
| - deopt_context->GetFromFrameAddressAt(from_index));
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - if (Smi::IsValid64(*from_addr)) {
|
| - *to_addr = reinterpret_cast<intptr_t>(
|
| - Smi::New(static_cast<intptr_t>(*from_addr)));
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + intptr_t source_index =
|
| + deopt_context->source_frame_size() - stack_slot_index_ - 1;
|
| + int64_t* source_addr = reinterpret_cast<int64_t*>(
|
| + deopt_context->GetSourceFrameAddressAt(source_index));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + if (Smi::IsValid64(*source_addr)) {
|
| + *dest_addr = reinterpret_cast<intptr_t>(
|
| + Smi::New(static_cast<intptr_t>(*source_addr)));
|
| } else {
|
| - Isolate::Current()->DeferMintMaterialization(
|
| - *from_addr, reinterpret_cast<RawMint**>(to_addr));
|
| + deopt_context->DeferMintMaterialization(
|
| + *source_addr, reinterpret_cast<RawMint**>(dest_addr));
|
| }
|
| }
|
|
|
| @@ -175,12 +263,12 @@
|
|
|
| class DeoptFloat32x4StackSlotInstr : public DeoptInstr {
|
| public:
|
| - explicit DeoptFloat32x4StackSlotInstr(intptr_t from_index)
|
| - : stack_slot_index_(from_index) {
|
| + explicit DeoptFloat32x4StackSlotInstr(intptr_t source_index)
|
| + : stack_slot_index_(source_index) {
|
| ASSERT(stack_slot_index_ >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return stack_slot_index_; }
|
| + virtual intptr_t source_index() const { return stack_slot_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kFloat32x4StackSlot; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -188,14 +276,14 @@
|
| "f32x4s%" Pd "", stack_slot_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - intptr_t from_index =
|
| - deopt_context->from_frame_size() - stack_slot_index_ - 1;
|
| - simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>(
|
| - deopt_context->GetFromFrameAddressAt(from_index));
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferFloat32x4Materialization(
|
| - *from_addr, reinterpret_cast<RawFloat32x4**>(to_addr));
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + intptr_t source_index =
|
| + deopt_context->source_frame_size() - stack_slot_index_ - 1;
|
| + simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
|
| + deopt_context->GetSourceFrameAddressAt(source_index));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferFloat32x4Materialization(
|
| + *source_addr, reinterpret_cast<RawFloat32x4**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -207,12 +295,12 @@
|
|
|
| class DeoptUint32x4StackSlotInstr : public DeoptInstr {
|
| public:
|
| - explicit DeoptUint32x4StackSlotInstr(intptr_t from_index)
|
| - : stack_slot_index_(from_index) {
|
| + explicit DeoptUint32x4StackSlotInstr(intptr_t source_index)
|
| + : stack_slot_index_(source_index) {
|
| ASSERT(stack_slot_index_ >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return stack_slot_index_; }
|
| + virtual intptr_t source_index() const { return stack_slot_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kUint32x4StackSlot; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -220,14 +308,14 @@
|
| "ui32x4s%" Pd "", stack_slot_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - intptr_t from_index =
|
| - deopt_context->from_frame_size() - stack_slot_index_ - 1;
|
| - simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>(
|
| - deopt_context->GetFromFrameAddressAt(from_index));
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferUint32x4Materialization(
|
| - *from_addr, reinterpret_cast<RawUint32x4**>(to_addr));
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + intptr_t source_index =
|
| + deopt_context->source_frame_size() - stack_slot_index_ - 1;
|
| + simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
|
| + deopt_context->GetSourceFrameAddressAt(source_index));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferUint32x4Materialization(
|
| + *source_addr, reinterpret_cast<RawUint32x4**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -247,12 +335,12 @@
|
| ASSERT(deopt_id >= 0);
|
| }
|
|
|
| - explicit DeoptRetAddressInstr(intptr_t from_index)
|
| - : object_table_index_(ObjectTableIndex::decode(from_index)),
|
| - deopt_id_(DeoptId::decode(from_index)) {
|
| + explicit DeoptRetAddressInstr(intptr_t source_index)
|
| + : object_table_index_(ObjectTableIndex::decode(source_index)),
|
| + deopt_id_(DeoptId::decode(source_index)) {
|
| }
|
|
|
| - virtual intptr_t from_index() const {
|
| + virtual intptr_t source_index() const {
|
| return ObjectTableIndex::encode(object_table_index_) |
|
| DeoptId::encode(deopt_id_);
|
| }
|
| @@ -264,7 +352,7 @@
|
| "ret oti:%" Pd "(%" Pd ")", object_table_index_, deopt_id_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| Function& function = Function::Handle(deopt_context->isolate());
|
| function ^= deopt_context->ObjectAt(object_table_index_);
|
| const Code& code =
|
| @@ -273,7 +361,7 @@
|
| uword continue_at_pc = code.GetPcForDeoptId(deopt_id_,
|
| PcDescriptors::kDeopt);
|
| ASSERT(continue_at_pc != 0);
|
| - *to_addr = continue_at_pc;
|
| + *dest_addr = continue_at_pc;
|
|
|
| uword pc = code.GetPcForDeoptId(deopt_id_, PcDescriptors::kIcCall);
|
| if (pc != 0) {
|
| @@ -310,7 +398,7 @@
|
| ASSERT(object_table_index >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return object_table_index_; }
|
| + virtual intptr_t source_index() const { return object_table_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kConstant; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -318,10 +406,10 @@
|
| "const oti:%" Pd "", object_table_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| const Object& obj = Object::Handle(
|
| deopt_context->isolate(), deopt_context->ObjectAt(object_table_index_));
|
| - *reinterpret_cast<RawObject**>(to_addr) = obj.raw();
|
| + *reinterpret_cast<RawObject**>(dest_addr) = obj.raw();
|
| }
|
|
|
| private:
|
| @@ -337,15 +425,15 @@
|
| explicit DeoptRegisterInstr(intptr_t reg_as_int)
|
| : reg_(static_cast<Register>(reg_as_int)) {}
|
|
|
| - virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
|
| + virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
|
| virtual DeoptInstr::Kind kind() const { return kRegister; }
|
|
|
| virtual const char* ToCString() const {
|
| return Assembler::RegisterName(reg_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - *to_addr = deopt_context->RegisterValue(reg_);
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + *dest_addr = deopt_context->RegisterValue(reg_);
|
| }
|
|
|
| private:
|
| @@ -361,18 +449,18 @@
|
| explicit DeoptFpuRegisterInstr(intptr_t reg_as_int)
|
| : reg_(static_cast<FpuRegister>(reg_as_int)) {}
|
|
|
| - virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
|
| + virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
|
| virtual DeoptInstr::Kind kind() const { return kFpuRegister; }
|
|
|
| virtual const char* ToCString() const {
|
| return Assembler::FpuRegisterName(reg_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| double value = deopt_context->FpuRegisterValue(reg_);
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferDoubleMaterialization(
|
| - value, reinterpret_cast<RawDouble**>(to_addr));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferDoubleMaterialization(
|
| + value, reinterpret_cast<RawDouble**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -387,7 +475,7 @@
|
| explicit DeoptInt64FpuRegisterInstr(intptr_t reg_as_int)
|
| : reg_(static_cast<FpuRegister>(reg_as_int)) {}
|
|
|
| - virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
|
| + virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
|
| virtual DeoptInstr::Kind kind() const { return kInt64FpuRegister; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -395,15 +483,15 @@
|
| "%s(m)", Assembler::FpuRegisterName(reg_));
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| int64_t value = deopt_context->FpuRegisterValueAsInt64(reg_);
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| if (Smi::IsValid64(value)) {
|
| - *to_addr = reinterpret_cast<intptr_t>(
|
| + *dest_addr = reinterpret_cast<intptr_t>(
|
| Smi::New(static_cast<intptr_t>(value)));
|
| } else {
|
| - Isolate::Current()->DeferMintMaterialization(
|
| - value, reinterpret_cast<RawMint**>(to_addr));
|
| + deopt_context->DeferMintMaterialization(
|
| + value, reinterpret_cast<RawMint**>(dest_addr));
|
| }
|
| }
|
|
|
| @@ -420,7 +508,7 @@
|
| explicit DeoptFloat32x4FpuRegisterInstr(intptr_t reg_as_int)
|
| : reg_(static_cast<FpuRegister>(reg_as_int)) {}
|
|
|
| - virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
|
| + virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
|
| virtual DeoptInstr::Kind kind() const { return kFloat32x4FpuRegister; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -428,11 +516,11 @@
|
| "%s(f32x4)", Assembler::FpuRegisterName(reg_));
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferFloat32x4Materialization(
|
| - value, reinterpret_cast<RawFloat32x4**>(to_addr));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferFloat32x4Materialization(
|
| + value, reinterpret_cast<RawFloat32x4**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -448,7 +536,7 @@
|
| explicit DeoptUint32x4FpuRegisterInstr(intptr_t reg_as_int)
|
| : reg_(static_cast<FpuRegister>(reg_as_int)) {}
|
|
|
| - virtual intptr_t from_index() const { return static_cast<intptr_t>(reg_); }
|
| + virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
|
| virtual DeoptInstr::Kind kind() const { return kUint32x4FpuRegister; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -456,11 +544,11 @@
|
| "%s(f32x4)", Assembler::FpuRegisterName(reg_));
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferUint32x4Materialization(
|
| - value, reinterpret_cast<RawUint32x4**>(to_addr));
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferUint32x4Materialization(
|
| + value, reinterpret_cast<RawUint32x4**>(dest_addr));
|
| }
|
|
|
| private:
|
| @@ -479,7 +567,7 @@
|
| ASSERT(object_table_index >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return object_table_index_; }
|
| + virtual intptr_t source_index() const { return object_table_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kPcMarker; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -487,12 +575,12 @@
|
| "pcmark oti:%" Pd "", object_table_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| Function& function = Function::Handle(deopt_context->isolate());
|
| function ^= deopt_context->ObjectAt(object_table_index_);
|
| if (function.IsNull()) {
|
| // Callee's PC marker is not used (pc of Deoptimize stub). Set to 0.
|
| - *to_addr = 0;
|
| + *dest_addr = 0;
|
| return;
|
| }
|
| const Code& code =
|
| @@ -500,7 +588,7 @@
|
| ASSERT(!code.IsNull());
|
| const intptr_t pc_marker =
|
| code.EntryPoint() + Assembler::kEntryPointToPcMarkerOffset;
|
| - *to_addr = pc_marker;
|
| + *dest_addr = pc_marker;
|
| // Increment the deoptimization counter. This effectively increments each
|
| // function occurring in the optimized frame.
|
| function.set_deoptimization_counter(function.deoptimization_counter() + 1);
|
| @@ -531,7 +619,7 @@
|
| ASSERT(object_table_index >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return object_table_index_; }
|
| + virtual intptr_t source_index() const { return object_table_index_; }
|
| virtual DeoptInstr::Kind kind() const { return kPp; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -539,14 +627,14 @@
|
| "pp oti:%" Pd "", object_table_index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| Function& function = Function::Handle(deopt_context->isolate());
|
| function ^= deopt_context->ObjectAt(object_table_index_);
|
| const Code& code =
|
| Code::Handle(deopt_context->isolate(), function.unoptimized_code());
|
| ASSERT(!code.IsNull());
|
| const intptr_t pp = reinterpret_cast<intptr_t>(code.ObjectPool());
|
| - *to_addr = pp;
|
| + *dest_addr = pp;
|
| }
|
|
|
| private:
|
| @@ -561,17 +649,17 @@
|
| public:
|
| DeoptCallerFpInstr() {}
|
|
|
| - virtual intptr_t from_index() const { return 0; }
|
| + virtual intptr_t source_index() const { return 0; }
|
| virtual DeoptInstr::Kind kind() const { return kCallerFp; }
|
|
|
| virtual const char* ToCString() const {
|
| return "callerfp";
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - *to_addr = deopt_context->GetCallerFp();
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + *dest_addr = deopt_context->GetCallerFp();
|
| deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(
|
| - to_addr - (kSavedCallerFpSlotFromFp * kWordSize)));
|
| + dest_addr - (kSavedCallerFpSlotFromFp * kWordSize)));
|
| }
|
|
|
| private:
|
| @@ -584,15 +672,15 @@
|
| public:
|
| DeoptCallerPpInstr() {}
|
|
|
| - virtual intptr_t from_index() const { return 0; }
|
| + virtual intptr_t source_index() const { return 0; }
|
| virtual DeoptInstr::Kind kind() const { return kCallerPp; }
|
|
|
| virtual const char* ToCString() const {
|
| return "callerpp";
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - *to_addr = deopt_context->GetFromPp();
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + *dest_addr = deopt_context->GetSourcePp();
|
| }
|
|
|
| private:
|
| @@ -606,15 +694,15 @@
|
| public:
|
| DeoptCallerPcInstr() {}
|
|
|
| - virtual intptr_t from_index() const { return 0; }
|
| + virtual intptr_t source_index() const { return 0; }
|
| virtual DeoptInstr::Kind kind() const { return kCallerPc; }
|
|
|
| virtual const char* ToCString() const {
|
| return "callerpc";
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - *to_addr = deopt_context->GetFromPc();
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + *dest_addr = deopt_context->GetSourcePc();
|
| }
|
|
|
| private:
|
| @@ -634,12 +722,12 @@
|
| ASSERT(suffix_length >= 0);
|
| }
|
|
|
| - explicit DeoptSuffixInstr(intptr_t from_index)
|
| - : info_number_(InfoNumber::decode(from_index)),
|
| - suffix_length_(SuffixLength::decode(from_index)) {
|
| + explicit DeoptSuffixInstr(intptr_t source_index)
|
| + : info_number_(InfoNumber::decode(source_index)),
|
| + suffix_length_(SuffixLength::decode(source_index)) {
|
| }
|
|
|
| - virtual intptr_t from_index() const {
|
| + virtual intptr_t source_index() const {
|
| return InfoNumber::encode(info_number_) |
|
| SuffixLength::encode(suffix_length_);
|
| }
|
| @@ -650,7 +738,7 @@
|
| "suffix %" Pd ":%" Pd, info_number_, suffix_length_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| // The deoptimization info is uncompressed by translating away suffixes
|
| // before executing the instructions.
|
| UNREACHABLE();
|
| @@ -681,7 +769,7 @@
|
| ASSERT(index >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return index_; }
|
| + virtual intptr_t source_index() const { return index_; }
|
| virtual DeoptInstr::Kind kind() const { return kMaterializedObjectRef; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -689,10 +777,10 @@
|
| "mat ref #%" Pd "", index_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| - *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0);
|
| - Isolate::Current()->DeferMaterializedObjectRef(
|
| - index_, to_addr);
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| + *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
|
| + deopt_context->DeferMaterializedObjectRef(
|
| + index_, dest_addr);
|
| }
|
|
|
| private:
|
| @@ -712,7 +800,7 @@
|
| ASSERT(field_count >= 0);
|
| }
|
|
|
| - virtual intptr_t from_index() const { return field_count_; }
|
| + virtual intptr_t source_index() const { return field_count_; }
|
| virtual DeoptInstr::Kind kind() const { return kMaterializeObject; }
|
|
|
| virtual const char* ToCString() const {
|
| @@ -720,7 +808,7 @@
|
| "mat obj len:%" Pd "", field_count_);
|
| }
|
|
|
| - void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) {
|
| + void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
|
| // This instructions are executed manually by the DeoptimizeWithDeoptInfo.
|
| UNREACHABLE();
|
| }
|
| @@ -732,9 +820,10 @@
|
| };
|
|
|
|
|
| -intptr_t DeoptInstr::DecodeSuffix(intptr_t from_index, intptr_t* info_number) {
|
| - *info_number = DeoptSuffixInstr::InfoNumber::decode(from_index);
|
| - return DeoptSuffixInstr::SuffixLength::decode(from_index);
|
| +intptr_t DeoptInstr::DecodeSuffix(intptr_t source_index,
|
| + intptr_t* info_number) {
|
| + *info_number = DeoptSuffixInstr::InfoNumber::decode(source_index);
|
| + return DeoptSuffixInstr::SuffixLength::decode(source_index);
|
| }
|
|
|
|
|
| @@ -759,34 +848,35 @@
|
| }
|
|
|
|
|
| -DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) {
|
| +DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t source_index) {
|
| Kind kind = static_cast<Kind>(kind_as_int);
|
| switch (kind) {
|
| - case kStackSlot: return new DeoptStackSlotInstr(from_index);
|
| - case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(from_index);
|
| - case kInt64StackSlot: return new DeoptInt64StackSlotInstr(from_index);
|
| + case kStackSlot: return new DeoptStackSlotInstr(source_index);
|
| + case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(source_index);
|
| + case kInt64StackSlot: return new DeoptInt64StackSlotInstr(source_index);
|
| case kFloat32x4StackSlot:
|
| - return new DeoptFloat32x4StackSlotInstr(from_index);
|
| + return new DeoptFloat32x4StackSlotInstr(source_index);
|
| case kUint32x4StackSlot:
|
| - return new DeoptUint32x4StackSlotInstr(from_index);
|
| - case kRetAddress: return new DeoptRetAddressInstr(from_index);
|
| - case kConstant: return new DeoptConstantInstr(from_index);
|
| - case kRegister: return new DeoptRegisterInstr(from_index);
|
| - case kFpuRegister: return new DeoptFpuRegisterInstr(from_index);
|
| - case kInt64FpuRegister: return new DeoptInt64FpuRegisterInstr(from_index);
|
| + return new DeoptUint32x4StackSlotInstr(source_index);
|
| + case kRetAddress: return new DeoptRetAddressInstr(source_index);
|
| + case kConstant: return new DeoptConstantInstr(source_index);
|
| + case kRegister: return new DeoptRegisterInstr(source_index);
|
| + case kFpuRegister: return new DeoptFpuRegisterInstr(source_index);
|
| + case kInt64FpuRegister: return new DeoptInt64FpuRegisterInstr(source_index);
|
| case kFloat32x4FpuRegister:
|
| - return new DeoptFloat32x4FpuRegisterInstr(from_index);
|
| + return new DeoptFloat32x4FpuRegisterInstr(source_index);
|
| case kUint32x4FpuRegister:
|
| - return new DeoptUint32x4FpuRegisterInstr(from_index);
|
| - case kPcMarker: return new DeoptPcMarkerInstr(from_index);
|
| - case kPp: return new DeoptPpInstr(from_index);
|
| + return new DeoptUint32x4FpuRegisterInstr(source_index);
|
| + case kPcMarker: return new DeoptPcMarkerInstr(source_index);
|
| + case kPp: return new DeoptPpInstr(source_index);
|
| case kCallerFp: return new DeoptCallerFpInstr();
|
| case kCallerPp: return new DeoptCallerPpInstr();
|
| case kCallerPc: return new DeoptCallerPcInstr();
|
| - case kSuffix: return new DeoptSuffixInstr(from_index);
|
| + case kSuffix: return new DeoptSuffixInstr(source_index);
|
| case kMaterializedObjectRef:
|
| - return new DeoptMaterializedObjectRefInstr(from_index);
|
| - case kMaterializeObject: return new DeoptMaterializeObjectInstr(from_index);
|
| + return new DeoptMaterializedObjectRefInstr(source_index);
|
| + case kMaterializeObject:
|
| + return new DeoptMaterializeObjectInstr(source_index);
|
| }
|
| UNREACHABLE();
|
| return NULL;
|
| @@ -850,16 +940,17 @@
|
| }
|
|
|
|
|
| -intptr_t DeoptInfoBuilder::CalculateStackIndex(const Location& from_loc) const {
|
| - return from_loc.stack_index() < 0 ?
|
| - from_loc.stack_index() + num_args_ :
|
| - from_loc.stack_index() + num_args_ + kDartFrameFixedSize;
|
| +intptr_t DeoptInfoBuilder::CalculateStackIndex(
|
| + const Location& source_loc) const {
|
| + return source_loc.stack_index() < 0 ?
|
| + source_loc.stack_index() + num_args_ :
|
| + source_loc.stack_index() + num_args_ + kDartFrameFixedSize;
|
| }
|
|
|
|
|
| void DeoptInfoBuilder::AddReturnAddress(const Function& function,
|
| intptr_t deopt_id,
|
| - intptr_t to_index) {
|
| + intptr_t dest_index) {
|
| // Check that deopt_id exists.
|
| // TODO(vegorov): verify after deoptimization targets as well.
|
| #ifdef DEBUG
|
| @@ -868,68 +959,68 @@
|
| (code.GetPcForDeoptId(deopt_id, PcDescriptors::kDeopt) != 0));
|
| #endif
|
| const intptr_t object_table_index = FindOrAddObjectInTable(function);
|
| - ASSERT(to_index == FrameSize());
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptRetAddressInstr(object_table_index, deopt_id));
|
| }
|
|
|
|
|
| void DeoptInfoBuilder::AddPcMarker(const Function& function,
|
| - intptr_t to_index) {
|
| + intptr_t dest_index) {
|
| intptr_t object_table_index = FindOrAddObjectInTable(function);
|
| - ASSERT(to_index == FrameSize());
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptPcMarkerInstr(object_table_index));
|
| }
|
|
|
|
|
| -void DeoptInfoBuilder::AddPp(const Function& function, intptr_t to_index) {
|
| +void DeoptInfoBuilder::AddPp(const Function& function, intptr_t dest_index) {
|
| intptr_t object_table_index = FindOrAddObjectInTable(function);
|
| - ASSERT(to_index == FrameSize());
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptPpInstr(object_table_index));
|
| }
|
|
|
|
|
| void DeoptInfoBuilder::AddCopy(Value* value,
|
| - const Location& from_loc,
|
| - const intptr_t to_index) {
|
| + const Location& source_loc,
|
| + const intptr_t dest_index) {
|
| DeoptInstr* deopt_instr = NULL;
|
| - if (from_loc.IsConstant()) {
|
| - intptr_t object_table_index = FindOrAddObjectInTable(from_loc.constant());
|
| + if (source_loc.IsConstant()) {
|
| + intptr_t object_table_index = FindOrAddObjectInTable(source_loc.constant());
|
| deopt_instr = new DeoptConstantInstr(object_table_index);
|
| - } else if (from_loc.IsRegister()) {
|
| + } else if (source_loc.IsRegister()) {
|
| ASSERT(value->definition()->representation() == kTagged);
|
| - deopt_instr = new DeoptRegisterInstr(from_loc.reg());
|
| - } else if (from_loc.IsFpuRegister()) {
|
| + deopt_instr = new DeoptRegisterInstr(source_loc.reg());
|
| + } else if (source_loc.IsFpuRegister()) {
|
| if (value->definition()->representation() == kUnboxedDouble) {
|
| - deopt_instr = new DeoptFpuRegisterInstr(from_loc.fpu_reg());
|
| + deopt_instr = new DeoptFpuRegisterInstr(source_loc.fpu_reg());
|
| } else if (value->definition()->representation() == kUnboxedMint) {
|
| - deopt_instr = new DeoptInt64FpuRegisterInstr(from_loc.fpu_reg());
|
| + deopt_instr = new DeoptInt64FpuRegisterInstr(source_loc.fpu_reg());
|
| } else if (value->definition()->representation() == kUnboxedFloat32x4) {
|
| - deopt_instr = new DeoptFloat32x4FpuRegisterInstr(from_loc.fpu_reg());
|
| + deopt_instr = new DeoptFloat32x4FpuRegisterInstr(source_loc.fpu_reg());
|
| } else {
|
| ASSERT(value->definition()->representation() == kUnboxedUint32x4);
|
| - deopt_instr = new DeoptUint32x4FpuRegisterInstr(from_loc.fpu_reg());
|
| + deopt_instr = new DeoptUint32x4FpuRegisterInstr(source_loc.fpu_reg());
|
| }
|
| - } else if (from_loc.IsStackSlot()) {
|
| + } else if (source_loc.IsStackSlot()) {
|
| ASSERT(value->definition()->representation() == kTagged);
|
| - intptr_t from_index = CalculateStackIndex(from_loc);
|
| - deopt_instr = new DeoptStackSlotInstr(from_index);
|
| - } else if (from_loc.IsDoubleStackSlot()) {
|
| - intptr_t from_index = CalculateStackIndex(from_loc);
|
| + intptr_t source_index = CalculateStackIndex(source_loc);
|
| + deopt_instr = new DeoptStackSlotInstr(source_index);
|
| + } else if (source_loc.IsDoubleStackSlot()) {
|
| + intptr_t source_index = CalculateStackIndex(source_loc);
|
| if (value->definition()->representation() == kUnboxedDouble) {
|
| - deopt_instr = new DeoptDoubleStackSlotInstr(from_index);
|
| + deopt_instr = new DeoptDoubleStackSlotInstr(source_index);
|
| } else {
|
| ASSERT(value->definition()->representation() == kUnboxedMint);
|
| - deopt_instr = new DeoptInt64StackSlotInstr(from_index);
|
| + deopt_instr = new DeoptInt64StackSlotInstr(source_index);
|
| }
|
| - } else if (from_loc.IsQuadStackSlot()) {
|
| - intptr_t from_index = CalculateStackIndex(from_loc);
|
| + } else if (source_loc.IsQuadStackSlot()) {
|
| + intptr_t source_index = CalculateStackIndex(source_loc);
|
| if (value->definition()->representation() == kUnboxedFloat32x4) {
|
| - deopt_instr = new DeoptFloat32x4StackSlotInstr(from_index);
|
| + deopt_instr = new DeoptFloat32x4StackSlotInstr(source_index);
|
| } else {
|
| ASSERT(value->definition()->representation() == kUnboxedUint32x4);
|
| - deopt_instr = new DeoptUint32x4StackSlotInstr(from_index);
|
| + deopt_instr = new DeoptUint32x4StackSlotInstr(source_index);
|
| }
|
| - } else if (from_loc.IsInvalid() &&
|
| + } else if (source_loc.IsInvalid() &&
|
| value->definition()->IsMaterializeObject()) {
|
| const intptr_t index = FindMaterialization(
|
| value->definition()->AsMaterializeObject());
|
| @@ -938,32 +1029,32 @@
|
| } else {
|
| UNREACHABLE();
|
| }
|
| - ASSERT(to_index == FrameSize());
|
| + ASSERT(dest_index == FrameSize());
|
| ASSERT(deopt_instr != NULL);
|
| instructions_.Add(deopt_instr);
|
| }
|
|
|
|
|
| -void DeoptInfoBuilder::AddCallerFp(intptr_t to_index) {
|
| - ASSERT(to_index == FrameSize());
|
| +void DeoptInfoBuilder::AddCallerFp(intptr_t dest_index) {
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptCallerFpInstr());
|
| }
|
|
|
|
|
| -void DeoptInfoBuilder::AddCallerPp(intptr_t to_index) {
|
| - ASSERT(to_index == FrameSize());
|
| +void DeoptInfoBuilder::AddCallerPp(intptr_t dest_index) {
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptCallerPpInstr());
|
| }
|
|
|
|
|
| -void DeoptInfoBuilder::AddCallerPc(intptr_t to_index) {
|
| - ASSERT(to_index == FrameSize());
|
| +void DeoptInfoBuilder::AddCallerPc(intptr_t dest_index) {
|
| + ASSERT(dest_index == FrameSize());
|
| instructions_.Add(new DeoptCallerPcInstr());
|
| }
|
|
|
|
|
| -void DeoptInfoBuilder::AddConstant(const Object& obj, intptr_t to_index) {
|
| - ASSERT(to_index == FrameSize());
|
| +void DeoptInfoBuilder::AddConstant(const Object& obj, intptr_t dest_index) {
|
| + ASSERT(dest_index == FrameSize());
|
| intptr_t object_table_index = FindOrAddObjectInTable(obj);
|
| instructions_.Add(new DeoptConstantInstr(object_table_index));
|
| }
|
| @@ -990,20 +1081,21 @@
|
| }
|
|
|
|
|
| -intptr_t DeoptInfoBuilder::EmitMaterializationArguments(intptr_t to_index) {
|
| - ASSERT(to_index == kDartFrameFixedSize);
|
| +intptr_t DeoptInfoBuilder::EmitMaterializationArguments(intptr_t dest_index) {
|
| + ASSERT(dest_index == kDartFrameFixedSize);
|
| for (intptr_t i = 0; i < materializations_.length(); i++) {
|
| MaterializeObjectInstr* mat = materializations_[i];
|
| - AddConstant(mat->cls(), to_index++); // Class of the instance to allocate.
|
| + // Class of the instance to allocate.
|
| + AddConstant(mat->cls(), dest_index++);
|
| for (intptr_t i = 0; i < mat->InputCount(); i++) {
|
| if (!mat->InputAt(i)->BindsToConstantNull()) {
|
| // Emit field-value pair.
|
| - AddConstant(mat->FieldAt(i), to_index++);
|
| - AddCopy(mat->InputAt(i), mat->LocationAt(i), to_index++);
|
| + AddConstant(mat->FieldAt(i), dest_index++);
|
| + AddCopy(mat->InputAt(i), mat->LocationAt(i), dest_index++);
|
| }
|
| }
|
| }
|
| - return to_index;
|
| + return dest_index;
|
| }
|
|
|
|
|
| @@ -1049,7 +1141,7 @@
|
| intptr_t write_count = (suffix_length > 1) ? length - 1 : length;
|
| for (intptr_t i = 0; i < write_count; ++i) {
|
| DeoptInstr* instr = instructions_[i];
|
| - deopt_info.SetAt(i, instr->kind(), instr->from_index());
|
| + deopt_info.SetAt(i, instr->kind(), instr->source_index());
|
| TrieNode* child = node;
|
| node = new TrieNode(instr, current_info_number_);
|
| node->AddChild(child);
|
| @@ -1059,7 +1151,7 @@
|
| suffix->AddChild(node);
|
| DeoptInstr* instr =
|
| new DeoptSuffixInstr(suffix->info_number(), suffix_length);
|
| - deopt_info.SetAt(length - 1, instr->kind(), instr->from_index());
|
| + deopt_info.SetAt(length - 1, instr->kind(), instr->source_index());
|
| } else {
|
| trie_root_->AddChild(node);
|
| }
|
|
|