| 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_macros.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" |
| 11 #include "vm/parser.h" | 11 #include "vm/parser.h" |
| 12 | 12 |
| 13 namespace dart { | 13 namespace dart { |
| 14 | 14 |
| 15 DEFINE_FLAG(bool, compress_deopt_info, true, | 15 DEFINE_FLAG(bool, compress_deopt_info, true, |
| 16 "Compress the size of the deoptimization info for optimized code."); | 16 "Compress the size of the deoptimization info for optimized code."); |
| 17 DECLARE_FLAG(bool, trace_deoptimization); | 17 DECLARE_FLAG(bool, trace_deoptimization); |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 return chars; | 433 return chars; |
| 434 } | 434 } |
| 435 | 435 |
| 436 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 436 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
| 437 Function& function = Function::Handle(deopt_context->isolate()); | 437 Function& function = Function::Handle(deopt_context->isolate()); |
| 438 function ^= deopt_context->ObjectAt(object_table_index_); | 438 function ^= deopt_context->ObjectAt(object_table_index_); |
| 439 const Code& code = | 439 const Code& code = |
| 440 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 440 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
| 441 ASSERT(!code.IsNull()); | 441 ASSERT(!code.IsNull()); |
| 442 intptr_t pc_marker = code.EntryPoint() + | 442 intptr_t pc_marker = code.EntryPoint() + |
| 443 AssemblerMacros::kOffsetOfSavedPCfromEntrypoint; | 443 Assembler::kOffsetOfSavedPCfromEntrypoint; |
| 444 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); | 444 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
| 445 *to_addr = pc_marker; | 445 *to_addr = pc_marker; |
| 446 // Increment the deoptimization counter. This effectively increments each | 446 // Increment the deoptimization counter. This effectively increments each |
| 447 // function occurring in the optimized frame. | 447 // function occurring in the optimized frame. |
| 448 function.set_deoptimization_counter(function.deoptimization_counter() + 1); | 448 function.set_deoptimization_counter(function.deoptimization_counter() + 1); |
| 449 if (FLAG_trace_deoptimization) { | 449 if (FLAG_trace_deoptimization) { |
| 450 OS::PrintErr("Deoptimizing inlined %s (count %d)\n", | 450 OS::PrintErr("Deoptimizing inlined %s (count %d)\n", |
| 451 function.ToFullyQualifiedCString(), | 451 function.ToFullyQualifiedCString(), |
| 452 function.deoptimization_counter()); | 452 function.deoptimization_counter()); |
| 453 } | 453 } |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 Smi* offset, | 816 Smi* offset, |
| 817 DeoptInfo* info, | 817 DeoptInfo* info, |
| 818 Smi* reason) { | 818 Smi* reason) { |
| 819 intptr_t i = index * kEntrySize; | 819 intptr_t i = index * kEntrySize; |
| 820 *offset ^= table.At(i); | 820 *offset ^= table.At(i); |
| 821 *info ^= table.At(i + 1); | 821 *info ^= table.At(i + 1); |
| 822 *reason ^= table.At(i + 2); | 822 *reason ^= table.At(i + 2); |
| 823 } | 823 } |
| 824 | 824 |
| 825 } // namespace dart | 825 } // namespace dart |
| OLD | NEW |