• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "src/deoptimizer.h"
9 #include "src/frames.h"
10 #include "src/isolate.h"
11 #include "src/objects.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 class FrameInspector {
17  public:
18   FrameInspector(JavaScriptFrame* frame, int inlined_jsframe_index,
19                  Isolate* isolate);
20 
21   ~FrameInspector();
22 
23   int GetParametersCount();
24   Handle<Object> GetFunction();
25   Handle<Object> GetParameter(int index);
26   Handle<Object> GetExpression(int index);
27   int GetSourcePosition();
28   bool IsConstructor();
29   Handle<Object> GetContext();
30 
GetArgumentsFrame()31   JavaScriptFrame* GetArgumentsFrame() { return frame_; }
32   void SetArgumentsFrame(JavaScriptFrame* frame);
33 
34   void MaterializeStackLocals(Handle<JSObject> target,
35                               Handle<ScopeInfo> scope_info);
36 
37   void MaterializeStackLocals(Handle<JSObject> target,
38                               Handle<JSFunction> function);
39 
40   void UpdateStackLocalsFromMaterializedObject(Handle<JSObject> object,
41                                                Handle<ScopeInfo> scope_info);
42 
43  private:
44   bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info,
45                                          Handle<String> parameter_name);
46 
47   JavaScriptFrame* frame_;
48   DeoptimizedFrameInfo* deoptimized_frame_;
49   Isolate* isolate_;
50   bool is_optimized_;
51   bool is_interpreted_;
52   bool is_bottommost_;
53   bool has_adapted_arguments_;
54 
55   DISALLOW_COPY_AND_ASSIGN(FrameInspector);
56 };
57 
58 
59 class DebugFrameHelper : public AllStatic {
60  public:
61   static SaveContext* FindSavedContextForFrame(Isolate* isolate,
62                                                JavaScriptFrame* frame);
63   // Advances the iterator to the frame that matches the index and returns the
64   // inlined frame index, or -1 if not found.  Skips native JS functions.
65   static int FindIndexedNonNativeFrame(JavaScriptFrameIterator* it, int index);
66 
67   // Helper functions for wrapping and unwrapping stack frame ids.
WrapFrameId(StackFrame::Id id)68   static Smi* WrapFrameId(StackFrame::Id id) {
69     DCHECK(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
70     return Smi::FromInt(id >> 2);
71   }
72 
UnwrapFrameId(int wrapped)73   static StackFrame::Id UnwrapFrameId(int wrapped) {
74     return static_cast<StackFrame::Id>(wrapped << 2);
75   }
76 };
77 
78 }  // namespace internal
79 }  // namespace v8
80 
81 #endif  // V8_DEBUG_DEBUG_FRAMES_H_
82