blob: 419c1570170c02e26da621fd3d55df1249b5a000 [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"
23#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBTarget.h"
25#include "lldb/API/SBListener.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000026#include "lldb/API/SBStream.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000027#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028
29using namespace lldb;
30using namespace lldb_private;
31
Enrico Granata21dfcd92012-09-28 23:57:51 +000032class CommandPluginInterfaceImplementation : public CommandObjectParsed
33{
34public:
35 CommandPluginInterfaceImplementation (CommandInterpreter &interpreter,
36 const char *name,
37 lldb::SBCommandPluginInterface* backend,
38 const char *help = NULL,
39 const char *syntax = NULL,
40 uint32_t flags = 0) :
41 CommandObjectParsed (interpreter, name, help, syntax, flags),
42 m_backend(backend) {}
43
44 virtual bool
Greg Clayton3a18e312012-10-08 22:41:53 +000045 IsRemovable() const { return true; }
Enrico Granata21dfcd92012-09-28 23:57:51 +000046
47protected:
48 virtual bool
49 DoExecute (Args& command, CommandReturnObject &result)
50 {
51 SBCommandReturnObject sb_return(&result);
52 SBCommandInterpreter sb_interpreter(&m_interpreter);
53 SBDebugger debugger_sb(m_interpreter.GetDebugger().shared_from_this());
54 bool ret = m_backend->DoExecute (debugger_sb,(char**)command.GetArgumentVector(), sb_return);
55 sb_return.Release();
56 return ret;
57 }
58 lldb::SBCommandPluginInterface* m_backend;
59};
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060
Greg Clayton66111032010-06-23 01:19:29 +000061SBCommandInterpreter::SBCommandInterpreter (CommandInterpreter *interpreter) :
62 m_opaque_ptr (interpreter)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063{
Greg Clayton5160ce52013-03-27 23:08:40 +000064 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000065
66 if (log)
Greg Clayton48381312010-10-30 04:51:46 +000067 log->Printf ("SBCommandInterpreter::SBCommandInterpreter (interpreter=%p)"
68 " => SBCommandInterpreter(%p)", interpreter, m_opaque_ptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069}
70
Greg Claytonefabb122010-11-05 23:17:00 +000071SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs) :
72 m_opaque_ptr (rhs.m_opaque_ptr)
73{
74}
75
76const SBCommandInterpreter &
77SBCommandInterpreter::operator = (const SBCommandInterpreter &rhs)
78{
79 m_opaque_ptr = rhs.m_opaque_ptr;
80 return *this;
81}
82
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083SBCommandInterpreter::~SBCommandInterpreter ()
84{
85}
86
87bool
Greg Clayton66111032010-06-23 01:19:29 +000088SBCommandInterpreter::IsValid() const
89{
90 return m_opaque_ptr != NULL;
91}
92
93
94bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095SBCommandInterpreter::CommandExists (const char *cmd)
96{
Johnny Chen872e0622011-12-19 21:16:29 +000097 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +000098 return m_opaque_ptr->CommandExists (cmd);
99 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000100}
101
102bool
103SBCommandInterpreter::AliasExists (const char *cmd)
104{
Johnny Chen872e0622011-12-19 21:16:29 +0000105 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000106 return m_opaque_ptr->AliasExists (cmd);
107 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108}
109
Greg Clayton44d93782014-01-27 23:43:24 +0000110bool
111SBCommandInterpreter::IsActive ()
112{
113 if (m_opaque_ptr)
114 return m_opaque_ptr->IsActive ();
115 return false;
116}
117
118const char *
119SBCommandInterpreter::GetIOHandlerControlSequence(char ch)
120{
121 if (m_opaque_ptr)
122 return m_opaque_ptr->GetDebugger().GetTopIOHandlerControlSequence (ch).GetCString();
123 return NULL;
124}
125
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126lldb::ReturnStatus
127SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
128{
Greg Clayton5160ce52013-03-27 23:08:40 +0000129 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000130
131 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000132 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p), add_to_history=%i)",
133 m_opaque_ptr, command_line, result.get(), add_to_history);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000134
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000135 result.Clear();
Johnny Chen872e0622011-12-19 21:16:29 +0000136 if (command_line && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000137 {
Enrico Granata5f5ab602012-05-31 01:09:06 +0000138 m_opaque_ptr->HandleCommand (command_line, add_to_history ? eLazyBoolYes : eLazyBoolNo, result.ref());
Greg Clayton66111032010-06-23 01:19:29 +0000139 }
140 else
141 {
Johnny Chen872e0622011-12-19 21:16:29 +0000142 result->AppendError ("SBCommandInterpreter or the command line is not valid");
Greg Clayton66111032010-06-23 01:19:29 +0000143 result->SetStatus (eReturnStatusFailed);
144 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000145
Caroline Tice7b9da4a2010-10-27 21:23:37 +0000146 // We need to get the value again, in case the command disabled the log!
147 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000148 if (log)
149 {
150 SBStream sstr;
151 result.GetDescription (sstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000152 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p): %s, add_to_history=%i) => %i",
153 m_opaque_ptr, command_line, result.get(), sstr.GetData(), add_to_history, result.GetStatus());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000154 }
155
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156 return result.GetStatus();
157}
158
159int
160SBCommandInterpreter::HandleCompletion (const char *current_line,
161 const char *cursor,
162 const char *last_char,
163 int match_start_point,
164 int max_return_elements,
165 SBStringList &matches)
166{
Greg Clayton5160ce52013-03-27 23:08:40 +0000167 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton66111032010-06-23 01:19:29 +0000168 int num_completions = 0;
Jim Inghamac012602011-12-05 19:24:15 +0000169
170 // Sanity check the arguments that are passed in:
171 // cursor & last_char have to be within the current_line.
172 if (current_line == NULL || cursor == NULL || last_char == NULL)
173 return 0;
174
175 if (cursor < current_line || last_char < current_line)
176 return 0;
177
178 size_t current_line_size = strlen (current_line);
Saleem Abdulrasool3985c8c2014-04-02 03:51:35 +0000179 if (cursor - current_line > static_cast<ptrdiff_t>(current_line_size) ||
180 last_char - current_line > static_cast<ptrdiff_t>(current_line_size))
Jim Inghamac012602011-12-05 19:24:15 +0000181 return 0;
182
Jim Ingham389512d2012-06-26 01:21:59 +0000183 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000184 log->Printf ("SBCommandInterpreter(%p)::HandleCompletion (current_line=\"%s\", cursor at: %" PRId64 ", last char at: %" PRId64 ", match_start_point: %d, max_return_elements: %d)",
Jason Molenda24a83782012-07-17 01:57:24 +0000185 m_opaque_ptr, current_line, (uint64_t) (cursor - current_line), (uint64_t) (last_char - current_line), match_start_point, max_return_elements);
Jim Ingham389512d2012-06-26 01:21:59 +0000186
Greg Clayton66111032010-06-23 01:19:29 +0000187 if (m_opaque_ptr)
188 {
189 lldb_private::StringList lldb_matches;
190 num_completions = m_opaque_ptr->HandleCompletion (current_line, cursor, last_char, match_start_point,
191 max_return_elements, lldb_matches);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000192
Greg Clayton66111032010-06-23 01:19:29 +0000193 SBStringList temp_list (&lldb_matches);
194 matches.AppendList (temp_list);
195 }
Jim Ingham389512d2012-06-26 01:21:59 +0000196 if (log)
197 log->Printf ("SBCommandInterpreter(%p)::HandleCompletion - Found %d completions.", m_opaque_ptr, num_completions);
198
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199 return num_completions;
200}
201
Jim Ingham969795f2011-09-21 01:17:13 +0000202int
203SBCommandInterpreter::HandleCompletion (const char *current_line,
204 uint32_t cursor_pos,
205 int match_start_point,
206 int max_return_elements,
207 lldb::SBStringList &matches)
208{
209 const char *cursor = current_line + cursor_pos;
210 const char *last_char = current_line + strlen (current_line);
211 return HandleCompletion (current_line, cursor, last_char, match_start_point, max_return_elements, matches);
212}
213
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214bool
215SBCommandInterpreter::HasCommands ()
216{
Greg Clayton66111032010-06-23 01:19:29 +0000217 if (m_opaque_ptr)
218 return m_opaque_ptr->HasCommands();
219 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000220}
221
222bool
223SBCommandInterpreter::HasAliases ()
224{
Greg Clayton66111032010-06-23 01:19:29 +0000225 if (m_opaque_ptr)
226 return m_opaque_ptr->HasAliases();
227 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000228}
229
230bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000231SBCommandInterpreter::HasAliasOptions ()
232{
Greg Clayton66111032010-06-23 01:19:29 +0000233 if (m_opaque_ptr)
234 return m_opaque_ptr->HasAliasOptions ();
235 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236}
237
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238SBProcess
239SBCommandInterpreter::GetProcess ()
240{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000241 SBProcess sb_process;
242 ProcessSP process_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000243 if (m_opaque_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000244 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000245 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
246 if (target_sp)
247 {
248 Mutex::Locker api_locker(target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000249 process_sp = target_sp->GetProcessSP();
250 sb_process.SetSP(process_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000251 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000252 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000253 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000254
255 if (log)
256 log->Printf ("SBCommandInterpreter(%p)::GetProcess () => SBProcess(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000257 m_opaque_ptr, process_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000258
259
Greg Claytonb9556ac2012-01-30 07:41:31 +0000260 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261}
262
Enrico Granata21dfcd92012-09-28 23:57:51 +0000263SBDebugger
264SBCommandInterpreter::GetDebugger ()
265{
266 SBDebugger sb_debugger;
267 if (m_opaque_ptr)
268 sb_debugger.reset(m_opaque_ptr->GetDebugger().shared_from_this());
Greg Clayton5160ce52013-03-27 23:08:40 +0000269 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Enrico Granata21dfcd92012-09-28 23:57:51 +0000270
271 if (log)
272 log->Printf ("SBCommandInterpreter(%p)::GetDebugger () => SBDebugger(%p)",
273 m_opaque_ptr, sb_debugger.get());
274
275
276 return sb_debugger;
277}
278
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000279CommandInterpreter *
Greg Clayton66111032010-06-23 01:19:29 +0000280SBCommandInterpreter::get ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281{
Greg Clayton66111032010-06-23 01:19:29 +0000282 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000283}
284
285CommandInterpreter &
Greg Clayton66111032010-06-23 01:19:29 +0000286SBCommandInterpreter::ref ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000287{
Greg Clayton66111032010-06-23 01:19:29 +0000288 assert (m_opaque_ptr);
289 return *m_opaque_ptr;
290}
291
292void
293SBCommandInterpreter::reset (lldb_private::CommandInterpreter *interpreter)
294{
295 m_opaque_ptr = interpreter;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000296}
297
298void
299SBCommandInterpreter::SourceInitFileInHomeDirectory (SBCommandReturnObject &result)
300{
301 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000302 if (m_opaque_ptr)
303 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000304 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
305 Mutex::Locker api_locker;
306 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000307 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000308 m_opaque_ptr->SourceInitFile (false, result.ref());
309 }
310 else
311 {
312 result->AppendError ("SBCommandInterpreter is not valid");
313 result->SetStatus (eReturnStatusFailed);
314 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000315 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000316
317 if (log)
318 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInHomeDirectory (&SBCommandReturnObject(%p))",
319 m_opaque_ptr, result.get());
320
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321}
322
323void
324SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory (SBCommandReturnObject &result)
325{
326 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000327 if (m_opaque_ptr)
328 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000329 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
330 Mutex::Locker api_locker;
331 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000332 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000333 m_opaque_ptr->SourceInitFile (true, result.ref());
334 }
335 else
336 {
337 result->AppendError ("SBCommandInterpreter is not valid");
338 result->SetStatus (eReturnStatusFailed);
339 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000340 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000341
342 if (log)
343 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInCurrentWorkingDirectory (&SBCommandReturnObject(%p))",
344 m_opaque_ptr, result.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000345}
346
347SBBroadcaster
348SBCommandInterpreter::GetBroadcaster ()
349{
Greg Clayton5160ce52013-03-27 23:08:40 +0000350 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000351
Greg Clayton66111032010-06-23 01:19:29 +0000352 SBBroadcaster broadcaster (m_opaque_ptr, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000353
354 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000355 log->Printf ("SBCommandInterpreter(%p)::GetBroadcaster() => SBBroadcaster(%p)",
Caroline Tice750cd172010-10-26 23:49:36 +0000356 m_opaque_ptr, broadcaster.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000357
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358 return broadcaster;
359}
360
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000361const char *
362SBCommandInterpreter::GetBroadcasterClass ()
363{
364 return Communication::GetStaticBroadcasterClass().AsCString();
365}
366
Greg Clayton9d0402b2011-02-20 02:15:07 +0000367const char *
368SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
369{
370 return CommandObject::GetArgumentTypeAsCString (arg_type);
371}
372
373const char *
374SBCommandInterpreter::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
375{
376 return CommandObject::GetArgumentDescriptionAsCString (arg_type);
377}
378
Greg Claytona9f7b792012-02-29 04:21:24 +0000379bool
380SBCommandInterpreter::SetCommandOverrideCallback (const char *command_name,
381 lldb::CommandOverrideCallback callback,
382 void *baton)
383{
384 if (command_name && command_name[0] && m_opaque_ptr)
385 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000386 std::string command_name_str (command_name);
387 CommandObject *cmd_obj = m_opaque_ptr->GetCommandObjectForCommand(command_name_str);
Greg Claytona9f7b792012-02-29 04:21:24 +0000388 if (cmd_obj)
389 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000390 assert(command_name_str.empty());
Greg Claytona9f7b792012-02-29 04:21:24 +0000391 cmd_obj->SetOverrideCallback (callback, baton);
392 return true;
393 }
394 }
395 return false;
396}
Greg Clayton9d0402b2011-02-20 02:15:07 +0000397
Greg Claytondce502e2011-11-04 03:34:56 +0000398#ifndef LLDB_DISABLE_PYTHON
Enrico Granatabe93a352011-08-16 16:49:25 +0000399
Greg Claytondce502e2011-11-04 03:34:56 +0000400// Defined in the SWIG source file
401extern "C" void
402init_lldb(void);
403
Greg Clayton8afa5432013-10-17 00:27:14 +0000404// these are the Pythonic implementations of the required callbacks
405// these are scripting-language specific, which is why they belong here
406// we still need to use function pointers to them instead of relying
407// on linkage-time resolution because the SWIG stuff and this file
408// get built at different times
409extern "C" bool
410LLDBSwigPythonBreakpointCallbackFunction (const char *python_function_name,
411 const char *session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000412 const lldb::StackFrameSP& sb_frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000413 const lldb::BreakpointLocationSP& sb_bp_loc);
Enrico Granatabe93a352011-08-16 16:49:25 +0000414
Greg Clayton8afa5432013-10-17 00:27:14 +0000415extern "C" bool
416LLDBSwigPythonWatchpointCallbackFunction (const char *python_function_name,
417 const char *session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000418 const lldb::StackFrameSP& sb_frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000419 const lldb::WatchpointSP& sb_wp);
Greg Claytonfc36f7912011-03-22 01:14:58 +0000420
Greg Clayton8afa5432013-10-17 00:27:14 +0000421extern "C" bool
422LLDBSwigPythonCallTypeScript (const char *python_function_name,
423 void *session_dictionary,
424 const lldb::ValueObjectSP& valobj_sp,
425 void** pyfunct_wrapper,
426 std::string& retval);
427
428extern "C" void*
429LLDBSwigPythonCreateSyntheticProvider (const char *python_class_name,
430 const char *session_dictionary_name,
431 const lldb::ValueObjectSP& valobj_sp);
432
433
434extern "C" uint32_t
435LLDBSwigPython_CalculateNumChildren (void *implementor);
436
437extern "C" void *
438LLDBSwigPython_GetChildAtIndex (void *implementor, uint32_t idx);
439
440extern "C" int
441LLDBSwigPython_GetIndexOfChildWithName (void *implementor, const char* child_name);
442
443extern "C" void *
444LLDBSWIGPython_CastPyObjectToSBValue (void* data);
445
446extern lldb::ValueObjectSP
447LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data);
448
449extern "C" bool
450LLDBSwigPython_UpdateSynthProviderInstance (void* implementor);
451
452extern "C" bool
453LLDBSwigPython_MightHaveChildrenSynthProviderInstance (void* implementor);
454
455extern "C" bool
456LLDBSwigPythonCallCommand (const char *python_function_name,
457 const char *session_dictionary_name,
458 lldb::DebuggerSP& debugger,
459 const char* args,
460 lldb_private::CommandReturnObject &cmd_retobj);
461
462extern "C" bool
463LLDBSwigPythonCallModuleInit (const char *python_module_name,
464 const char *session_dictionary_name,
465 lldb::DebuggerSP& debugger);
466
467extern "C" void*
468LLDBSWIGPythonCreateOSPlugin (const char *python_class_name,
469 const char *session_dictionary_name,
470 const lldb::ProcessSP& process_sp);
471
472extern "C" bool
473LLDBSWIGPythonRunScriptKeywordProcess (const char* python_function_name,
474 const char* session_dictionary_name,
475 lldb::ProcessSP& process,
476 std::string& output);
477
478extern "C" bool
479LLDBSWIGPythonRunScriptKeywordThread (const char* python_function_name,
480 const char* session_dictionary_name,
481 lldb::ThreadSP& thread,
482 std::string& output);
483
484extern "C" bool
485LLDBSWIGPythonRunScriptKeywordTarget (const char* python_function_name,
486 const char* session_dictionary_name,
487 lldb::TargetSP& target,
488 std::string& output);
489
490extern "C" bool
491LLDBSWIGPythonRunScriptKeywordFrame (const char* python_function_name,
492 const char* session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000493 lldb::StackFrameSP& frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000494 std::string& output);
495
496extern "C" void*
497LLDBSWIGPython_GetDynamicSetting (void* module,
498 const char* setting,
499 const lldb::TargetSP& target_sp);
500
Greg Claytondce502e2011-11-04 03:34:56 +0000501
502#endif
503
Greg Claytonfc36f7912011-03-22 01:14:58 +0000504void
505SBCommandInterpreter::InitializeSWIG ()
506{
507 static bool g_initialized = false;
508 if (!g_initialized)
509 {
510 g_initialized = true;
Greg Claytondce502e2011-11-04 03:34:56 +0000511#ifndef LLDB_DISABLE_PYTHON
Greg Clayton8afa5432013-10-17 00:27:14 +0000512 ScriptInterpreter::InitializeInterpreter (init_lldb,
513 LLDBSwigPythonBreakpointCallbackFunction,
514 LLDBSwigPythonWatchpointCallbackFunction,
515 LLDBSwigPythonCallTypeScript,
516 LLDBSwigPythonCreateSyntheticProvider,
517 LLDBSwigPython_CalculateNumChildren,
518 LLDBSwigPython_GetChildAtIndex,
519 LLDBSwigPython_GetIndexOfChildWithName,
520 LLDBSWIGPython_CastPyObjectToSBValue,
521 LLDBSWIGPython_GetValueObjectSPFromSBValue,
522 LLDBSwigPython_UpdateSynthProviderInstance,
523 LLDBSwigPython_MightHaveChildrenSynthProviderInstance,
524 LLDBSwigPythonCallCommand,
525 LLDBSwigPythonCallModuleInit,
526 LLDBSWIGPythonCreateOSPlugin,
527 LLDBSWIGPythonRunScriptKeywordProcess,
528 LLDBSWIGPythonRunScriptKeywordThread,
529 LLDBSWIGPythonRunScriptKeywordTarget,
530 LLDBSWIGPythonRunScriptKeywordFrame,
531 LLDBSWIGPython_GetDynamicSetting);
Greg Claytondce502e2011-11-04 03:34:56 +0000532#endif
Greg Claytonfc36f7912011-03-22 01:14:58 +0000533 }
534}
Greg Claytona9f7b792012-02-29 04:21:24 +0000535
Enrico Granata21dfcd92012-09-28 23:57:51 +0000536lldb::SBCommand
537SBCommandInterpreter::AddMultiwordCommand (const char* name, const char* help)
538{
539 CommandObjectMultiword *new_command = new CommandObjectMultiword(*m_opaque_ptr,name,help);
540 new_command->SetRemovable (true);
541 lldb::CommandObjectSP new_command_sp(new_command);
542 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
543 return lldb::SBCommand(new_command_sp);
544 return lldb::SBCommand();
545}
546
547lldb::SBCommand
548SBCommandInterpreter::AddCommand (const char* name, lldb::SBCommandPluginInterface* impl, const char* help)
549{
550 lldb::CommandObjectSP new_command_sp;
551 new_command_sp.reset(new CommandPluginInterfaceImplementation(*m_opaque_ptr,name,impl,help));
552
553 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
554 return lldb::SBCommand(new_command_sp);
555 return lldb::SBCommand();
556}
557
558SBCommand::SBCommand ()
559{}
560
561SBCommand::SBCommand (lldb::CommandObjectSP cmd_sp) : m_opaque_sp (cmd_sp)
562{}
563
564bool
565SBCommand::IsValid ()
566{
567 return (bool)m_opaque_sp;
568}
569
570const char*
571SBCommand::GetName ()
572{
573 if (IsValid ())
574 return m_opaque_sp->GetCommandName ();
575 return NULL;
576}
577
578const char*
579SBCommand::GetHelp ()
580{
581 if (IsValid ())
582 return m_opaque_sp->GetHelp ();
583 return NULL;
584}
585
586lldb::SBCommand
587SBCommand::AddMultiwordCommand (const char* name, const char* help)
588{
589 if (!IsValid ())
590 return lldb::SBCommand();
591 if (m_opaque_sp->IsMultiwordObject() == false)
592 return lldb::SBCommand();
593 CommandObjectMultiword *new_command = new CommandObjectMultiword(m_opaque_sp->GetCommandInterpreter(),name,help);
594 new_command->SetRemovable (true);
595 lldb::CommandObjectSP new_command_sp(new_command);
596 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
597 return lldb::SBCommand(new_command_sp);
598 return lldb::SBCommand();
599}
600
601lldb::SBCommand
602SBCommand::AddCommand (const char* name, lldb::SBCommandPluginInterface *impl, const char* help)
603{
604 if (!IsValid ())
605 return lldb::SBCommand();
606 if (m_opaque_sp->IsMultiwordObject() == false)
607 return lldb::SBCommand();
608 lldb::CommandObjectSP new_command_sp;
609 new_command_sp.reset(new CommandPluginInterfaceImplementation(m_opaque_sp->GetCommandInterpreter(),name,impl,help));
610 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
611 return lldb::SBCommand(new_command_sp);
612 return lldb::SBCommand();
613}
614