OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/debug/debug-frames.h" | 5 #include "src/debug/debug-frames.h" |
6 | 6 |
7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
| 8 #include "src/wasm/wasm-interpreter.h" |
| 9 #include "src/wasm/wasm-objects.h" |
8 | 10 |
9 namespace v8 { | 11 namespace v8 { |
10 namespace internal { | 12 namespace internal { |
11 | 13 |
12 FrameInspector::FrameInspector(StandardFrame* frame, int inlined_jsframe_index, | 14 FrameInspector::FrameInspector(StandardFrame* frame, int inlined_frame_index, |
13 Isolate* isolate) | 15 Isolate* isolate) |
14 : frame_(frame), deoptimized_frame_(NULL), isolate_(isolate) { | 16 : frame_(frame), |
| 17 frame_summary_(FrameSummary::Get(frame, inlined_frame_index)), |
| 18 deoptimized_frame_(nullptr), |
| 19 isolate_(isolate) { |
15 JavaScriptFrame* js_frame = | 20 JavaScriptFrame* js_frame = |
16 frame->is_java_script() ? javascript_frame() : nullptr; | 21 frame->is_java_script() ? javascript_frame() : nullptr; |
17 DCHECK(js_frame || frame->is_wasm()); | 22 DCHECK(js_frame || frame->is_wasm()); |
18 has_adapted_arguments_ = js_frame && js_frame->has_adapted_arguments(); | 23 has_adapted_arguments_ = js_frame && js_frame->has_adapted_arguments(); |
19 is_bottommost_ = inlined_jsframe_index == 0; | 24 is_bottommost_ = inlined_frame_index == 0; |
20 is_optimized_ = frame_->is_optimized(); | 25 is_optimized_ = frame_->is_optimized(); |
21 is_interpreted_ = frame_->is_interpreted(); | 26 is_interpreted_ = frame_->is_interpreted(); |
| 27 |
22 // Calculate the deoptimized frame. | 28 // Calculate the deoptimized frame. |
23 if (frame->is_optimized()) { | 29 if (is_optimized_) { |
24 DCHECK(js_frame != nullptr); | 30 DCHECK(js_frame != nullptr); |
25 // TODO(turbofan): Revisit once we support deoptimization. | 31 // TODO(turbofan): Revisit once we support deoptimization. |
26 if (js_frame->LookupCode()->is_turbofanned() && | 32 if (js_frame->LookupCode()->is_turbofanned() && |
27 js_frame->function()->shared()->asm_function()) { | 33 js_frame->function()->shared()->asm_function()) { |
28 is_optimized_ = false; | 34 is_optimized_ = false; |
29 return; | 35 return; |
30 } | 36 } |
31 | 37 |
32 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame( | 38 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame( |
33 js_frame, inlined_jsframe_index, isolate); | 39 js_frame, inlined_frame_index, isolate); |
34 } | 40 } |
35 } | 41 } |
36 | 42 |
37 FrameInspector::~FrameInspector() { | 43 FrameInspector::~FrameInspector() { |
38 // Get rid of the calculated deoptimized frame if any. | 44 // Get rid of the calculated deoptimized frame if any. |
39 if (deoptimized_frame_ != nullptr) { | 45 if (deoptimized_frame_ != nullptr) { |
40 delete deoptimized_frame_; | 46 delete deoptimized_frame_; |
41 } | 47 } |
42 } | 48 } |
43 | 49 |
44 int FrameInspector::GetParametersCount() { | 50 int FrameInspector::GetParametersCount() { |
45 return is_optimized_ ? deoptimized_frame_->parameters_count() | 51 return is_optimized_ ? deoptimized_frame_->parameters_count() |
46 : frame_->ComputeParametersCount(); | 52 : frame_->ComputeParametersCount(); |
47 } | 53 } |
48 | 54 |
49 Handle<Script> FrameInspector::GetScript() { | 55 Handle<Script> FrameInspector::GetScript() { |
50 Object* script = is_optimized_ | 56 return Handle<Script>::cast(frame_summary_.script()); |
51 ? deoptimized_frame_->GetFunction()->shared()->script() | |
52 : frame_->script(); | |
53 return handle(Script::cast(script), isolate_); | |
54 } | 57 } |
55 | 58 |
56 Handle<JSFunction> FrameInspector::GetFunction() { | 59 Handle<JSFunction> FrameInspector::GetFunction() { |
57 DCHECK(!frame_->is_wasm()); | 60 return frame_summary_.AsJavaScript().function(); |
58 return is_optimized_ ? deoptimized_frame_->GetFunction() | |
59 : handle(javascript_frame()->function(), isolate_); | |
60 } | 61 } |
61 | 62 |
62 Handle<Object> FrameInspector::GetParameter(int index) { | 63 Handle<Object> FrameInspector::GetParameter(int index) { |
63 return is_optimized_ ? deoptimized_frame_->GetParameter(index) | 64 return is_optimized_ ? deoptimized_frame_->GetParameter(index) |
64 : handle(frame_->GetParameter(index), isolate_); | 65 : handle(frame_->GetParameter(index), isolate_); |
65 } | 66 } |
66 | 67 |
67 Handle<Object> FrameInspector::GetExpression(int index) { | 68 Handle<Object> FrameInspector::GetExpression(int index) { |
68 // TODO(turbofan): Revisit once we support deoptimization. | 69 // TODO(turbofan): Revisit once we support deoptimization. |
69 if (frame_->is_java_script() && | 70 if (frame_->is_java_script() && |
70 javascript_frame()->LookupCode()->is_turbofanned() && | 71 javascript_frame()->LookupCode()->is_turbofanned() && |
71 javascript_frame()->function()->shared()->asm_function()) { | 72 javascript_frame()->function()->shared()->asm_function()) { |
72 return isolate_->factory()->undefined_value(); | 73 return isolate_->factory()->undefined_value(); |
73 } | 74 } |
74 return is_optimized_ ? deoptimized_frame_->GetExpression(index) | 75 return is_optimized_ ? deoptimized_frame_->GetExpression(index) |
75 : handle(frame_->GetExpression(index), isolate_); | 76 : handle(frame_->GetExpression(index), isolate_); |
76 } | 77 } |
77 | 78 |
78 int FrameInspector::GetSourcePosition() { | 79 int FrameInspector::GetSourcePosition() { |
79 return is_optimized_ ? deoptimized_frame_->GetSourcePosition() | 80 return frame_summary_.SourcePosition(); |
80 : frame_->position(); | |
81 } | 81 } |
82 | 82 |
83 bool FrameInspector::IsConstructor() { | 83 bool FrameInspector::IsConstructor() { return frame_summary_.is_constructor(); } |
84 return is_optimized_ && !is_bottommost_ | |
85 ? deoptimized_frame_->HasConstructStub() | |
86 : frame_->IsConstructor(); | |
87 } | |
88 | 84 |
89 Handle<Object> FrameInspector::GetContext() { | 85 Handle<Object> FrameInspector::GetContext() { |
90 return is_optimized_ ? deoptimized_frame_->GetContext() | 86 return is_optimized_ ? deoptimized_frame_->GetContext() |
91 : handle(frame_->context(), isolate_); | 87 : handle(frame_->context(), isolate_); |
92 } | 88 } |
93 | 89 |
94 | |
95 // To inspect all the provided arguments the frame might need to be | 90 // To inspect all the provided arguments the frame might need to be |
96 // replaced with the arguments frame. | 91 // replaced with the arguments frame. |
97 void FrameInspector::SetArgumentsFrame(StandardFrame* frame) { | 92 void FrameInspector::SetArgumentsFrame(StandardFrame* frame) { |
98 DCHECK(has_adapted_arguments_); | 93 DCHECK(has_adapted_arguments_); |
99 DCHECK(frame->is_arguments_adaptor()); | 94 DCHECK(frame->is_arguments_adaptor()); |
100 frame_ = frame; | 95 frame_ = frame; |
101 is_optimized_ = frame_->is_optimized(); | 96 is_optimized_ = frame_->is_optimized(); |
102 is_interpreted_ = frame_->is_interpreted(); | 97 is_interpreted_ = frame_->is_interpreted(); |
103 DCHECK(!is_optimized_); | 98 DCHECK(!is_optimized_); |
104 } | 99 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 save = save->prev(); | 197 save = save->prev(); |
203 } | 198 } |
204 DCHECK(save != NULL); | 199 DCHECK(save != NULL); |
205 return save; | 200 return save; |
206 } | 201 } |
207 | 202 |
208 int DebugFrameHelper::FindIndexedNonNativeFrame(StackTraceFrameIterator* it, | 203 int DebugFrameHelper::FindIndexedNonNativeFrame(StackTraceFrameIterator* it, |
209 int index) { | 204 int index) { |
210 int count = -1; | 205 int count = -1; |
211 for (; !it->done(); it->Advance()) { | 206 for (; !it->done(); it->Advance()) { |
212 if (it->is_wasm()) { | |
213 if (++count == index) return 0; | |
214 continue; | |
215 } | |
216 List<FrameSummary> frames(FLAG_max_inlining_levels + 1); | 207 List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
217 it->javascript_frame()->Summarize(&frames); | 208 it->frame()->Summarize(&frames); |
218 for (int i = frames.length() - 1; i >= 0; i--) { | 209 for (int i = frames.length() - 1; i >= 0; i--) { |
219 // Omit functions from native and extension scripts. | 210 // Omit functions from native and extension scripts. |
220 if (!frames[i].function()->shared()->IsSubjectToDebugging()) continue; | 211 if (!frames[i].is_subject_to_debugging()) continue; |
221 if (++count == index) return i; | 212 if (++count == index) return i; |
222 } | 213 } |
223 } | 214 } |
224 return -1; | 215 return -1; |
225 } | 216 } |
226 | 217 |
227 | 218 |
228 } // namespace internal | 219 } // namespace internal |
229 } // namespace v8 | 220 } // namespace v8 |
OLD | NEW |