| // Copyright 2015 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/debug/debug-frames.h" | |
| #include "src/accessors.h" | |
| #include "src/frames-inl.h" | |
| #include "src/wasm/wasm-interpreter.h" | |
| #include "src/wasm/wasm-objects-inl.h" | |
| namespace v8 { | |
| namespace internal { | |
| FrameInspector::FrameInspector(StandardFrame* frame, int inlined_frame_index, | |
| Isolate* isolate) | |
| : frame_(frame), | |
| inlined_frame_index_(inlined_frame_index), | |
| isolate_(isolate) { | |
| // Extract the relevant information from the frame summary and discard it. | |
| FrameSummary summary = FrameSummary::Get(frame, inlined_frame_index); | |
| is_constructor_ = summary.is_constructor(); | |
| source_position_ = summary.SourcePosition(); | |
| function_name_ = summary.FunctionName(); | |
| script_ = Handle<Script>::cast(summary.script()); | |
| receiver_ = summary.receiver(); | |
| if (summary.IsJavaScript()) { | |
| function_ = summary.AsJavaScript().function(); | |
| } | |
| JavaScriptFrame* js_frame = | |
| frame->is_java_script() ? javascript_frame() : nullptr; | |
| DCHECK(js_frame || frame->is_wasm()); | |
| has_adapted_arguments_ = js_frame && js_frame->has_adapted_arguments(); | |
| is_optimized_ = frame_->is_optimized(); | |
| is_interpreted_ = frame_->is_interpreted(); | |
| // Calculate the deoptimized frame. | |
| if (is_optimized_) { | |
| DCHECK_NOT_NULL(js_frame); | |
| deoptimized_frame_.reset(Deoptimizer::DebuggerInspectableFrame( | |
| js_frame, inlined_frame_index, isolate)); | |
| } else if (frame_->is_wasm_interpreter_entry()) { | |
| wasm_interpreted_frame_ = | |
| WasmInterpreterEntryFrame::cast(frame_) | |
| ->debug_info() | |
| ->GetInterpretedFrame(frame_->fp(), inlined_frame_index); | |
| DCHECK(wasm_interpreted_frame_); | |
| } | |
| } | |
| FrameInspector::~FrameInspector() { | |
| // Destructor needs to be defined in the .cc file, because it instantiates | |
| // std::unique_ptr destructors but the types are not known in the header. | |
| } | |
| int FrameInspector::GetParametersCount() { | |
| if (is_optimized_) return deoptimized_frame_->parameters_count(); | |
| if (wasm_interpreted_frame_) | |
| return wasm_interpreted_frame_->GetParameterCount(); | |
| return frame_->ComputeParametersCount(); | |
| } | |
| Handle<Object> FrameInspector::GetParameter(int index) { | |
| if (is_optimized_) return deoptimized_frame_->GetParameter(index); | |
| // TODO(clemensh): Handle wasm_interpreted_frame_. | |
| return handle(frame_->GetParameter(index), isolate_); | |
| } | |
| Handle<Object> FrameInspector::GetExpression(int index) { | |
| return is_optimized_ ? deoptimized_frame_->GetExpression(index) | |
| : handle(frame_->GetExpression(index), isolate_); | |
| } | |
| Handle<Object> FrameInspector::GetContext() { | |
| return deoptimized_frame_ ? deoptimized_frame_->GetContext() | |
| : handle(frame_->context(), isolate_); | |
| } | |
| bool FrameInspector::IsWasm() { return frame_->is_wasm(); } | |
| bool FrameInspector::IsJavaScript() { return frame_->is_java_script(); } | |
| bool FrameInspector::ParameterIsShadowedByContextLocal( | |
| Handle<ScopeInfo> info, Handle<String> parameter_name) { | |
| VariableMode mode; | |
| InitializationFlag init_flag; | |
| MaybeAssignedFlag maybe_assigned_flag; | |
| return ScopeInfo::ContextSlotIndex(info, parameter_name, &mode, &init_flag, | |
| &maybe_assigned_flag) != -1; | |
| } | |
| } // namespace internal | |
| } // namespace v8 |