blob: c0d20bbd1d1f45a2b443d74589ec642ddf4b627c [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
13namespace v8 {
14namespace internal {
15
16class 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
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
58class 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.
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
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_