• 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   Object* GetFunction();
25   Object* GetParameter(int index);
26   Object* GetExpression(int index);
27   int GetSourcePosition();
28   bool IsConstructor();
29   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_bottommost_;
52   bool has_adapted_arguments_;
53 
54   DISALLOW_COPY_AND_ASSIGN(FrameInspector);
55 };
56 
57 
58 class DebugFrameHelper : public AllStatic {
59  public:
60   static SaveContext* FindSavedContextForFrame(Isolate* isolate,
61                                                JavaScriptFrame* frame);
62   // Advances the iterator to the frame that matches the index and returns the
63   // inlined frame index, or -1 if not found.  Skips native JS functions.
64   static int FindIndexedNonNativeFrame(JavaScriptFrameIterator* it, int index);
65 
66   // Helper functions for wrapping and unwrapping stack frame ids.
WrapFrameId(StackFrame::Id id)67   static Smi* WrapFrameId(StackFrame::Id id) {
68     DCHECK(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
69     return Smi::FromInt(id >> 2);
70   }
71 
UnwrapFrameId(int wrapped)72   static StackFrame::Id UnwrapFrameId(int wrapped) {
73     return static_cast<StackFrame::Id>(wrapped << 2);
74   }
75 };
76 
77 }  // namespace internal
78 }  // namespace v8
79 
80 #endif  // V8_DEBUG_DEBUG_FRAMES_H_
81