OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/deoptimizer.h" | 5 #include "src/deoptimizer.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 2665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2676 TranslatedFrame::iterator parameter_it = parameter_frame->begin(); | 2676 TranslatedFrame::iterator parameter_it = parameter_frame->begin(); |
2677 parameter_it++; // Skip the function. | 2677 parameter_it++; // Skip the function. |
2678 parameter_it++; // Skip the receiver. | 2678 parameter_it++; // Skip the receiver. |
2679 | 2679 |
2680 // Figure out whether there is a construct stub frame on top of | 2680 // Figure out whether there is a construct stub frame on top of |
2681 // the parameter frame. | 2681 // the parameter frame. |
2682 has_construct_stub_ = | 2682 has_construct_stub_ = |
2683 parameter_frame != state->begin() && | 2683 parameter_frame != state->begin() && |
2684 (parameter_frame - 1)->kind() == TranslatedFrame::kConstructStub; | 2684 (parameter_frame - 1)->kind() == TranslatedFrame::kConstructStub; |
2685 | 2685 |
2686 source_position_ = Deoptimizer::ComputeSourcePosition( | 2686 if (frame_it->kind() == TranslatedFrame::kInterpretedFunction) { |
2687 *frame_it->shared_info(), frame_it->node_id()); | 2687 source_position_ = Deoptimizer::ComputeSourcePositionFromBytecodeArray( |
| 2688 *frame_it->shared_info(), frame_it->node_id()); |
| 2689 } else { |
| 2690 DCHECK_EQ(TranslatedFrame::kFunction, frame_it->kind()); |
| 2691 source_position_ = Deoptimizer::ComputeSourcePositionFromBaselineCode( |
| 2692 *frame_it->shared_info(), frame_it->node_id()); |
| 2693 } |
2688 | 2694 |
2689 TranslatedFrame::iterator value_it = frame_it->begin(); | 2695 TranslatedFrame::iterator value_it = frame_it->begin(); |
2690 // Get the function. Note that this might materialize the function. | 2696 // Get the function. Note that this might materialize the function. |
2691 // In case the debugger mutates this value, we should deoptimize | 2697 // In case the debugger mutates this value, we should deoptimize |
2692 // the function and remember the value in the materialized value store. | 2698 // the function and remember the value in the materialized value store. |
2693 function_ = Handle<JSFunction>::cast(value_it->GetValue()); | 2699 function_ = Handle<JSFunction>::cast(value_it->GetValue()); |
2694 | 2700 |
2695 parameters_.resize(static_cast<size_t>(parameter_count)); | 2701 parameters_.resize(static_cast<size_t>(parameter_count)); |
2696 for (int i = 0; i < parameter_count; i++) { | 2702 for (int i = 0; i < parameter_count; i++) { |
2697 Handle<Object> parameter = GetValueForDebugger(parameter_it, isolate); | 2703 Handle<Object> parameter = GetValueForDebugger(parameter_it, isolate); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2755 last_deopt_id = static_cast<int>(info->data()); | 2761 last_deopt_id = static_cast<int>(info->data()); |
2756 } else if (info->rmode() == RelocInfo::DEOPT_REASON) { | 2762 } else if (info->rmode() == RelocInfo::DEOPT_REASON) { |
2757 last_reason = static_cast<DeoptimizeReason>(info->data()); | 2763 last_reason = static_cast<DeoptimizeReason>(info->data()); |
2758 } | 2764 } |
2759 } | 2765 } |
2760 return DeoptInfo(SourcePosition::Unknown(), DeoptimizeReason::kNoReason, -1); | 2766 return DeoptInfo(SourcePosition::Unknown(), DeoptimizeReason::kNoReason, -1); |
2761 } | 2767 } |
2762 | 2768 |
2763 | 2769 |
2764 // static | 2770 // static |
2765 int Deoptimizer::ComputeSourcePosition(SharedFunctionInfo* shared, | 2771 int Deoptimizer::ComputeSourcePositionFromBaselineCode( |
2766 BailoutId node_id) { | 2772 SharedFunctionInfo* shared, BailoutId node_id) { |
2767 AbstractCode* abstract_code = shared->abstract_code(); | 2773 DCHECK(shared->HasBaselineCode()); |
2768 int code_offset; | 2774 Code* code = shared->code(); |
2769 if (abstract_code->IsBytecodeArray()) { | 2775 FixedArray* raw_data = code->deoptimization_data(); |
2770 // BailoutId points to the next bytecode in the bytecode aray. Subtract | 2776 DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data); |
2771 // 1 to get the end of current bytecode. | 2777 unsigned pc_and_state = Deoptimizer::GetOutputInfo(data, node_id, shared); |
2772 code_offset = node_id.ToInt() - 1; | 2778 int code_offset = |
2773 } else { | 2779 static_cast<int>(FullCodeGenerator::PcField::decode(pc_and_state)); |
2774 FixedArray* raw_data = abstract_code->GetCode()->deoptimization_data(); | 2780 return AbstractCode::cast(code)->SourcePosition(code_offset); |
2775 DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data); | |
2776 unsigned pc_and_state = Deoptimizer::GetOutputInfo(data, node_id, shared); | |
2777 code_offset = | |
2778 static_cast<int>(FullCodeGenerator::PcField::decode(pc_and_state)); | |
2779 } | |
2780 return abstract_code->SourcePosition(code_offset); | |
2781 } | 2781 } |
2782 | 2782 |
2783 // static | 2783 // static |
| 2784 int Deoptimizer::ComputeSourcePositionFromBytecodeArray( |
| 2785 SharedFunctionInfo* shared, BailoutId node_id) { |
| 2786 DCHECK(shared->HasBytecodeArray()); |
| 2787 // BailoutId points to the next bytecode in the bytecode aray. Subtract |
| 2788 // 1 to get the end of current bytecode. |
| 2789 int code_offset = node_id.ToInt() - 1; |
| 2790 return AbstractCode::cast(shared->bytecode_array()) |
| 2791 ->SourcePosition(code_offset); |
| 2792 } |
| 2793 |
| 2794 // static |
2784 TranslatedValue TranslatedValue::NewArgumentsObject(TranslatedState* container, | 2795 TranslatedValue TranslatedValue::NewArgumentsObject(TranslatedState* container, |
2785 int length, | 2796 int length, |
2786 int object_index) { | 2797 int object_index) { |
2787 TranslatedValue slot(container, kArgumentsObject); | 2798 TranslatedValue slot(container, kArgumentsObject); |
2788 slot.materialization_info_ = {object_index, length}; | 2799 slot.materialization_info_ = {object_index, length}; |
2789 return slot; | 2800 return slot; |
2790 } | 2801 } |
2791 | 2802 |
2792 | 2803 |
2793 // static | 2804 // static |
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3995 CHECK(value_info->IsMaterializedObject()); | 4006 CHECK(value_info->IsMaterializedObject()); |
3996 | 4007 |
3997 value_info->value_ = | 4008 value_info->value_ = |
3998 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 4009 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
3999 } | 4010 } |
4000 } | 4011 } |
4001 } | 4012 } |
4002 | 4013 |
4003 } // namespace internal | 4014 } // namespace internal |
4004 } // namespace v8 | 4015 } // namespace v8 |
OLD | NEW |