Home | History | Annotate | Download | only in debug
      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(StandardFrame* frame, int inlined_jsframe_index,
     19                  Isolate* isolate);
     20 
     21   ~FrameInspector();
     22 
     23   int GetParametersCount();
     24   Handle<JSFunction> GetFunction();
     25   Handle<Script> GetScript();
     26   Handle<Object> GetParameter(int index);
     27   Handle<Object> GetExpression(int index);
     28   int GetSourcePosition();
     29   bool IsConstructor();
     30   Handle<Object> GetContext();
     31 
     32   inline JavaScriptFrame* javascript_frame() {
     33     return frame_->is_arguments_adaptor() ? ArgumentsAdaptorFrame::cast(frame_)
     34                                           : JavaScriptFrame::cast(frame_);
     35   }
     36   inline WasmFrame* wasm_frame() { return WasmFrame::cast(frame_); }
     37 
     38   JavaScriptFrame* GetArgumentsFrame() { return javascript_frame(); }
     39   void SetArgumentsFrame(StandardFrame* frame);
     40 
     41   void MaterializeStackLocals(Handle<JSObject> target,
     42                               Handle<ScopeInfo> scope_info);
     43 
     44   void MaterializeStackLocals(Handle<JSObject> target,
     45                               Handle<JSFunction> function);
     46 
     47   void UpdateStackLocalsFromMaterializedObject(Handle<JSObject> object,
     48                                                Handle<ScopeInfo> scope_info);
     49 
     50  private:
     51   bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info,
     52                                          Handle<String> parameter_name);
     53 
     54   StandardFrame* frame_;
     55   DeoptimizedFrameInfo* deoptimized_frame_;
     56   Isolate* isolate_;
     57   bool is_optimized_;
     58   bool is_interpreted_;
     59   bool is_bottommost_;
     60   bool has_adapted_arguments_;
     61 
     62   DISALLOW_COPY_AND_ASSIGN(FrameInspector);
     63 };
     64 
     65 
     66 class DebugFrameHelper : public AllStatic {
     67  public:
     68   static SaveContext* FindSavedContextForFrame(Isolate* isolate,
     69                                                StandardFrame* frame);
     70   // Advances the iterator to the frame that matches the index and returns the
     71   // inlined frame index, or -1 if not found.  Skips native JS functions.
     72   static int FindIndexedNonNativeFrame(StackTraceFrameIterator* it, int index);
     73 
     74   // Helper functions for wrapping and unwrapping stack frame ids.
     75   static Smi* WrapFrameId(StackFrame::Id id) {
     76     DCHECK(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
     77     return Smi::FromInt(id >> 2);
     78   }
     79 
     80   static StackFrame::Id UnwrapFrameId(int wrapped) {
     81     return static_cast<StackFrame::Id>(wrapped << 2);
     82   }
     83 };
     84 
     85 }  // namespace internal
     86 }  // namespace v8
     87 
     88 #endif  // V8_DEBUG_DEBUG_FRAMES_H_
     89