| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/deopt_instructions.h" | 5 #include "vm/deopt_instructions.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" |
| 9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
| 10 #include "vm/locations.h" | 10 #include "vm/locations.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 explicit DeoptStackSlotInstr(intptr_t from_index) | 80 explicit DeoptStackSlotInstr(intptr_t from_index) |
| 81 : stack_slot_index_(from_index) { | 81 : stack_slot_index_(from_index) { |
| 82 ASSERT(stack_slot_index_ >= 0); | 82 ASSERT(stack_slot_index_ >= 0); |
| 83 } | 83 } |
| 84 | 84 |
| 85 virtual intptr_t from_index() const { return stack_slot_index_; } | 85 virtual intptr_t from_index() const { return stack_slot_index_; } |
| 86 virtual DeoptInstr::Kind kind() const { return kStackSlot; } | 86 virtual DeoptInstr::Kind kind() const { return kStackSlot; } |
| 87 | 87 |
| 88 virtual const char* ToCString() const { | 88 virtual const char* ToCString() const { |
| 89 return Isolate::Current()->current_zone()->PrintToString( | 89 return Isolate::Current()->current_zone()->PrintToString( |
| 90 "s%"Pd"", stack_slot_index_); | 90 "s%" Pd "", stack_slot_index_); |
| 91 } | 91 } |
| 92 | 92 |
| 93 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 93 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 94 intptr_t from_index = | 94 intptr_t from_index = |
| 95 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 95 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
| 96 intptr_t* from_addr = deopt_context->GetFromFrameAddressAt(from_index); | 96 intptr_t* from_addr = deopt_context->GetFromFrameAddressAt(from_index); |
| 97 *to_addr = *from_addr; | 97 *to_addr = *from_addr; |
| 98 } | 98 } |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 const intptr_t stack_slot_index_; // First argument is 0, always >= 0. | 101 const intptr_t stack_slot_index_; // First argument is 0, always >= 0. |
| 102 | 102 |
| 103 DISALLOW_COPY_AND_ASSIGN(DeoptStackSlotInstr); | 103 DISALLOW_COPY_AND_ASSIGN(DeoptStackSlotInstr); |
| 104 }; | 104 }; |
| 105 | 105 |
| 106 | 106 |
| 107 class DeoptDoubleStackSlotInstr : public DeoptInstr { | 107 class DeoptDoubleStackSlotInstr : public DeoptInstr { |
| 108 public: | 108 public: |
| 109 explicit DeoptDoubleStackSlotInstr(intptr_t from_index) | 109 explicit DeoptDoubleStackSlotInstr(intptr_t from_index) |
| 110 : stack_slot_index_(from_index) { | 110 : stack_slot_index_(from_index) { |
| 111 ASSERT(stack_slot_index_ >= 0); | 111 ASSERT(stack_slot_index_ >= 0); |
| 112 } | 112 } |
| 113 | 113 |
| 114 virtual intptr_t from_index() const { return stack_slot_index_; } | 114 virtual intptr_t from_index() const { return stack_slot_index_; } |
| 115 virtual DeoptInstr::Kind kind() const { return kDoubleStackSlot; } | 115 virtual DeoptInstr::Kind kind() const { return kDoubleStackSlot; } |
| 116 | 116 |
| 117 virtual const char* ToCString() const { | 117 virtual const char* ToCString() const { |
| 118 return Isolate::Current()->current_zone()->PrintToString( | 118 return Isolate::Current()->current_zone()->PrintToString( |
| 119 "ds%"Pd"", stack_slot_index_); | 119 "ds%" Pd "", stack_slot_index_); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 122 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 123 intptr_t from_index = | 123 intptr_t from_index = |
| 124 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 124 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
| 125 double* from_addr = reinterpret_cast<double*>( | 125 double* from_addr = reinterpret_cast<double*>( |
| 126 deopt_context->GetFromFrameAddressAt(from_index)); | 126 deopt_context->GetFromFrameAddressAt(from_index)); |
| 127 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 127 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
| 128 Isolate::Current()->DeferDoubleMaterialization( | 128 Isolate::Current()->DeferDoubleMaterialization( |
| 129 *from_addr, reinterpret_cast<RawDouble**>(to_addr)); | 129 *from_addr, reinterpret_cast<RawDouble**>(to_addr)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 141 explicit DeoptInt64StackSlotInstr(intptr_t from_index) | 141 explicit DeoptInt64StackSlotInstr(intptr_t from_index) |
| 142 : stack_slot_index_(from_index) { | 142 : stack_slot_index_(from_index) { |
| 143 ASSERT(stack_slot_index_ >= 0); | 143 ASSERT(stack_slot_index_ >= 0); |
| 144 } | 144 } |
| 145 | 145 |
| 146 virtual intptr_t from_index() const { return stack_slot_index_; } | 146 virtual intptr_t from_index() const { return stack_slot_index_; } |
| 147 virtual DeoptInstr::Kind kind() const { return kInt64StackSlot; } | 147 virtual DeoptInstr::Kind kind() const { return kInt64StackSlot; } |
| 148 | 148 |
| 149 virtual const char* ToCString() const { | 149 virtual const char* ToCString() const { |
| 150 return Isolate::Current()->current_zone()->PrintToString( | 150 return Isolate::Current()->current_zone()->PrintToString( |
| 151 "ms%"Pd"", stack_slot_index_); | 151 "ms%" Pd "", stack_slot_index_); |
| 152 } | 152 } |
| 153 | 153 |
| 154 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 154 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 155 intptr_t from_index = | 155 intptr_t from_index = |
| 156 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 156 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
| 157 int64_t* from_addr = reinterpret_cast<int64_t*>( | 157 int64_t* from_addr = reinterpret_cast<int64_t*>( |
| 158 deopt_context->GetFromFrameAddressAt(from_index)); | 158 deopt_context->GetFromFrameAddressAt(from_index)); |
| 159 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 159 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
| 160 if (Smi::IsValid64(*from_addr)) { | 160 if (Smi::IsValid64(*from_addr)) { |
| 161 *to_addr = reinterpret_cast<intptr_t>( | 161 *to_addr = reinterpret_cast<intptr_t>( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 178 explicit DeoptFloat32x4StackSlotInstr(intptr_t from_index) | 178 explicit DeoptFloat32x4StackSlotInstr(intptr_t from_index) |
| 179 : stack_slot_index_(from_index) { | 179 : stack_slot_index_(from_index) { |
| 180 ASSERT(stack_slot_index_ >= 0); | 180 ASSERT(stack_slot_index_ >= 0); |
| 181 } | 181 } |
| 182 | 182 |
| 183 virtual intptr_t from_index() const { return stack_slot_index_; } | 183 virtual intptr_t from_index() const { return stack_slot_index_; } |
| 184 virtual DeoptInstr::Kind kind() const { return kFloat32x4StackSlot; } | 184 virtual DeoptInstr::Kind kind() const { return kFloat32x4StackSlot; } |
| 185 | 185 |
| 186 virtual const char* ToCString() const { | 186 virtual const char* ToCString() const { |
| 187 return Isolate::Current()->current_zone()->PrintToString( | 187 return Isolate::Current()->current_zone()->PrintToString( |
| 188 "f32x4s%"Pd"", stack_slot_index_); | 188 "f32x4s%" Pd "", stack_slot_index_); |
| 189 } | 189 } |
| 190 | 190 |
| 191 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 191 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 192 intptr_t from_index = | 192 intptr_t from_index = |
| 193 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 193 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
| 194 simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>( | 194 simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>( |
| 195 deopt_context->GetFromFrameAddressAt(from_index)); | 195 deopt_context->GetFromFrameAddressAt(from_index)); |
| 196 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 196 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
| 197 Isolate::Current()->DeferFloat32x4Materialization( | 197 Isolate::Current()->DeferFloat32x4Materialization( |
| 198 *from_addr, reinterpret_cast<RawFloat32x4**>(to_addr)); | 198 *from_addr, reinterpret_cast<RawFloat32x4**>(to_addr)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 210 explicit DeoptUint32x4StackSlotInstr(intptr_t from_index) | 210 explicit DeoptUint32x4StackSlotInstr(intptr_t from_index) |
| 211 : stack_slot_index_(from_index) { | 211 : stack_slot_index_(from_index) { |
| 212 ASSERT(stack_slot_index_ >= 0); | 212 ASSERT(stack_slot_index_ >= 0); |
| 213 } | 213 } |
| 214 | 214 |
| 215 virtual intptr_t from_index() const { return stack_slot_index_; } | 215 virtual intptr_t from_index() const { return stack_slot_index_; } |
| 216 virtual DeoptInstr::Kind kind() const { return kUint32x4StackSlot; } | 216 virtual DeoptInstr::Kind kind() const { return kUint32x4StackSlot; } |
| 217 | 217 |
| 218 virtual const char* ToCString() const { | 218 virtual const char* ToCString() const { |
| 219 return Isolate::Current()->current_zone()->PrintToString( | 219 return Isolate::Current()->current_zone()->PrintToString( |
| 220 "ui32x4s%"Pd"", stack_slot_index_); | 220 "ui32x4s%" Pd "", stack_slot_index_); |
| 221 } | 221 } |
| 222 | 222 |
| 223 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 223 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 224 intptr_t from_index = | 224 intptr_t from_index = |
| 225 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 225 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
| 226 simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>( | 226 simd128_value_t* from_addr = reinterpret_cast<simd128_value_t*>( |
| 227 deopt_context->GetFromFrameAddressAt(from_index)); | 227 deopt_context->GetFromFrameAddressAt(from_index)); |
| 228 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 228 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
| 229 Isolate::Current()->DeferUint32x4Materialization( | 229 Isolate::Current()->DeferUint32x4Materialization( |
| 230 *from_addr, reinterpret_cast<RawUint32x4**>(to_addr)); | 230 *from_addr, reinterpret_cast<RawUint32x4**>(to_addr)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 254 | 254 |
| 255 virtual intptr_t from_index() const { | 255 virtual intptr_t from_index() const { |
| 256 return ObjectTableIndex::encode(object_table_index_) | | 256 return ObjectTableIndex::encode(object_table_index_) | |
| 257 DeoptId::encode(deopt_id_); | 257 DeoptId::encode(deopt_id_); |
| 258 } | 258 } |
| 259 | 259 |
| 260 virtual DeoptInstr::Kind kind() const { return kRetAddress; } | 260 virtual DeoptInstr::Kind kind() const { return kRetAddress; } |
| 261 | 261 |
| 262 virtual const char* ToCString() const { | 262 virtual const char* ToCString() const { |
| 263 return Isolate::Current()->current_zone()->PrintToString( | 263 return Isolate::Current()->current_zone()->PrintToString( |
| 264 "ret oti:%"Pd"(%"Pd")", object_table_index_, deopt_id_); | 264 "ret oti:%" Pd "(%" Pd ")", object_table_index_, deopt_id_); |
| 265 } | 265 } |
| 266 | 266 |
| 267 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 267 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 268 Function& function = Function::Handle(deopt_context->isolate()); | 268 Function& function = Function::Handle(deopt_context->isolate()); |
| 269 function ^= deopt_context->ObjectAt(object_table_index_); | 269 function ^= deopt_context->ObjectAt(object_table_index_); |
| 270 const Code& code = | 270 const Code& code = |
| 271 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 271 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
| 272 ASSERT(!code.IsNull()); | 272 ASSERT(!code.IsNull()); |
| 273 uword continue_at_pc = code.GetPcForDeoptId(deopt_id_, | 273 uword continue_at_pc = code.GetPcForDeoptId(deopt_id_, |
| 274 PcDescriptors::kDeopt); | 274 PcDescriptors::kDeopt); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 explicit DeoptConstantInstr(intptr_t object_table_index) | 308 explicit DeoptConstantInstr(intptr_t object_table_index) |
| 309 : object_table_index_(object_table_index) { | 309 : object_table_index_(object_table_index) { |
| 310 ASSERT(object_table_index >= 0); | 310 ASSERT(object_table_index >= 0); |
| 311 } | 311 } |
| 312 | 312 |
| 313 virtual intptr_t from_index() const { return object_table_index_; } | 313 virtual intptr_t from_index() const { return object_table_index_; } |
| 314 virtual DeoptInstr::Kind kind() const { return kConstant; } | 314 virtual DeoptInstr::Kind kind() const { return kConstant; } |
| 315 | 315 |
| 316 virtual const char* ToCString() const { | 316 virtual const char* ToCString() const { |
| 317 return Isolate::Current()->current_zone()->PrintToString( | 317 return Isolate::Current()->current_zone()->PrintToString( |
| 318 "const oti:%"Pd"", object_table_index_); | 318 "const oti:%" Pd "", object_table_index_); |
| 319 } | 319 } |
| 320 | 320 |
| 321 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 321 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 322 const Object& obj = Object::Handle( | 322 const Object& obj = Object::Handle( |
| 323 deopt_context->isolate(), deopt_context->ObjectAt(object_table_index_)); | 323 deopt_context->isolate(), deopt_context->ObjectAt(object_table_index_)); |
| 324 *reinterpret_cast<RawObject**>(to_addr) = obj.raw(); | 324 *reinterpret_cast<RawObject**>(to_addr) = obj.raw(); |
| 325 } | 325 } |
| 326 | 326 |
| 327 private: | 327 private: |
| 328 const intptr_t object_table_index_; | 328 const intptr_t object_table_index_; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 explicit DeoptPcMarkerInstr(intptr_t object_table_index) | 477 explicit DeoptPcMarkerInstr(intptr_t object_table_index) |
| 478 : object_table_index_(object_table_index) { | 478 : object_table_index_(object_table_index) { |
| 479 ASSERT(object_table_index >= 0); | 479 ASSERT(object_table_index >= 0); |
| 480 } | 480 } |
| 481 | 481 |
| 482 virtual intptr_t from_index() const { return object_table_index_; } | 482 virtual intptr_t from_index() const { return object_table_index_; } |
| 483 virtual DeoptInstr::Kind kind() const { return kPcMarker; } | 483 virtual DeoptInstr::Kind kind() const { return kPcMarker; } |
| 484 | 484 |
| 485 virtual const char* ToCString() const { | 485 virtual const char* ToCString() const { |
| 486 return Isolate::Current()->current_zone()->PrintToString( | 486 return Isolate::Current()->current_zone()->PrintToString( |
| 487 "pcmark oti:%"Pd"", object_table_index_); | 487 "pcmark oti:%" Pd "", object_table_index_); |
| 488 } | 488 } |
| 489 | 489 |
| 490 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 490 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 491 Function& function = Function::Handle(deopt_context->isolate()); | 491 Function& function = Function::Handle(deopt_context->isolate()); |
| 492 function ^= deopt_context->ObjectAt(object_table_index_); | 492 function ^= deopt_context->ObjectAt(object_table_index_); |
| 493 if (function.IsNull()) { | 493 if (function.IsNull()) { |
| 494 // Callee's PC marker is not used (pc of Deoptimize stub). Set to 0. | 494 // Callee's PC marker is not used (pc of Deoptimize stub). Set to 0. |
| 495 *to_addr = 0; | 495 *to_addr = 0; |
| 496 return; | 496 return; |
| 497 } | 497 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 explicit DeoptPpInstr(intptr_t object_table_index) | 529 explicit DeoptPpInstr(intptr_t object_table_index) |
| 530 : object_table_index_(object_table_index) { | 530 : object_table_index_(object_table_index) { |
| 531 ASSERT(object_table_index >= 0); | 531 ASSERT(object_table_index >= 0); |
| 532 } | 532 } |
| 533 | 533 |
| 534 virtual intptr_t from_index() const { return object_table_index_; } | 534 virtual intptr_t from_index() const { return object_table_index_; } |
| 535 virtual DeoptInstr::Kind kind() const { return kPp; } | 535 virtual DeoptInstr::Kind kind() const { return kPp; } |
| 536 | 536 |
| 537 virtual const char* ToCString() const { | 537 virtual const char* ToCString() const { |
| 538 return Isolate::Current()->current_zone()->PrintToString( | 538 return Isolate::Current()->current_zone()->PrintToString( |
| 539 "pp oti:%"Pd"", object_table_index_); | 539 "pp oti:%" Pd "", object_table_index_); |
| 540 } | 540 } |
| 541 | 541 |
| 542 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 542 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 543 Function& function = Function::Handle(deopt_context->isolate()); | 543 Function& function = Function::Handle(deopt_context->isolate()); |
| 544 function ^= deopt_context->ObjectAt(object_table_index_); | 544 function ^= deopt_context->ObjectAt(object_table_index_); |
| 545 const Code& code = | 545 const Code& code = |
| 546 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 546 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
| 547 ASSERT(!code.IsNull()); | 547 ASSERT(!code.IsNull()); |
| 548 const intptr_t pp = reinterpret_cast<intptr_t>(code.ObjectPool()); | 548 const intptr_t pp = reinterpret_cast<intptr_t>(code.ObjectPool()); |
| 549 *to_addr = pp; | 549 *to_addr = pp; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 } | 640 } |
| 641 | 641 |
| 642 virtual intptr_t from_index() const { | 642 virtual intptr_t from_index() const { |
| 643 return InfoNumber::encode(info_number_) | | 643 return InfoNumber::encode(info_number_) | |
| 644 SuffixLength::encode(suffix_length_); | 644 SuffixLength::encode(suffix_length_); |
| 645 } | 645 } |
| 646 virtual DeoptInstr::Kind kind() const { return kSuffix; } | 646 virtual DeoptInstr::Kind kind() const { return kSuffix; } |
| 647 | 647 |
| 648 virtual const char* ToCString() const { | 648 virtual const char* ToCString() const { |
| 649 return Isolate::Current()->current_zone()->PrintToString( | 649 return Isolate::Current()->current_zone()->PrintToString( |
| 650 "suffix %"Pd":%"Pd, info_number_, suffix_length_); | 650 "suffix %" Pd ":%" Pd, info_number_, suffix_length_); |
| 651 } | 651 } |
| 652 | 652 |
| 653 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 653 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 654 // The deoptimization info is uncompressed by translating away suffixes | 654 // The deoptimization info is uncompressed by translating away suffixes |
| 655 // before executing the instructions. | 655 // before executing the instructions. |
| 656 UNREACHABLE(); | 656 UNREACHABLE(); |
| 657 } | 657 } |
| 658 | 658 |
| 659 private: | 659 private: |
| 660 // Static decoder functions in DeoptInstr have access to the bitfield | 660 // Static decoder functions in DeoptInstr have access to the bitfield |
| (...skipping 18 matching lines...) Expand all Loading... |
| 679 explicit DeoptMaterializedObjectRefInstr(intptr_t index) | 679 explicit DeoptMaterializedObjectRefInstr(intptr_t index) |
| 680 : index_(index) { | 680 : index_(index) { |
| 681 ASSERT(index >= 0); | 681 ASSERT(index >= 0); |
| 682 } | 682 } |
| 683 | 683 |
| 684 virtual intptr_t from_index() const { return index_; } | 684 virtual intptr_t from_index() const { return index_; } |
| 685 virtual DeoptInstr::Kind kind() const { return kMaterializedObjectRef; } | 685 virtual DeoptInstr::Kind kind() const { return kMaterializedObjectRef; } |
| 686 | 686 |
| 687 virtual const char* ToCString() const { | 687 virtual const char* ToCString() const { |
| 688 return Isolate::Current()->current_zone()->PrintToString( | 688 return Isolate::Current()->current_zone()->PrintToString( |
| 689 "mat ref #%"Pd"", index_); | 689 "mat ref #%" Pd "", index_); |
| 690 } | 690 } |
| 691 | 691 |
| 692 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 692 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 693 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 693 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
| 694 Isolate::Current()->DeferMaterializedObjectRef( | 694 Isolate::Current()->DeferMaterializedObjectRef( |
| 695 index_, to_addr); | 695 index_, to_addr); |
| 696 } | 696 } |
| 697 | 697 |
| 698 private: | 698 private: |
| 699 intptr_t index_; | 699 intptr_t index_; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 710 explicit DeoptMaterializeObjectInstr(intptr_t field_count) | 710 explicit DeoptMaterializeObjectInstr(intptr_t field_count) |
| 711 : field_count_(field_count) { | 711 : field_count_(field_count) { |
| 712 ASSERT(field_count >= 0); | 712 ASSERT(field_count >= 0); |
| 713 } | 713 } |
| 714 | 714 |
| 715 virtual intptr_t from_index() const { return field_count_; } | 715 virtual intptr_t from_index() const { return field_count_; } |
| 716 virtual DeoptInstr::Kind kind() const { return kMaterializeObject; } | 716 virtual DeoptInstr::Kind kind() const { return kMaterializeObject; } |
| 717 | 717 |
| 718 virtual const char* ToCString() const { | 718 virtual const char* ToCString() const { |
| 719 return Isolate::Current()->current_zone()->PrintToString( | 719 return Isolate::Current()->current_zone()->PrintToString( |
| 720 "mat obj len:%"Pd"", field_count_); | 720 "mat obj len:%" Pd "", field_count_); |
| 721 } | 721 } |
| 722 | 722 |
| 723 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { | 723 void Execute(DeoptimizationContext* deopt_context, intptr_t* to_addr) { |
| 724 // This instructions are executed manually by the DeoptimizeWithDeoptInfo. | 724 // This instructions are executed manually by the DeoptimizeWithDeoptInfo. |
| 725 UNREACHABLE(); | 725 UNREACHABLE(); |
| 726 } | 726 } |
| 727 | 727 |
| 728 private: | 728 private: |
| 729 intptr_t field_count_; | 729 intptr_t field_count_; |
| 730 | 730 |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 Smi* offset, | 1099 Smi* offset, |
| 1100 DeoptInfo* info, | 1100 DeoptInfo* info, |
| 1101 Smi* reason) { | 1101 Smi* reason) { |
| 1102 intptr_t i = index * kEntrySize; | 1102 intptr_t i = index * kEntrySize; |
| 1103 *offset ^= table.At(i); | 1103 *offset ^= table.At(i); |
| 1104 *info ^= table.At(i + 1); | 1104 *info ^= table.At(i + 1); |
| 1105 *reason ^= table.At(i + 2); | 1105 *reason ^= table.At(i + 2); |
| 1106 } | 1106 } |
| 1107 | 1107 |
| 1108 } // namespace dart | 1108 } // namespace dart |
| OLD | NEW |