blob: c2a13c09ecafe100a933254a25cdd7e24d7ee072 [file] [log] [blame]
Chris Lattner30fdc8d2010-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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/lldb-types.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include "lldb/Core/SourceManager.h"
14#include "lldb/Core/Listener.h"
15#include "lldb/Interpreter/CommandInterpreter.h"
Enrico Granata21dfcd92012-09-28 23:57:51 +000016#include "lldb/Interpreter/CommandObjectMultiword.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/Interpreter/CommandReturnObject.h"
18#include "lldb/Target/Target.h"
19
Eli Friedmanca93cc12010-06-09 07:37:52 +000020#include "lldb/API/SBBroadcaster.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000021#include "lldb/API/SBCommandReturnObject.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000022#include "lldb/API/SBCommandInterpreter.h"
Ilia Kaf10e1c2015-03-21 10:53:37 +000023#include "lldb/API/SBEvent.h"
Jim Inghamffc9f1d2014-10-14 01:20:07 +000024#include "lldb/API/SBExecutionContext.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000025#include "lldb/API/SBProcess.h"
26#include "lldb/API/SBTarget.h"
27#include "lldb/API/SBListener.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000028#include "lldb/API/SBStream.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000029#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030
31using namespace lldb;
32using namespace lldb_private;
33
Jim Ingham26c7bf92014-10-11 00:38:27 +000034SBCommandInterpreterRunOptions::SBCommandInterpreterRunOptions()
35{
36 m_opaque_up.reset(new CommandInterpreterRunOptions());
37}
38
39SBCommandInterpreterRunOptions::~SBCommandInterpreterRunOptions()
40{
41
42}
43
44bool
45SBCommandInterpreterRunOptions::GetStopOnContinue () const
46{
47 return m_opaque_up->GetStopOnContinue();
48}
49
50void
51SBCommandInterpreterRunOptions::SetStopOnContinue (bool stop_on_continue)
52{
53 m_opaque_up->SetStopOnContinue(stop_on_continue);
54}
55
56bool
57SBCommandInterpreterRunOptions::GetStopOnError () const
58{
59 return m_opaque_up->GetStopOnError();
60}
61
62void
63SBCommandInterpreterRunOptions::SetStopOnError (bool stop_on_error)
64{
65 m_opaque_up->SetStopOnError(stop_on_error);
66}
67
68bool
69SBCommandInterpreterRunOptions::GetStopOnCrash () const
70{
71 return m_opaque_up->GetStopOnCrash();
72}
73
74void
75SBCommandInterpreterRunOptions::SetStopOnCrash (bool stop_on_crash)
76{
77 m_opaque_up->SetStopOnCrash(stop_on_crash);
78}
79
80bool
81SBCommandInterpreterRunOptions::GetEchoCommands () const
82{
83 return m_opaque_up->GetEchoCommands();
84}
85
86void
87SBCommandInterpreterRunOptions::SetEchoCommands (bool echo_commands)
88{
89 m_opaque_up->SetEchoCommands(echo_commands);
90}
91
92bool
93SBCommandInterpreterRunOptions::GetPrintResults () const
94{
95 return m_opaque_up->GetPrintResults();
96}
97
98void
99SBCommandInterpreterRunOptions::SetPrintResults (bool print_results)
100{
101 m_opaque_up->SetPrintResults(print_results);
102}
103
104bool
105SBCommandInterpreterRunOptions::GetAddToHistory () const
106{
107 return m_opaque_up->GetAddToHistory();
108}
109
110void
111SBCommandInterpreterRunOptions::SetAddToHistory (bool add_to_history)
112{
113 m_opaque_up->SetAddToHistory(add_to_history);
114}
115
116lldb_private::CommandInterpreterRunOptions *
117SBCommandInterpreterRunOptions::get () const
118{
119 return m_opaque_up.get();
120}
121
122lldb_private::CommandInterpreterRunOptions &
123SBCommandInterpreterRunOptions::ref () const
124{
125 return *m_opaque_up.get();
126}
127
Enrico Granata21dfcd92012-09-28 23:57:51 +0000128class CommandPluginInterfaceImplementation : public CommandObjectParsed
129{
130public:
131 CommandPluginInterfaceImplementation (CommandInterpreter &interpreter,
132 const char *name,
133 lldb::SBCommandPluginInterface* backend,
134 const char *help = NULL,
135 const char *syntax = NULL,
136 uint32_t flags = 0) :
137 CommandObjectParsed (interpreter, name, help, syntax, flags),
138 m_backend(backend) {}
139
140 virtual bool
Greg Clayton3a18e312012-10-08 22:41:53 +0000141 IsRemovable() const { return true; }
Enrico Granata21dfcd92012-09-28 23:57:51 +0000142
143protected:
144 virtual bool
145 DoExecute (Args& command, CommandReturnObject &result)
146 {
147 SBCommandReturnObject sb_return(&result);
148 SBCommandInterpreter sb_interpreter(&m_interpreter);
149 SBDebugger debugger_sb(m_interpreter.GetDebugger().shared_from_this());
150 bool ret = m_backend->DoExecute (debugger_sb,(char**)command.GetArgumentVector(), sb_return);
151 sb_return.Release();
152 return ret;
153 }
154 lldb::SBCommandPluginInterface* m_backend;
155};
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156
Greg Clayton66111032010-06-23 01:19:29 +0000157SBCommandInterpreter::SBCommandInterpreter (CommandInterpreter *interpreter) :
158 m_opaque_ptr (interpreter)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000159{
Greg Clayton5160ce52013-03-27 23:08:40 +0000160 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000161
162 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000163 log->Printf ("SBCommandInterpreter::SBCommandInterpreter (interpreter=%p)"
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000164 " => SBCommandInterpreter(%p)",
165 static_cast<void*>(interpreter),
166 static_cast<void*>(m_opaque_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000167}
168
Greg Claytonefabb122010-11-05 23:17:00 +0000169SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs) :
170 m_opaque_ptr (rhs.m_opaque_ptr)
171{
172}
173
174const SBCommandInterpreter &
175SBCommandInterpreter::operator = (const SBCommandInterpreter &rhs)
176{
177 m_opaque_ptr = rhs.m_opaque_ptr;
178 return *this;
179}
180
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181SBCommandInterpreter::~SBCommandInterpreter ()
182{
183}
184
185bool
Greg Clayton66111032010-06-23 01:19:29 +0000186SBCommandInterpreter::IsValid() const
187{
188 return m_opaque_ptr != NULL;
189}
190
191
192bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193SBCommandInterpreter::CommandExists (const char *cmd)
194{
Johnny Chen872e0622011-12-19 21:16:29 +0000195 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000196 return m_opaque_ptr->CommandExists (cmd);
197 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198}
199
200bool
201SBCommandInterpreter::AliasExists (const char *cmd)
202{
Johnny Chen872e0622011-12-19 21:16:29 +0000203 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000204 return m_opaque_ptr->AliasExists (cmd);
205 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000206}
207
Greg Clayton44d93782014-01-27 23:43:24 +0000208bool
209SBCommandInterpreter::IsActive ()
210{
211 if (m_opaque_ptr)
212 return m_opaque_ptr->IsActive ();
213 return false;
214}
215
216const char *
217SBCommandInterpreter::GetIOHandlerControlSequence(char ch)
218{
219 if (m_opaque_ptr)
220 return m_opaque_ptr->GetDebugger().GetTopIOHandlerControlSequence (ch).GetCString();
221 return NULL;
222}
223
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000224lldb::ReturnStatus
225SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
226{
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000227 SBExecutionContext sb_exe_ctx;
228 return HandleCommand (command_line, sb_exe_ctx, result, add_to_history);
229}
230
231lldb::ReturnStatus
232SBCommandInterpreter::HandleCommand (const char *command_line, SBExecutionContext &override_context, SBCommandReturnObject &result, bool add_to_history)
233{
Greg Clayton5160ce52013-03-27 23:08:40 +0000234 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000235
236 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000237 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p), add_to_history=%i)",
238 static_cast<void*>(m_opaque_ptr), command_line,
239 static_cast<void*>(result.get()), add_to_history);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000240
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000241 ExecutionContext ctx, *ctx_ptr;
242 if (override_context.get())
243 {
244 ctx = override_context.get()->Lock(true);
245 ctx_ptr = &ctx;
246 }
247 else
248 ctx_ptr = nullptr;
249
250
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000251 result.Clear();
Johnny Chen872e0622011-12-19 21:16:29 +0000252 if (command_line && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000253 {
Greg Clayton45a44f32014-07-15 00:25:59 +0000254 result.ref().SetInteractive(false);
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000255 m_opaque_ptr->HandleCommand (command_line, add_to_history ? eLazyBoolYes : eLazyBoolNo, result.ref(), ctx_ptr);
Greg Clayton66111032010-06-23 01:19:29 +0000256 }
257 else
258 {
Johnny Chen872e0622011-12-19 21:16:29 +0000259 result->AppendError ("SBCommandInterpreter or the command line is not valid");
Greg Clayton66111032010-06-23 01:19:29 +0000260 result->SetStatus (eReturnStatusFailed);
261 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000262
Caroline Tice7b9da4a2010-10-27 21:23:37 +0000263 // We need to get the value again, in case the command disabled the log!
264 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000265 if (log)
266 {
267 SBStream sstr;
268 result.GetDescription (sstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000269 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p): %s, add_to_history=%i) => %i",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000270 static_cast<void*>(m_opaque_ptr), command_line,
271 static_cast<void*>(result.get()), sstr.GetData(),
272 add_to_history, result.GetStatus());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000273 }
274
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000275 return result.GetStatus();
276}
277
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000278void
279SBCommandInterpreter::HandleCommandsFromFile (lldb::SBFileSpec &file,
280 lldb::SBExecutionContext &override_context,
281 lldb::SBCommandInterpreterRunOptions &options,
282 lldb::SBCommandReturnObject result)
283{
284 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
285
286 if (log)
287 {
288 SBStream s;
289 file.GetDescription (s);
290 log->Printf ("SBCommandInterpreter(%p)::HandleCommandsFromFile (file=\"%s\", SBCommandReturnObject(%p))",
291 static_cast<void*>(m_opaque_ptr), s.GetData(),
292 static_cast<void*>(result.get()));
293 }
294
295 if (!m_opaque_ptr)
296 {
297 result->AppendError ("SBCommandInterpreter is not valid.");
298 result->SetStatus (eReturnStatusFailed);
299 return;
300 }
301
302 if (!file.IsValid())
303 {
304 SBStream s;
305 file.GetDescription (s);
306 result->AppendErrorWithFormat ("File is not valid: %s.", s.GetData());
307 result->SetStatus (eReturnStatusFailed);
308 }
309
310 FileSpec tmp_spec = file.ref();
311 ExecutionContext ctx, *ctx_ptr;
312 if (override_context.get())
313 {
314 ctx = override_context.get()->Lock(true);
315 ctx_ptr = &ctx;
316 }
317 else
318 ctx_ptr = nullptr;
319
320
321 m_opaque_ptr->HandleCommandsFromFile (tmp_spec, ctx_ptr, options.ref(), result.ref());
322
323}
324
325
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000326int
327SBCommandInterpreter::HandleCompletion (const char *current_line,
328 const char *cursor,
329 const char *last_char,
330 int match_start_point,
331 int max_return_elements,
332 SBStringList &matches)
333{
Greg Clayton5160ce52013-03-27 23:08:40 +0000334 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton66111032010-06-23 01:19:29 +0000335 int num_completions = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000336
Jim Inghamac012602011-12-05 19:24:15 +0000337 // Sanity check the arguments that are passed in:
338 // cursor & last_char have to be within the current_line.
339 if (current_line == NULL || cursor == NULL || last_char == NULL)
340 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000341
Jim Inghamac012602011-12-05 19:24:15 +0000342 if (cursor < current_line || last_char < current_line)
343 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000344
Jim Inghamac012602011-12-05 19:24:15 +0000345 size_t current_line_size = strlen (current_line);
Saleem Abdulrasool3985c8c2014-04-02 03:51:35 +0000346 if (cursor - current_line > static_cast<ptrdiff_t>(current_line_size) ||
347 last_char - current_line > static_cast<ptrdiff_t>(current_line_size))
Jim Inghamac012602011-12-05 19:24:15 +0000348 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000349
Jim Ingham389512d2012-06-26 01:21:59 +0000350 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000351 log->Printf ("SBCommandInterpreter(%p)::HandleCompletion (current_line=\"%s\", cursor at: %" PRId64 ", last char at: %" PRId64 ", match_start_point: %d, max_return_elements: %d)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000352 static_cast<void*>(m_opaque_ptr), current_line,
353 static_cast<uint64_t>(cursor - current_line),
354 static_cast<uint64_t>(last_char - current_line),
355 match_start_point, max_return_elements);
356
Greg Clayton66111032010-06-23 01:19:29 +0000357 if (m_opaque_ptr)
358 {
359 lldb_private::StringList lldb_matches;
360 num_completions = m_opaque_ptr->HandleCompletion (current_line, cursor, last_char, match_start_point,
361 max_return_elements, lldb_matches);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362
Greg Clayton66111032010-06-23 01:19:29 +0000363 SBStringList temp_list (&lldb_matches);
364 matches.AppendList (temp_list);
365 }
Jim Ingham389512d2012-06-26 01:21:59 +0000366 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000367 log->Printf ("SBCommandInterpreter(%p)::HandleCompletion - Found %d completions.",
368 static_cast<void*>(m_opaque_ptr), num_completions);
369
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370 return num_completions;
371}
372
Jim Ingham969795f2011-09-21 01:17:13 +0000373int
374SBCommandInterpreter::HandleCompletion (const char *current_line,
375 uint32_t cursor_pos,
376 int match_start_point,
377 int max_return_elements,
378 lldb::SBStringList &matches)
379{
380 const char *cursor = current_line + cursor_pos;
381 const char *last_char = current_line + strlen (current_line);
382 return HandleCompletion (current_line, cursor, last_char, match_start_point, max_return_elements, matches);
383}
384
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385bool
386SBCommandInterpreter::HasCommands ()
387{
Greg Clayton66111032010-06-23 01:19:29 +0000388 if (m_opaque_ptr)
389 return m_opaque_ptr->HasCommands();
390 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391}
392
393bool
394SBCommandInterpreter::HasAliases ()
395{
Greg Clayton66111032010-06-23 01:19:29 +0000396 if (m_opaque_ptr)
397 return m_opaque_ptr->HasAliases();
398 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399}
400
401bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000402SBCommandInterpreter::HasAliasOptions ()
403{
Greg Clayton66111032010-06-23 01:19:29 +0000404 if (m_opaque_ptr)
405 return m_opaque_ptr->HasAliasOptions ();
406 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000407}
408
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000409SBProcess
410SBCommandInterpreter::GetProcess ()
411{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000412 SBProcess sb_process;
413 ProcessSP process_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000414 if (m_opaque_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000416 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
417 if (target_sp)
418 {
419 Mutex::Locker api_locker(target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000420 process_sp = target_sp->GetProcessSP();
421 sb_process.SetSP(process_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000422 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000424 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000425
426 if (log)
427 log->Printf ("SBCommandInterpreter(%p)::GetProcess () => SBProcess(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000428 static_cast<void*>(m_opaque_ptr),
429 static_cast<void*>(process_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000430
Greg Claytonb9556ac2012-01-30 07:41:31 +0000431 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000432}
433
Enrico Granata21dfcd92012-09-28 23:57:51 +0000434SBDebugger
435SBCommandInterpreter::GetDebugger ()
436{
437 SBDebugger sb_debugger;
438 if (m_opaque_ptr)
439 sb_debugger.reset(m_opaque_ptr->GetDebugger().shared_from_this());
Greg Clayton5160ce52013-03-27 23:08:40 +0000440 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000441
Enrico Granata21dfcd92012-09-28 23:57:51 +0000442 if (log)
443 log->Printf ("SBCommandInterpreter(%p)::GetDebugger () => SBDebugger(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000444 static_cast<void*>(m_opaque_ptr),
445 static_cast<void*>(sb_debugger.get()));
446
Enrico Granata21dfcd92012-09-28 23:57:51 +0000447 return sb_debugger;
448}
449
Ilia Kacf28be2015-03-23 22:45:13 +0000450bool
451SBCommandInterpreter::GetPromptOnQuit()
452{
453 if (m_opaque_ptr)
454 return m_opaque_ptr->GetPromptOnQuit();
455 return false;
456}
457
458void
459SBCommandInterpreter::SetPromptOnQuit (bool b)
460{
461 if (m_opaque_ptr)
462 m_opaque_ptr->SetPromptOnQuit(b);
463}
464
Adrian McCarthy2304b6f2015-04-23 20:00:25 +0000465void
466SBCommandInterpreter::ResolveCommand(const char *command_line, SBCommandReturnObject &result)
467{
468 result.Clear();
469 if (command_line && m_opaque_ptr)
470 {
471 m_opaque_ptr->ResolveCommand(command_line, result.ref());
472 }
473 else
474 {
475 result->AppendError("SBCommandInterpreter or the command line is not valid");
476 result->SetStatus(eReturnStatusFailed);
477 }
478}
479
480
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481CommandInterpreter *
Greg Clayton66111032010-06-23 01:19:29 +0000482SBCommandInterpreter::get ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000483{
Greg Clayton66111032010-06-23 01:19:29 +0000484 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485}
486
487CommandInterpreter &
Greg Clayton66111032010-06-23 01:19:29 +0000488SBCommandInterpreter::ref ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489{
Greg Clayton66111032010-06-23 01:19:29 +0000490 assert (m_opaque_ptr);
491 return *m_opaque_ptr;
492}
493
494void
495SBCommandInterpreter::reset (lldb_private::CommandInterpreter *interpreter)
496{
497 m_opaque_ptr = interpreter;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498}
499
500void
501SBCommandInterpreter::SourceInitFileInHomeDirectory (SBCommandReturnObject &result)
502{
503 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000504 if (m_opaque_ptr)
505 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000506 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
507 Mutex::Locker api_locker;
508 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000509 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000510 m_opaque_ptr->SourceInitFile (false, result.ref());
511 }
512 else
513 {
514 result->AppendError ("SBCommandInterpreter is not valid");
515 result->SetStatus (eReturnStatusFailed);
516 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000517 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000518
519 if (log)
520 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInHomeDirectory (&SBCommandReturnObject(%p))",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000521 static_cast<void*>(m_opaque_ptr),
522 static_cast<void*>(result.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000523}
524
525void
526SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory (SBCommandReturnObject &result)
527{
528 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000529 if (m_opaque_ptr)
530 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000531 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
532 Mutex::Locker api_locker;
533 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000534 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000535 m_opaque_ptr->SourceInitFile (true, result.ref());
536 }
537 else
538 {
539 result->AppendError ("SBCommandInterpreter is not valid");
540 result->SetStatus (eReturnStatusFailed);
541 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000542 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000543
544 if (log)
545 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInCurrentWorkingDirectory (&SBCommandReturnObject(%p))",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000546 static_cast<void*>(m_opaque_ptr),
547 static_cast<void*>(result.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000548}
549
550SBBroadcaster
551SBCommandInterpreter::GetBroadcaster ()
552{
Greg Clayton5160ce52013-03-27 23:08:40 +0000553 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000554
Greg Clayton66111032010-06-23 01:19:29 +0000555 SBBroadcaster broadcaster (m_opaque_ptr, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000556
557 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000558 log->Printf ("SBCommandInterpreter(%p)::GetBroadcaster() => SBBroadcaster(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000559 static_cast<void*>(m_opaque_ptr), static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000560
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000561 return broadcaster;
562}
563
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000564const char *
565SBCommandInterpreter::GetBroadcasterClass ()
566{
Ilia K8a00a562015-03-17 16:54:52 +0000567 return CommandInterpreter::GetStaticBroadcasterClass().AsCString();
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000568}
569
Greg Clayton9d0402b2011-02-20 02:15:07 +0000570const char *
571SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
572{
573 return CommandObject::GetArgumentTypeAsCString (arg_type);
574}
575
576const char *
577SBCommandInterpreter::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
578{
579 return CommandObject::GetArgumentDescriptionAsCString (arg_type);
580}
581
Greg Claytona9f7b792012-02-29 04:21:24 +0000582bool
Ilia Kaf10e1c2015-03-21 10:53:37 +0000583SBCommandInterpreter::EventIsCommandInterpreterEvent (const lldb::SBEvent &event)
584{
Ilia Kf9e5dc12015-03-21 11:11:07 +0000585 return event.GetBroadcasterClass() == SBCommandInterpreter::GetBroadcasterClass();
Ilia Kaf10e1c2015-03-21 10:53:37 +0000586}
587
588bool
Greg Claytona9f7b792012-02-29 04:21:24 +0000589SBCommandInterpreter::SetCommandOverrideCallback (const char *command_name,
590 lldb::CommandOverrideCallback callback,
591 void *baton)
592{
593 if (command_name && command_name[0] && m_opaque_ptr)
594 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000595 std::string command_name_str (command_name);
596 CommandObject *cmd_obj = m_opaque_ptr->GetCommandObjectForCommand(command_name_str);
Greg Claytona9f7b792012-02-29 04:21:24 +0000597 if (cmd_obj)
598 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000599 assert(command_name_str.empty());
Greg Claytona9f7b792012-02-29 04:21:24 +0000600 cmd_obj->SetOverrideCallback (callback, baton);
601 return true;
602 }
603 }
604 return false;
605}
Greg Clayton9d0402b2011-02-20 02:15:07 +0000606
Enrico Granata21dfcd92012-09-28 23:57:51 +0000607lldb::SBCommand
608SBCommandInterpreter::AddMultiwordCommand (const char* name, const char* help)
609{
610 CommandObjectMultiword *new_command = new CommandObjectMultiword(*m_opaque_ptr,name,help);
611 new_command->SetRemovable (true);
612 lldb::CommandObjectSP new_command_sp(new_command);
613 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
614 return lldb::SBCommand(new_command_sp);
615 return lldb::SBCommand();
616}
617
618lldb::SBCommand
619SBCommandInterpreter::AddCommand (const char* name, lldb::SBCommandPluginInterface* impl, const char* help)
620{
621 lldb::CommandObjectSP new_command_sp;
622 new_command_sp.reset(new CommandPluginInterfaceImplementation(*m_opaque_ptr,name,impl,help));
623
624 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
625 return lldb::SBCommand(new_command_sp);
626 return lldb::SBCommand();
627}
628
629SBCommand::SBCommand ()
630{}
631
632SBCommand::SBCommand (lldb::CommandObjectSP cmd_sp) : m_opaque_sp (cmd_sp)
633{}
634
635bool
636SBCommand::IsValid ()
637{
638 return (bool)m_opaque_sp;
639}
640
641const char*
642SBCommand::GetName ()
643{
644 if (IsValid ())
645 return m_opaque_sp->GetCommandName ();
646 return NULL;
647}
648
649const char*
650SBCommand::GetHelp ()
651{
652 if (IsValid ())
653 return m_opaque_sp->GetHelp ();
654 return NULL;
655}
656
Enrico Granatacc342da2015-03-13 22:32:11 +0000657const char*
658SBCommand::GetHelpLong ()
659{
660 if (IsValid ())
661 return m_opaque_sp->GetHelpLong ();
662 return NULL;
663}
664
665void
666SBCommand::SetHelp (const char* help)
667{
668 if (IsValid())
669 m_opaque_sp->SetHelp(help);
670}
671
672void
673SBCommand::SetHelpLong (const char* help)
674{
675 if (IsValid())
676 m_opaque_sp->SetHelpLong(help);
677}
678
Enrico Granata21dfcd92012-09-28 23:57:51 +0000679lldb::SBCommand
680SBCommand::AddMultiwordCommand (const char* name, const char* help)
681{
682 if (!IsValid ())
683 return lldb::SBCommand();
684 if (m_opaque_sp->IsMultiwordObject() == false)
685 return lldb::SBCommand();
686 CommandObjectMultiword *new_command = new CommandObjectMultiword(m_opaque_sp->GetCommandInterpreter(),name,help);
687 new_command->SetRemovable (true);
688 lldb::CommandObjectSP new_command_sp(new_command);
689 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
690 return lldb::SBCommand(new_command_sp);
691 return lldb::SBCommand();
692}
693
694lldb::SBCommand
695SBCommand::AddCommand (const char* name, lldb::SBCommandPluginInterface *impl, const char* help)
696{
697 if (!IsValid ())
698 return lldb::SBCommand();
699 if (m_opaque_sp->IsMultiwordObject() == false)
700 return lldb::SBCommand();
701 lldb::CommandObjectSP new_command_sp;
702 new_command_sp.reset(new CommandPluginInterfaceImplementation(m_opaque_sp->GetCommandInterpreter(),name,impl,help));
703 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
704 return lldb::SBCommand(new_command_sp);
705 return lldb::SBCommand();
706}
Enrico Granatae87764f2015-05-27 05:04:35 +0000707
708uint32_t
709SBCommand::GetFlags ()
710{
711 if (!IsValid())
712 return 0;
713 return m_opaque_sp->GetFlags().Get();
714}
715
716void
717SBCommand::SetFlags (uint32_t flags)
718{
719 if (IsValid())
720 m_opaque_sp->GetFlags().Set(flags);
721}