blob: 9f6f4e8d42835005f8702660533c2c5ed6346ed5 [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)"
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000068 " => SBCommandInterpreter(%p)",
69 static_cast<void*>(interpreter),
70 static_cast<void*>(m_opaque_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071}
72
Greg Claytonefabb122010-11-05 23:17:00 +000073SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs) :
74 m_opaque_ptr (rhs.m_opaque_ptr)
75{
76}
77
78const SBCommandInterpreter &
79SBCommandInterpreter::operator = (const SBCommandInterpreter &rhs)
80{
81 m_opaque_ptr = rhs.m_opaque_ptr;
82 return *this;
83}
84
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085SBCommandInterpreter::~SBCommandInterpreter ()
86{
87}
88
89bool
Greg Clayton66111032010-06-23 01:19:29 +000090SBCommandInterpreter::IsValid() const
91{
92 return m_opaque_ptr != NULL;
93}
94
95
96bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097SBCommandInterpreter::CommandExists (const char *cmd)
98{
Johnny Chen872e0622011-12-19 21:16:29 +000099 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000100 return m_opaque_ptr->CommandExists (cmd);
101 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102}
103
104bool
105SBCommandInterpreter::AliasExists (const char *cmd)
106{
Johnny Chen872e0622011-12-19 21:16:29 +0000107 if (cmd && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000108 return m_opaque_ptr->AliasExists (cmd);
109 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110}
111
Greg Clayton44d93782014-01-27 23:43:24 +0000112bool
113SBCommandInterpreter::IsActive ()
114{
115 if (m_opaque_ptr)
116 return m_opaque_ptr->IsActive ();
117 return false;
118}
119
120const char *
121SBCommandInterpreter::GetIOHandlerControlSequence(char ch)
122{
123 if (m_opaque_ptr)
124 return m_opaque_ptr->GetDebugger().GetTopIOHandlerControlSequence (ch).GetCString();
125 return NULL;
126}
127
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128lldb::ReturnStatus
129SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
130{
Greg Clayton5160ce52013-03-27 23:08:40 +0000131 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000132
133 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000134 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p), add_to_history=%i)",
135 static_cast<void*>(m_opaque_ptr), command_line,
136 static_cast<void*>(result.get()), add_to_history);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000137
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138 result.Clear();
Johnny Chen872e0622011-12-19 21:16:29 +0000139 if (command_line && m_opaque_ptr)
Greg Clayton66111032010-06-23 01:19:29 +0000140 {
Greg Clayton45a44f32014-07-15 00:25:59 +0000141 result.ref().SetInteractive(false);
Enrico Granata5f5ab602012-05-31 01:09:06 +0000142 m_opaque_ptr->HandleCommand (command_line, add_to_history ? eLazyBoolYes : eLazyBoolNo, result.ref());
Greg Clayton66111032010-06-23 01:19:29 +0000143 }
144 else
145 {
Johnny Chen872e0622011-12-19 21:16:29 +0000146 result->AppendError ("SBCommandInterpreter or the command line is not valid");
Greg Clayton66111032010-06-23 01:19:29 +0000147 result->SetStatus (eReturnStatusFailed);
148 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000149
Caroline Tice7b9da4a2010-10-27 21:23:37 +0000150 // We need to get the value again, in case the command disabled the log!
151 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000152 if (log)
153 {
154 SBStream sstr;
155 result.GetDescription (sstr);
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000156 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p): %s, add_to_history=%i) => %i",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000157 static_cast<void*>(m_opaque_ptr), command_line,
158 static_cast<void*>(result.get()), sstr.GetData(),
159 add_to_history, result.GetStatus());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000160 }
161
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162 return result.GetStatus();
163}
164
165int
166SBCommandInterpreter::HandleCompletion (const char *current_line,
167 const char *cursor,
168 const char *last_char,
169 int match_start_point,
170 int max_return_elements,
171 SBStringList &matches)
172{
Greg Clayton5160ce52013-03-27 23:08:40 +0000173 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton66111032010-06-23 01:19:29 +0000174 int num_completions = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000175
Jim Inghamac012602011-12-05 19:24:15 +0000176 // Sanity check the arguments that are passed in:
177 // cursor & last_char have to be within the current_line.
178 if (current_line == NULL || cursor == NULL || last_char == NULL)
179 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000180
Jim Inghamac012602011-12-05 19:24:15 +0000181 if (cursor < current_line || last_char < current_line)
182 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000183
Jim Inghamac012602011-12-05 19:24:15 +0000184 size_t current_line_size = strlen (current_line);
Saleem Abdulrasool3985c8c2014-04-02 03:51:35 +0000185 if (cursor - current_line > static_cast<ptrdiff_t>(current_line_size) ||
186 last_char - current_line > static_cast<ptrdiff_t>(current_line_size))
Jim Inghamac012602011-12-05 19:24:15 +0000187 return 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000188
Jim Ingham389512d2012-06-26 01:21:59 +0000189 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000190 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 +0000191 static_cast<void*>(m_opaque_ptr), current_line,
192 static_cast<uint64_t>(cursor - current_line),
193 static_cast<uint64_t>(last_char - current_line),
194 match_start_point, max_return_elements);
195
Greg Clayton66111032010-06-23 01:19:29 +0000196 if (m_opaque_ptr)
197 {
198 lldb_private::StringList lldb_matches;
199 num_completions = m_opaque_ptr->HandleCompletion (current_line, cursor, last_char, match_start_point,
200 max_return_elements, lldb_matches);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000201
Greg Clayton66111032010-06-23 01:19:29 +0000202 SBStringList temp_list (&lldb_matches);
203 matches.AppendList (temp_list);
204 }
Jim Ingham389512d2012-06-26 01:21:59 +0000205 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000206 log->Printf ("SBCommandInterpreter(%p)::HandleCompletion - Found %d completions.",
207 static_cast<void*>(m_opaque_ptr), num_completions);
208
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000209 return num_completions;
210}
211
Jim Ingham969795f2011-09-21 01:17:13 +0000212int
213SBCommandInterpreter::HandleCompletion (const char *current_line,
214 uint32_t cursor_pos,
215 int match_start_point,
216 int max_return_elements,
217 lldb::SBStringList &matches)
218{
219 const char *cursor = current_line + cursor_pos;
220 const char *last_char = current_line + strlen (current_line);
221 return HandleCompletion (current_line, cursor, last_char, match_start_point, max_return_elements, matches);
222}
223
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000224bool
225SBCommandInterpreter::HasCommands ()
226{
Greg Clayton66111032010-06-23 01:19:29 +0000227 if (m_opaque_ptr)
228 return m_opaque_ptr->HasCommands();
229 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000230}
231
232bool
233SBCommandInterpreter::HasAliases ()
234{
Greg Clayton66111032010-06-23 01:19:29 +0000235 if (m_opaque_ptr)
236 return m_opaque_ptr->HasAliases();
237 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238}
239
240bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241SBCommandInterpreter::HasAliasOptions ()
242{
Greg Clayton66111032010-06-23 01:19:29 +0000243 if (m_opaque_ptr)
244 return m_opaque_ptr->HasAliasOptions ();
245 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000246}
247
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248SBProcess
249SBCommandInterpreter::GetProcess ()
250{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000251 SBProcess sb_process;
252 ProcessSP process_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000253 if (m_opaque_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000254 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000255 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
256 if (target_sp)
257 {
258 Mutex::Locker api_locker(target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000259 process_sp = target_sp->GetProcessSP();
260 sb_process.SetSP(process_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000261 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000262 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000263 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000264
265 if (log)
266 log->Printf ("SBCommandInterpreter(%p)::GetProcess () => SBProcess(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000267 static_cast<void*>(m_opaque_ptr),
268 static_cast<void*>(process_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000269
Greg Claytonb9556ac2012-01-30 07:41:31 +0000270 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271}
272
Enrico Granata21dfcd92012-09-28 23:57:51 +0000273SBDebugger
274SBCommandInterpreter::GetDebugger ()
275{
276 SBDebugger sb_debugger;
277 if (m_opaque_ptr)
278 sb_debugger.reset(m_opaque_ptr->GetDebugger().shared_from_this());
Greg Clayton5160ce52013-03-27 23:08:40 +0000279 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000280
Enrico Granata21dfcd92012-09-28 23:57:51 +0000281 if (log)
282 log->Printf ("SBCommandInterpreter(%p)::GetDebugger () => SBDebugger(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000283 static_cast<void*>(m_opaque_ptr),
284 static_cast<void*>(sb_debugger.get()));
285
Enrico Granata21dfcd92012-09-28 23:57:51 +0000286 return sb_debugger;
287}
288
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000289CommandInterpreter *
Greg Clayton66111032010-06-23 01:19:29 +0000290SBCommandInterpreter::get ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291{
Greg Clayton66111032010-06-23 01:19:29 +0000292 return m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293}
294
295CommandInterpreter &
Greg Clayton66111032010-06-23 01:19:29 +0000296SBCommandInterpreter::ref ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000297{
Greg Clayton66111032010-06-23 01:19:29 +0000298 assert (m_opaque_ptr);
299 return *m_opaque_ptr;
300}
301
302void
303SBCommandInterpreter::reset (lldb_private::CommandInterpreter *interpreter)
304{
305 m_opaque_ptr = interpreter;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306}
307
308void
309SBCommandInterpreter::SourceInitFileInHomeDirectory (SBCommandReturnObject &result)
310{
311 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000312 if (m_opaque_ptr)
313 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000314 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
315 Mutex::Locker api_locker;
316 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000317 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000318 m_opaque_ptr->SourceInitFile (false, result.ref());
319 }
320 else
321 {
322 result->AppendError ("SBCommandInterpreter is not valid");
323 result->SetStatus (eReturnStatusFailed);
324 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000325 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000326
327 if (log)
328 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInHomeDirectory (&SBCommandReturnObject(%p))",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000329 static_cast<void*>(m_opaque_ptr),
330 static_cast<void*>(result.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331}
332
333void
334SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory (SBCommandReturnObject &result)
335{
336 result.Clear();
Greg Clayton66111032010-06-23 01:19:29 +0000337 if (m_opaque_ptr)
338 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000339 TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
340 Mutex::Locker api_locker;
341 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000342 api_locker.Lock(target_sp->GetAPIMutex());
Greg Clayton66111032010-06-23 01:19:29 +0000343 m_opaque_ptr->SourceInitFile (true, result.ref());
344 }
345 else
346 {
347 result->AppendError ("SBCommandInterpreter is not valid");
348 result->SetStatus (eReturnStatusFailed);
349 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000350 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000351
352 if (log)
353 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInCurrentWorkingDirectory (&SBCommandReturnObject(%p))",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000354 static_cast<void*>(m_opaque_ptr),
355 static_cast<void*>(result.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000356}
357
358SBBroadcaster
359SBCommandInterpreter::GetBroadcaster ()
360{
Greg Clayton5160ce52013-03-27 23:08:40 +0000361 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000362
Greg Clayton66111032010-06-23 01:19:29 +0000363 SBBroadcaster broadcaster (m_opaque_ptr, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000364
365 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000366 log->Printf ("SBCommandInterpreter(%p)::GetBroadcaster() => SBBroadcaster(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000367 static_cast<void*>(m_opaque_ptr), static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000368
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000369 return broadcaster;
370}
371
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000372const char *
373SBCommandInterpreter::GetBroadcasterClass ()
374{
375 return Communication::GetStaticBroadcasterClass().AsCString();
376}
377
Greg Clayton9d0402b2011-02-20 02:15:07 +0000378const char *
379SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
380{
381 return CommandObject::GetArgumentTypeAsCString (arg_type);
382}
383
384const char *
385SBCommandInterpreter::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
386{
387 return CommandObject::GetArgumentDescriptionAsCString (arg_type);
388}
389
Greg Claytona9f7b792012-02-29 04:21:24 +0000390bool
391SBCommandInterpreter::SetCommandOverrideCallback (const char *command_name,
392 lldb::CommandOverrideCallback callback,
393 void *baton)
394{
395 if (command_name && command_name[0] && m_opaque_ptr)
396 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000397 std::string command_name_str (command_name);
398 CommandObject *cmd_obj = m_opaque_ptr->GetCommandObjectForCommand(command_name_str);
Greg Claytona9f7b792012-02-29 04:21:24 +0000399 if (cmd_obj)
400 {
Greg Claytonaf6f2752012-05-08 04:29:20 +0000401 assert(command_name_str.empty());
Greg Claytona9f7b792012-02-29 04:21:24 +0000402 cmd_obj->SetOverrideCallback (callback, baton);
403 return true;
404 }
405 }
406 return false;
407}
Greg Clayton9d0402b2011-02-20 02:15:07 +0000408
Greg Claytondce502e2011-11-04 03:34:56 +0000409#ifndef LLDB_DISABLE_PYTHON
Enrico Granatabe93a352011-08-16 16:49:25 +0000410
Greg Claytondce502e2011-11-04 03:34:56 +0000411// Defined in the SWIG source file
412extern "C" void
413init_lldb(void);
414
Greg Clayton8afa5432013-10-17 00:27:14 +0000415// these are the Pythonic implementations of the required callbacks
416// these are scripting-language specific, which is why they belong here
417// we still need to use function pointers to them instead of relying
418// on linkage-time resolution because the SWIG stuff and this file
419// get built at different times
420extern "C" bool
421LLDBSwigPythonBreakpointCallbackFunction (const char *python_function_name,
422 const char *session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000423 const lldb::StackFrameSP& sb_frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000424 const lldb::BreakpointLocationSP& sb_bp_loc);
Enrico Granatabe93a352011-08-16 16:49:25 +0000425
Greg Clayton8afa5432013-10-17 00:27:14 +0000426extern "C" bool
427LLDBSwigPythonWatchpointCallbackFunction (const char *python_function_name,
428 const char *session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000429 const lldb::StackFrameSP& sb_frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000430 const lldb::WatchpointSP& sb_wp);
Greg Claytonfc36f7912011-03-22 01:14:58 +0000431
Greg Clayton8afa5432013-10-17 00:27:14 +0000432extern "C" bool
433LLDBSwigPythonCallTypeScript (const char *python_function_name,
434 void *session_dictionary,
435 const lldb::ValueObjectSP& valobj_sp,
436 void** pyfunct_wrapper,
437 std::string& retval);
438
439extern "C" void*
440LLDBSwigPythonCreateSyntheticProvider (const char *python_class_name,
441 const char *session_dictionary_name,
442 const lldb::ValueObjectSP& valobj_sp);
443
444
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000445extern "C" void*
446LLDBSwigPythonCreateScriptedThreadPlan (const char *python_class_name,
447 const char *session_dictionary_name,
448 const lldb::ThreadPlanSP& thread_plan_sp);
449
450extern "C" bool
451LLDBSWIGPythonCallThreadPlan (void *implementor,
452 const char *method_name,
453 Event *event_sp,
454 bool &got_error);
455
Greg Clayton8afa5432013-10-17 00:27:14 +0000456extern "C" uint32_t
457LLDBSwigPython_CalculateNumChildren (void *implementor);
458
459extern "C" void *
460LLDBSwigPython_GetChildAtIndex (void *implementor, uint32_t idx);
461
462extern "C" int
463LLDBSwigPython_GetIndexOfChildWithName (void *implementor, const char* child_name);
464
465extern "C" void *
466LLDBSWIGPython_CastPyObjectToSBValue (void* data);
467
468extern lldb::ValueObjectSP
469LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data);
470
471extern "C" bool
472LLDBSwigPython_UpdateSynthProviderInstance (void* implementor);
473
474extern "C" bool
475LLDBSwigPython_MightHaveChildrenSynthProviderInstance (void* implementor);
476
Enrico Granatad07cfd32014-10-08 18:27:36 +0000477extern "C" void *
478LLDBSwigPython_GetValueSynthProviderInstance (void* implementor);
479
Greg Clayton8afa5432013-10-17 00:27:14 +0000480extern "C" bool
481LLDBSwigPythonCallCommand (const char *python_function_name,
482 const char *session_dictionary_name,
483 lldb::DebuggerSP& debugger,
484 const char* args,
Enrico Granata06be0592014-10-01 21:47:29 +0000485 lldb_private::CommandReturnObject &cmd_retobj,
486 lldb::ExecutionContextRefSP exe_ctx_ref_sp);
Greg Clayton8afa5432013-10-17 00:27:14 +0000487
488extern "C" bool
489LLDBSwigPythonCallModuleInit (const char *python_module_name,
490 const char *session_dictionary_name,
491 lldb::DebuggerSP& debugger);
492
493extern "C" void*
494LLDBSWIGPythonCreateOSPlugin (const char *python_class_name,
495 const char *session_dictionary_name,
496 const lldb::ProcessSP& process_sp);
497
498extern "C" bool
499LLDBSWIGPythonRunScriptKeywordProcess (const char* python_function_name,
500 const char* session_dictionary_name,
501 lldb::ProcessSP& process,
502 std::string& output);
503
504extern "C" bool
505LLDBSWIGPythonRunScriptKeywordThread (const char* python_function_name,
506 const char* session_dictionary_name,
507 lldb::ThreadSP& thread,
508 std::string& output);
509
510extern "C" bool
511LLDBSWIGPythonRunScriptKeywordTarget (const char* python_function_name,
512 const char* session_dictionary_name,
513 lldb::TargetSP& target,
514 std::string& output);
515
516extern "C" bool
517LLDBSWIGPythonRunScriptKeywordFrame (const char* python_function_name,
518 const char* session_dictionary_name,
Jason Molendab57e4a12013-11-04 09:33:30 +0000519 lldb::StackFrameSP& frame,
Greg Clayton8afa5432013-10-17 00:27:14 +0000520 std::string& output);
521
522extern "C" void*
523LLDBSWIGPython_GetDynamicSetting (void* module,
524 const char* setting,
525 const lldb::TargetSP& target_sp);
526
Greg Claytondce502e2011-11-04 03:34:56 +0000527
528#endif
529
Greg Claytonfc36f7912011-03-22 01:14:58 +0000530void
531SBCommandInterpreter::InitializeSWIG ()
532{
533 static bool g_initialized = false;
534 if (!g_initialized)
535 {
536 g_initialized = true;
Greg Claytondce502e2011-11-04 03:34:56 +0000537#ifndef LLDB_DISABLE_PYTHON
Greg Clayton8afa5432013-10-17 00:27:14 +0000538 ScriptInterpreter::InitializeInterpreter (init_lldb,
539 LLDBSwigPythonBreakpointCallbackFunction,
540 LLDBSwigPythonWatchpointCallbackFunction,
541 LLDBSwigPythonCallTypeScript,
542 LLDBSwigPythonCreateSyntheticProvider,
543 LLDBSwigPython_CalculateNumChildren,
544 LLDBSwigPython_GetChildAtIndex,
545 LLDBSwigPython_GetIndexOfChildWithName,
546 LLDBSWIGPython_CastPyObjectToSBValue,
547 LLDBSWIGPython_GetValueObjectSPFromSBValue,
548 LLDBSwigPython_UpdateSynthProviderInstance,
549 LLDBSwigPython_MightHaveChildrenSynthProviderInstance,
Enrico Granatad07cfd32014-10-08 18:27:36 +0000550 LLDBSwigPython_GetValueSynthProviderInstance,
Greg Clayton8afa5432013-10-17 00:27:14 +0000551 LLDBSwigPythonCallCommand,
552 LLDBSwigPythonCallModuleInit,
553 LLDBSWIGPythonCreateOSPlugin,
554 LLDBSWIGPythonRunScriptKeywordProcess,
555 LLDBSWIGPythonRunScriptKeywordThread,
556 LLDBSWIGPythonRunScriptKeywordTarget,
557 LLDBSWIGPythonRunScriptKeywordFrame,
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000558 LLDBSWIGPython_GetDynamicSetting,
559 LLDBSwigPythonCreateScriptedThreadPlan,
560 LLDBSWIGPythonCallThreadPlan);
Greg Claytondce502e2011-11-04 03:34:56 +0000561#endif
Greg Claytonfc36f7912011-03-22 01:14:58 +0000562 }
563}
Greg Claytona9f7b792012-02-29 04:21:24 +0000564
Enrico Granata21dfcd92012-09-28 23:57:51 +0000565lldb::SBCommand
566SBCommandInterpreter::AddMultiwordCommand (const char* name, const char* help)
567{
568 CommandObjectMultiword *new_command = new CommandObjectMultiword(*m_opaque_ptr,name,help);
569 new_command->SetRemovable (true);
570 lldb::CommandObjectSP new_command_sp(new_command);
571 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
572 return lldb::SBCommand(new_command_sp);
573 return lldb::SBCommand();
574}
575
576lldb::SBCommand
577SBCommandInterpreter::AddCommand (const char* name, lldb::SBCommandPluginInterface* impl, const char* help)
578{
579 lldb::CommandObjectSP new_command_sp;
580 new_command_sp.reset(new CommandPluginInterfaceImplementation(*m_opaque_ptr,name,impl,help));
581
582 if (new_command_sp && m_opaque_ptr->AddUserCommand(name, new_command_sp, true))
583 return lldb::SBCommand(new_command_sp);
584 return lldb::SBCommand();
585}
586
587SBCommand::SBCommand ()
588{}
589
590SBCommand::SBCommand (lldb::CommandObjectSP cmd_sp) : m_opaque_sp (cmd_sp)
591{}
592
593bool
594SBCommand::IsValid ()
595{
596 return (bool)m_opaque_sp;
597}
598
599const char*
600SBCommand::GetName ()
601{
602 if (IsValid ())
603 return m_opaque_sp->GetCommandName ();
604 return NULL;
605}
606
607const char*
608SBCommand::GetHelp ()
609{
610 if (IsValid ())
611 return m_opaque_sp->GetHelp ();
612 return NULL;
613}
614
615lldb::SBCommand
616SBCommand::AddMultiwordCommand (const char* name, const char* help)
617{
618 if (!IsValid ())
619 return lldb::SBCommand();
620 if (m_opaque_sp->IsMultiwordObject() == false)
621 return lldb::SBCommand();
622 CommandObjectMultiword *new_command = new CommandObjectMultiword(m_opaque_sp->GetCommandInterpreter(),name,help);
623 new_command->SetRemovable (true);
624 lldb::CommandObjectSP new_command_sp(new_command);
625 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
626 return lldb::SBCommand(new_command_sp);
627 return lldb::SBCommand();
628}
629
630lldb::SBCommand
631SBCommand::AddCommand (const char* name, lldb::SBCommandPluginInterface *impl, const char* help)
632{
633 if (!IsValid ())
634 return lldb::SBCommand();
635 if (m_opaque_sp->IsMultiwordObject() == false)
636 return lldb::SBCommand();
637 lldb::CommandObjectSP new_command_sp;
638 new_command_sp.reset(new CommandPluginInterfaceImplementation(m_opaque_sp->GetCommandInterpreter(),name,impl,help));
639 if (new_command_sp && m_opaque_sp->LoadSubCommand(name,new_command_sp))
640 return lldb::SBCommand(new_command_sp);
641 return lldb::SBCommand();
642}
643