blob: c04fd2b6bf6491a7b14a2a5ccddbe6f5d3323ae5 [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();
Ben Murdoch097c5b22016-05-18 11:27:45 +010024 Handle<Object> GetFunction();
25 Handle<Object> GetParameter(int index);
26 Handle<Object> GetExpression(int index);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027 int GetSourcePosition();
28 bool IsConstructor();
Ben Murdoch097c5b22016-05-18 11:27:45 +010029 Handle<Object> GetContext();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030
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_;
Ben Murdoch097c5b22016-05-18 11:27:45 +010051 bool is_interpreted_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052 bool is_bottommost_;
53 bool has_adapted_arguments_;
54
55 DISALLOW_COPY_AND_ASSIGN(FrameInspector);
56};
57
58
59class 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.
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
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_