blob: ddd26cf846630e8e76ed1dff7a1fddeb35b8b5d6 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBCommandInterpreter.cpp --------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/lldb-types.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000011#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000012#include "lldb/Core/SourceManager.h"
13#include "lldb/Core/Listener.h"
14#include "lldb/Interpreter/CommandInterpreter.h"
15#include "lldb/Interpreter/CommandReturnObject.h"
16#include "lldb/Target/Target.h"
17
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000018#include "lldb/API/SBBroadcaster.h"
19#include "lldb/API/SBDebugger.h"
20#include "lldb/API/SBCommandReturnObject.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000021#include "lldb/API/SBSourceManager.h"
22#include "lldb/API/SBCommandInterpreter.h"
23#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBTarget.h"
25#include "lldb/API/SBListener.h"
Caroline Tice7826c882010-10-26 03:11:13 +000026#include "lldb/API/SBStream.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000027#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028
29using namespace lldb;
30using namespace lldb_private;
31
32
Greg Clayton63094e02010-06-23 01:19:29 +000033SBCommandInterpreter::SBCommandInterpreter (CommandInterpreter *interpreter) :
34 m_opaque_ptr (interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +000035{
Greg Claytone005f2c2010-11-06 01:53:30 +000036 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000037
38 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +000039 log->Printf ("SBCommandInterpreter::SBCommandInterpreter (interpreter=%p)"
40 " => SBCommandInterpreter(%p)", interpreter, m_opaque_ptr);
Chris Lattner24943d22010-06-08 16:52:24 +000041}
42
Greg Clayton538eb822010-11-05 23:17:00 +000043SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs) :
44 m_opaque_ptr (rhs.m_opaque_ptr)
45{
46}
47
48const SBCommandInterpreter &
49SBCommandInterpreter::operator = (const SBCommandInterpreter &rhs)
50{
51 m_opaque_ptr = rhs.m_opaque_ptr;
52 return *this;
53}
54
Chris Lattner24943d22010-06-08 16:52:24 +000055SBCommandInterpreter::~SBCommandInterpreter ()
56{
57}
58
59bool
Greg Clayton63094e02010-06-23 01:19:29 +000060SBCommandInterpreter::IsValid() const
61{
62 return m_opaque_ptr != NULL;
63}
64
65
66bool
Chris Lattner24943d22010-06-08 16:52:24 +000067SBCommandInterpreter::CommandExists (const char *cmd)
68{
Greg Clayton63094e02010-06-23 01:19:29 +000069 if (m_opaque_ptr)
70 return m_opaque_ptr->CommandExists (cmd);
71 return false;
Chris Lattner24943d22010-06-08 16:52:24 +000072}
73
74bool
75SBCommandInterpreter::AliasExists (const char *cmd)
76{
Greg Clayton63094e02010-06-23 01:19:29 +000077 if (m_opaque_ptr)
78 return m_opaque_ptr->AliasExists (cmd);
79 return false;
Chris Lattner24943d22010-06-08 16:52:24 +000080}
81
Chris Lattner24943d22010-06-08 16:52:24 +000082lldb::ReturnStatus
83SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
84{
Greg Claytone005f2c2010-11-06 01:53:30 +000085 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000086
87 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000088 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p), add_to_history=%i)",
89 m_opaque_ptr, command_line, result.get(), add_to_history);
Caroline Tice7826c882010-10-26 03:11:13 +000090
Chris Lattner24943d22010-06-08 16:52:24 +000091 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +000092 if (m_opaque_ptr)
93 {
Greg Claytonbdcda462010-12-20 20:49:23 +000094 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
95 Mutex::Locker api_locker;
96 if (target_sp)
97 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000098 m_opaque_ptr->HandleCommand (command_line, add_to_history, result.ref());
99 }
100 else
101 {
102 result->AppendError ("SBCommandInterpreter is not valid");
103 result->SetStatus (eReturnStatusFailed);
104 }
Caroline Tice7826c882010-10-26 03:11:13 +0000105
Caroline Tice7de24cc2010-10-27 21:23:37 +0000106 // We need to get the value again, in case the command disabled the log!
107 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000108 if (log)
109 {
110 SBStream sstr;
111 result.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000112 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p): %s, add_to_history=%i) => %i",
113 m_opaque_ptr, command_line, result.get(), sstr.GetData(), add_to_history, result.GetStatus());
Caroline Tice7826c882010-10-26 03:11:13 +0000114 }
115
Chris Lattner24943d22010-06-08 16:52:24 +0000116 return result.GetStatus();
117}
118
119int
120SBCommandInterpreter::HandleCompletion (const char *current_line,
121 const char *cursor,
122 const char *last_char,
123 int match_start_point,
124 int max_return_elements,
125 SBStringList &matches)
126{
Greg Clayton63094e02010-06-23 01:19:29 +0000127 int num_completions = 0;
128 if (m_opaque_ptr)
129 {
130 lldb_private::StringList lldb_matches;
131 num_completions = m_opaque_ptr->HandleCompletion (current_line, cursor, last_char, match_start_point,
132 max_return_elements, lldb_matches);
Chris Lattner24943d22010-06-08 16:52:24 +0000133
Greg Clayton63094e02010-06-23 01:19:29 +0000134 SBStringList temp_list (&lldb_matches);
135 matches.AppendList (temp_list);
136 }
Chris Lattner24943d22010-06-08 16:52:24 +0000137 return num_completions;
138}
139
Chris Lattner24943d22010-06-08 16:52:24 +0000140bool
141SBCommandInterpreter::HasCommands ()
142{
Greg Clayton63094e02010-06-23 01:19:29 +0000143 if (m_opaque_ptr)
144 return m_opaque_ptr->HasCommands();
145 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000146}
147
148bool
149SBCommandInterpreter::HasAliases ()
150{
Greg Clayton63094e02010-06-23 01:19:29 +0000151 if (m_opaque_ptr)
152 return m_opaque_ptr->HasAliases();
153 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000154}
155
156bool
Chris Lattner24943d22010-06-08 16:52:24 +0000157SBCommandInterpreter::HasAliasOptions ()
158{
Greg Clayton63094e02010-06-23 01:19:29 +0000159 if (m_opaque_ptr)
160 return m_opaque_ptr->HasAliasOptions ();
161 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
Chris Lattner24943d22010-06-08 16:52:24 +0000164SBProcess
165SBCommandInterpreter::GetProcess ()
166{
167 SBProcess process;
Greg Clayton63094e02010-06-23 01:19:29 +0000168 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000169 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000170 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
171 if (target_sp)
172 {
173 Mutex::Locker api_locker(target_sp->GetAPIMutex());
174 process.SetProcess(target_sp->GetProcessSP());
175 }
Chris Lattner24943d22010-06-08 16:52:24 +0000176 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000177 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000178
179 if (log)
180 log->Printf ("SBCommandInterpreter(%p)::GetProcess () => SBProcess(%p)",
181 m_opaque_ptr, process.get());
182
183
Chris Lattner24943d22010-06-08 16:52:24 +0000184 return process;
185}
186
187ssize_t
188SBCommandInterpreter::WriteToScriptInterpreter (const char *src)
189{
Greg Claytona66ba462010-10-30 04:51:46 +0000190 return WriteToScriptInterpreter (src, strlen(src));
Chris Lattner24943d22010-06-08 16:52:24 +0000191}
192
193ssize_t
194SBCommandInterpreter::WriteToScriptInterpreter (const char *src, size_t src_len)
195{
Greg Claytone005f2c2010-11-06 01:53:30 +0000196 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000197
198 ssize_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000199 if (m_opaque_ptr && src && src[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000200 {
Greg Clayton63094e02010-06-23 01:19:29 +0000201 ScriptInterpreter *script_interpreter = m_opaque_ptr->GetScriptInterpreter();
Chris Lattner24943d22010-06-08 16:52:24 +0000202 if (script_interpreter)
Greg Claytona66ba462010-10-30 04:51:46 +0000203 bytes_written = ::write (script_interpreter->GetMasterFileDescriptor(), src, src_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000204 }
Greg Claytona66ba462010-10-30 04:51:46 +0000205 if (log)
206 log->Printf ("SBCommandInterpreter(%p)::WriteToScriptInterpreter (src=\"%s\", src_len=%zu) => %zi",
207 m_opaque_ptr, src, src_len, bytes_written);
208
209 return bytes_written;
Chris Lattner24943d22010-06-08 16:52:24 +0000210}
211
212
213CommandInterpreter *
Greg Clayton63094e02010-06-23 01:19:29 +0000214SBCommandInterpreter::get ()
Chris Lattner24943d22010-06-08 16:52:24 +0000215{
Greg Clayton63094e02010-06-23 01:19:29 +0000216 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000217}
218
219CommandInterpreter &
Greg Clayton63094e02010-06-23 01:19:29 +0000220SBCommandInterpreter::ref ()
Chris Lattner24943d22010-06-08 16:52:24 +0000221{
Greg Clayton63094e02010-06-23 01:19:29 +0000222 assert (m_opaque_ptr);
223 return *m_opaque_ptr;
224}
225
226void
227SBCommandInterpreter::reset (lldb_private::CommandInterpreter *interpreter)
228{
229 m_opaque_ptr = interpreter;
Chris Lattner24943d22010-06-08 16:52:24 +0000230}
231
232void
233SBCommandInterpreter::SourceInitFileInHomeDirectory (SBCommandReturnObject &result)
234{
235 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +0000236 if (m_opaque_ptr)
237 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000238 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
239 Mutex::Locker api_locker;
240 if (target_sp)
241 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000242 m_opaque_ptr->SourceInitFile (false, result.ref());
243 }
244 else
245 {
246 result->AppendError ("SBCommandInterpreter is not valid");
247 result->SetStatus (eReturnStatusFailed);
248 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000249 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000250
251 if (log)
252 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInHomeDirectory (&SBCommandReturnObject(%p))",
253 m_opaque_ptr, result.get());
254
Chris Lattner24943d22010-06-08 16:52:24 +0000255}
256
257void
258SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory (SBCommandReturnObject &result)
259{
260 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +0000261 if (m_opaque_ptr)
262 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000263 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
264 Mutex::Locker api_locker;
265 if (target_sp)
266 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000267 m_opaque_ptr->SourceInitFile (true, result.ref());
268 }
269 else
270 {
271 result->AppendError ("SBCommandInterpreter is not valid");
272 result->SetStatus (eReturnStatusFailed);
273 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000274 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000275
276 if (log)
277 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInCurrentWorkingDirectory (&SBCommandReturnObject(%p))",
278 m_opaque_ptr, result.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000279}
280
281SBBroadcaster
282SBCommandInterpreter::GetBroadcaster ()
283{
Greg Claytone005f2c2010-11-06 01:53:30 +0000284 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000285
Greg Clayton63094e02010-06-23 01:19:29 +0000286 SBBroadcaster broadcaster (m_opaque_ptr, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000287
288 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000289 log->Printf ("SBCommandInterpreter(%p)::GetBroadcaster() => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000290 m_opaque_ptr, broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000291
Chris Lattner24943d22010-06-08 16:52:24 +0000292 return broadcaster;
293}
294