1*30fdc8d8SChris Lattner //===-- CommandObjectFrame.cpp ----------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "CommandObjectFrame.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner // C Includes
13*30fdc8d8SChris Lattner // C++ Includes
14*30fdc8d8SChris Lattner // Other libraries and framework includes
15*30fdc8d8SChris Lattner // Project includes
16*30fdc8d8SChris Lattner #include "lldb/Core/Args.h"
17*30fdc8d8SChris Lattner #include "lldb/Core/Debugger.h"
18*30fdc8d8SChris Lattner #include "lldb/Core/Timer.h"
19*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandContext.h"
20*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
21*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
22*30fdc8d8SChris Lattner #include "lldb/Target/Process.h"
23*30fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
24*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
25*30fdc8d8SChris Lattner 
26*30fdc8d8SChris Lattner #include "CommandObjectThread.h"
27*30fdc8d8SChris Lattner 
28*30fdc8d8SChris Lattner using namespace lldb;
29*30fdc8d8SChris Lattner using namespace lldb_private;
30*30fdc8d8SChris Lattner 
31*30fdc8d8SChris Lattner #pragma mark CommandObjectFrameInfo
32*30fdc8d8SChris Lattner 
33*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
34*30fdc8d8SChris Lattner // CommandObjectFrameInfo
35*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
36*30fdc8d8SChris Lattner 
37*30fdc8d8SChris Lattner class CommandObjectFrameInfo : public CommandObject
38*30fdc8d8SChris Lattner {
39*30fdc8d8SChris Lattner public:
40*30fdc8d8SChris Lattner 
41*30fdc8d8SChris Lattner     CommandObjectFrameInfo () :
42*30fdc8d8SChris Lattner     CommandObject ("frame info",
43*30fdc8d8SChris Lattner                    "Lists information about the currently selected frame in the current thread.",
44*30fdc8d8SChris Lattner                    "frame info",
45*30fdc8d8SChris Lattner                    eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
46*30fdc8d8SChris Lattner     {
47*30fdc8d8SChris Lattner     }
48*30fdc8d8SChris Lattner 
49*30fdc8d8SChris Lattner     ~CommandObjectFrameInfo ()
50*30fdc8d8SChris Lattner     {
51*30fdc8d8SChris Lattner     }
52*30fdc8d8SChris Lattner 
53*30fdc8d8SChris Lattner     bool
54*30fdc8d8SChris Lattner     Execute (Args& command,
55*30fdc8d8SChris Lattner              CommandContext *context,
56*30fdc8d8SChris Lattner              CommandInterpreter *interpreter,
57*30fdc8d8SChris Lattner              CommandReturnObject &result)
58*30fdc8d8SChris Lattner     {
59*30fdc8d8SChris Lattner         ExecutionContext exe_ctx(context->GetExecutionContext());
60*30fdc8d8SChris Lattner         if (exe_ctx.frame)
61*30fdc8d8SChris Lattner         {
62*30fdc8d8SChris Lattner             exe_ctx.frame->Dump (&result.GetOutputStream(), true);
63*30fdc8d8SChris Lattner             result.GetOutputStream().EOL();
64*30fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishResult);
65*30fdc8d8SChris Lattner         }
66*30fdc8d8SChris Lattner         else
67*30fdc8d8SChris Lattner         {
68*30fdc8d8SChris Lattner             result.AppendError ("no current frame");
69*30fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
70*30fdc8d8SChris Lattner         }
71*30fdc8d8SChris Lattner         return result.Succeeded();
72*30fdc8d8SChris Lattner     }
73*30fdc8d8SChris Lattner };
74*30fdc8d8SChris Lattner 
75*30fdc8d8SChris Lattner #pragma mark CommandObjectFrameSelect
76*30fdc8d8SChris Lattner 
77*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
78*30fdc8d8SChris Lattner // CommandObjectFrameSelect
79*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
80*30fdc8d8SChris Lattner 
81*30fdc8d8SChris Lattner class CommandObjectFrameSelect : public CommandObject
82*30fdc8d8SChris Lattner {
83*30fdc8d8SChris Lattner public:
84*30fdc8d8SChris Lattner 
85*30fdc8d8SChris Lattner     CommandObjectFrameSelect () :
86*30fdc8d8SChris Lattner     CommandObject ("frame select",
87*30fdc8d8SChris Lattner                    "Select the current frame by index in the current thread.",
88*30fdc8d8SChris Lattner                    "frame select <frame-index>",
89*30fdc8d8SChris Lattner                    eFlagProcessMustBeLaunched | eFlagProcessMustBePaused)
90*30fdc8d8SChris Lattner     {
91*30fdc8d8SChris Lattner     }
92*30fdc8d8SChris Lattner 
93*30fdc8d8SChris Lattner     ~CommandObjectFrameSelect ()
94*30fdc8d8SChris Lattner     {
95*30fdc8d8SChris Lattner     }
96*30fdc8d8SChris Lattner 
97*30fdc8d8SChris Lattner     bool
98*30fdc8d8SChris Lattner     Execute (Args& command,
99*30fdc8d8SChris Lattner              CommandContext *context,
100*30fdc8d8SChris Lattner              CommandInterpreter *interpreter,
101*30fdc8d8SChris Lattner              CommandReturnObject &result)
102*30fdc8d8SChris Lattner     {
103*30fdc8d8SChris Lattner         ExecutionContext exe_ctx (context->GetExecutionContext());
104*30fdc8d8SChris Lattner         if (exe_ctx.thread)
105*30fdc8d8SChris Lattner         {
106*30fdc8d8SChris Lattner             if (command.GetArgumentCount() == 1)
107*30fdc8d8SChris Lattner             {
108*30fdc8d8SChris Lattner                 const char *frame_idx_cstr = command.GetArgumentAtIndex(0);
109*30fdc8d8SChris Lattner 
110*30fdc8d8SChris Lattner                 const uint32_t num_frames = exe_ctx.thread->GetStackFrameCount();
111*30fdc8d8SChris Lattner                 const uint32_t frame_idx = Args::StringToUInt32 (frame_idx_cstr, UINT32_MAX, 0);
112*30fdc8d8SChris Lattner                 if (frame_idx < num_frames)
113*30fdc8d8SChris Lattner                 {
114*30fdc8d8SChris Lattner                     exe_ctx.thread->SetCurrentFrameByIndex (frame_idx);
115*30fdc8d8SChris Lattner                     exe_ctx.frame = exe_ctx.thread->GetCurrentFrame ().get();
116*30fdc8d8SChris Lattner 
117*30fdc8d8SChris Lattner                     if (exe_ctx.frame)
118*30fdc8d8SChris Lattner                     {
119*30fdc8d8SChris Lattner                         if (DisplayFrameForExecutionContext (exe_ctx.thread,
120*30fdc8d8SChris Lattner                                                              exe_ctx.frame,
121*30fdc8d8SChris Lattner                                                              interpreter,
122*30fdc8d8SChris Lattner                                                              result.GetOutputStream(),
123*30fdc8d8SChris Lattner                                                              true,
124*30fdc8d8SChris Lattner                                                              true,
125*30fdc8d8SChris Lattner                                                              3,
126*30fdc8d8SChris Lattner                                                              3))
127*30fdc8d8SChris Lattner                         {
128*30fdc8d8SChris Lattner                             result.SetStatus (eReturnStatusSuccessFinishResult);
129*30fdc8d8SChris Lattner                             return result.Succeeded();
130*30fdc8d8SChris Lattner                         }
131*30fdc8d8SChris Lattner                     }
132*30fdc8d8SChris Lattner                 }
133*30fdc8d8SChris Lattner                 if (frame_idx == UINT32_MAX)
134*30fdc8d8SChris Lattner                     result.AppendErrorWithFormat ("Invalid frame index: %s.\n", frame_idx_cstr);
135*30fdc8d8SChris Lattner                 else
136*30fdc8d8SChris Lattner                     result.AppendErrorWithFormat ("Frame index (%u) out of range.\n", frame_idx);
137*30fdc8d8SChris Lattner             }
138*30fdc8d8SChris Lattner             else
139*30fdc8d8SChris Lattner             {
140*30fdc8d8SChris Lattner                 result.AppendError ("invalid arguments");
141*30fdc8d8SChris Lattner                 result.AppendErrorWithFormat ("Usage: %s\n", m_cmd_syntax.c_str());
142*30fdc8d8SChris Lattner             }
143*30fdc8d8SChris Lattner         }
144*30fdc8d8SChris Lattner         else
145*30fdc8d8SChris Lattner         {
146*30fdc8d8SChris Lattner             result.AppendError ("no current thread");
147*30fdc8d8SChris Lattner         }
148*30fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
149*30fdc8d8SChris Lattner         return false;
150*30fdc8d8SChris Lattner     }
151*30fdc8d8SChris Lattner };
152*30fdc8d8SChris Lattner 
153*30fdc8d8SChris Lattner #pragma mark CommandObjectMultiwordFrame
154*30fdc8d8SChris Lattner 
155*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
156*30fdc8d8SChris Lattner // CommandObjectMultiwordFrame
157*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
158*30fdc8d8SChris Lattner 
159*30fdc8d8SChris Lattner CommandObjectMultiwordFrame::CommandObjectMultiwordFrame (CommandInterpreter *interpreter) :
160*30fdc8d8SChris Lattner     CommandObjectMultiword ("frame",
161*30fdc8d8SChris Lattner                             "A set of commands for operating on the current thread's frames.",
162*30fdc8d8SChris Lattner                             "frame <subcommand> [<subcommand-options>]")
163*30fdc8d8SChris Lattner {
164*30fdc8d8SChris Lattner     LoadSubCommand (CommandObjectSP (new CommandObjectFrameInfo ()), "info", interpreter);
165*30fdc8d8SChris Lattner     LoadSubCommand (CommandObjectSP (new CommandObjectFrameSelect ()), "select", interpreter);
166*30fdc8d8SChris Lattner }
167*30fdc8d8SChris Lattner 
168*30fdc8d8SChris Lattner CommandObjectMultiwordFrame::~CommandObjectMultiwordFrame ()
169*30fdc8d8SChris Lattner {
170*30fdc8d8SChris Lattner }
171*30fdc8d8SChris Lattner 
172