| 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 |