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
3// found in the LICENSE file.
4
5#ifndef V8_DEBUG_DEBUG_FRAMES_H_
6#define V8_DEBUG_DEBUG_FRAMES_H_
7
8#include <memory>
9
10#include "src/deoptimizer/deoptimized-frame-info.h"
11#include "src/execution/isolate.h"
12#include "src/execution/v8threads.h"
13#include "src/objects/objects.h"
14
15namespace v8 {
16namespace internal {
17
18class JavaScriptFrame;
19class CommonFrame;
20class WasmFrame;
21
22class FrameInspector {
23 public:
24  FrameInspector(CommonFrame* frame, int inlined_frame_index, Isolate* isolate);
25  FrameInspector(const FrameInspector&) = delete;
26  FrameInspector& operator=(const FrameInspector&) = delete;
27
28  ~FrameInspector();
29
30  Handle<JSFunction> GetFunction() const { return function_; }
31  Handle<Script> GetScript() { return script_; }
32  Handle<Object> GetParameter(int index);
33  Handle<Object> GetExpression(int index);
34  int GetSourcePosition() { return source_position_; }
35  bool IsConstructor() { return is_constructor_; }
36  Handle<Object> GetContext();
37  Handle<Object> GetReceiver() { return receiver_; }
38
39  Handle<String> GetFunctionName();
40
41#if V8_ENABLE_WEBASSEMBLY
42  bool IsWasm();
43#endif  // V8_ENABLE_WEBASSEMBLY
44  bool IsJavaScript();
45
46  JavaScriptFrame* javascript_frame();
47
48  int inlined_frame_index() const { return inlined_frame_index_; }
49
50 private:
51  bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info,
52                                         Handle<String> parameter_name);
53
54  CommonFrame* frame_;
55  int inlined_frame_index_;
56  std::unique_ptr<DeoptimizedFrameInfo> deoptimized_frame_;
57  Isolate* isolate_;
58  Handle<Script> script_;
59  Handle<Object> receiver_;
60  Handle<JSFunction> function_;
61  int source_position_ = -1;
62  bool is_optimized_ = false;
63  bool is_constructor_ = false;
64};
65
66class RedirectActiveFunctions : public ThreadVisitor {
67 public:
68  enum class Mode {
69    kUseOriginalBytecode,
70    kUseDebugBytecode,
71  };
72
73  explicit RedirectActiveFunctions(SharedFunctionInfo shared, Mode mode);
74
75  void VisitThread(Isolate* isolate, ThreadLocalTop* top) override;
76
77 private:
78  SharedFunctionInfo shared_;
79  Mode mode_;
80  DISALLOW_GARBAGE_COLLECTION(no_gc_)
81};
82
83}  // namespace internal
84}  // namespace v8
85
86#endif  // V8_DEBUG_DEBUG_FRAMES_H_
87