blob: acf98dd8fa1b4cf2c627018bc2b87f4d5d3b6006 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBDebugger.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
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000010#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-include.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000013#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000014#include "lldb/Core/Debugger.h"
15#include "lldb/Core/State.h"
16#include "lldb/Target/Process.h"
17#include "lldb/Target/TargetList.h"
18
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000019#include "lldb/API/SBListener.h"
20#include "lldb/API/SBBroadcaster.h"
21#include "lldb/API/SBCommandInterpreter.h"
22#include "lldb/API/SBCommandReturnObject.h"
23#include "lldb/API/SBEvent.h"
24#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000025#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000026#include "lldb/API/SBProcess.h"
27#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000028#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000029#include "lldb/API/SBStringList.h"
30#include "lldb/API/SBTarget.h"
31#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032
33using namespace lldb;
34using namespace lldb_private;
35
36void
37SBDebugger::Initialize ()
38{
39 Debugger::Initialize();
40}
41
42void
43SBDebugger::Terminate ()
44{
45 Debugger::Terminate();
46}
47
Greg Clayton43490d12010-07-30 20:12:55 +000048void
49SBDebugger::Clear ()
50{
51 m_opaque_sp.reset();
52}
53
Greg Clayton63094e02010-06-23 01:19:29 +000054SBDebugger
55SBDebugger::Create()
56{
57 SBDebugger debugger;
58 debugger.reset(Debugger::CreateInstance());
59 return debugger;
60}
61
Greg Clayton63094e02010-06-23 01:19:29 +000062SBDebugger::SBDebugger () :
63 m_opaque_sp ()
64{
65}
66
67SBDebugger::~SBDebugger ()
68{
69}
70
71bool
72SBDebugger::IsValid() const
73{
74 return m_opaque_sp.get() != NULL;
75}
76
77
Chris Lattner24943d22010-06-08 16:52:24 +000078void
79SBDebugger::SetAsync (bool b)
80{
Greg Clayton63094e02010-06-23 01:19:29 +000081 if (m_opaque_sp)
82 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
Chris Lattner24943d22010-06-08 16:52:24 +000085// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
86// trying to switch modes in the middle of a debugging session.
87void
88SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
89{
Greg Clayton63094e02010-06-23 01:19:29 +000090 if (m_opaque_sp)
91 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +000092}
93
94void
95SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
96{
Greg Clayton63094e02010-06-23 01:19:29 +000097 if (m_opaque_sp)
98 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +000099}
100
101void
102SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
103{
Greg Clayton63094e02010-06-23 01:19:29 +0000104 if (m_opaque_sp)
105 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000106}
107
108FILE *
109SBDebugger::GetInputFileHandle ()
110{
Greg Clayton63094e02010-06-23 01:19:29 +0000111 if (m_opaque_sp)
112 return m_opaque_sp->GetInputFileHandle();
113 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000114}
115
116FILE *
117SBDebugger::GetOutputFileHandle ()
118{
Greg Clayton63094e02010-06-23 01:19:29 +0000119 if (m_opaque_sp)
120 return m_opaque_sp->GetOutputFileHandle();
121 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
124FILE *
125SBDebugger::GetErrorFileHandle ()
126{
Greg Clayton63094e02010-06-23 01:19:29 +0000127 if (m_opaque_sp)
128 return m_opaque_sp->GetErrorFileHandle();
129 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000130}
131
132SBCommandInterpreter
133SBDebugger::GetCommandInterpreter ()
134{
Greg Clayton63094e02010-06-23 01:19:29 +0000135 SBCommandInterpreter sb_interpreter;
136 if (m_opaque_sp)
137 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Chris Lattner24943d22010-06-08 16:52:24 +0000138 return sb_interpreter;
139}
140
141void
142SBDebugger::HandleCommand (const char *command)
143{
Greg Clayton63094e02010-06-23 01:19:29 +0000144 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000145 {
Greg Clayton63094e02010-06-23 01:19:29 +0000146 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
147 SBCommandReturnObject result;
148
149 sb_interpreter.HandleCommand (command, result, false);
150
151 if (GetErrorFileHandle() != NULL)
152 result.PutError (GetErrorFileHandle());
153 if (GetOutputFileHandle() != NULL)
154 result.PutOutput (GetOutputFileHandle());
155
156 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000157 {
Greg Clayton63094e02010-06-23 01:19:29 +0000158 SBProcess process(GetCommandInterpreter().GetProcess ());
159 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000160 {
Greg Clayton63094e02010-06-23 01:19:29 +0000161 EventSP event_sp;
162 Listener &lldb_listener = m_opaque_sp->GetListener();
163 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
164 {
165 SBEvent event(event_sp);
166 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
167 }
Chris Lattner24943d22010-06-08 16:52:24 +0000168 }
169 }
170 }
171}
172
173SBListener
174SBDebugger::GetListener ()
175{
Greg Clayton63094e02010-06-23 01:19:29 +0000176 SBListener sb_listener;
177 if (m_opaque_sp)
178 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000179 return sb_listener;
180}
181
182void
183SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
184{
185 const uint32_t event_type = event.GetType();
186 char stdio_buffer[1024];
187 size_t len;
188
189 if (event_type & Process::eBroadcastBitSTDOUT)
190 {
191 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
192 if (out != NULL)
193 ::fwrite (stdio_buffer, 1, len, out);
194 }
195 else if (event_type & Process::eBroadcastBitSTDERR)
196 {
197 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
198 if (out != NULL)
199 ::fwrite (stdio_buffer, 1, len, out);
200 }
201 else if (event_type & Process::eBroadcastBitStateChanged)
202 {
203 // Drain any stdout messages.
204 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
205 if (out != NULL)
206 ::fwrite (stdio_buffer, 1, len, out);
207
208 // Drain any stderr messages.
209 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
210 if (out != NULL)
211 ::fwrite (stdio_buffer, 1, len, out);
212
213 StateType event_state = SBProcess::GetStateFromEvent (event);
214
215 if (event_state == eStateInvalid)
216 return;
217
218 bool is_stopped = StateIsStoppedState (event_state);
219 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000220 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000221 }
222}
223
224void
Jim Inghamc8332952010-08-26 21:32:51 +0000225SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000226{
227 if (process.IsValid())
228 {
Jim Inghamc8332952010-08-26 21:32:51 +0000229 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000230 SBThread thread;
231 StopReason curr_thread_stop_reason = eStopReasonInvalid;
232 if (curr_thread.IsValid())
233 {
234 if (curr_thread.GetStopReason() != eStopReasonInvalid)
235 curr_thread_stop_reason = curr_thread.GetStopReason ();
236 }
237
238 if (! curr_thread.IsValid()
239 || curr_thread_stop_reason == eStopReasonInvalid
240 || curr_thread_stop_reason == eStopReasonNone)
241 {
242 // Prefer a thread that has just completed its plan over another thread as current thread.
243 SBThread plan_thread;
244 SBThread other_thread;
245 const size_t num_threads = process.GetNumThreads ();
246 size_t i;
247 for (i = 0; i < num_threads; ++i)
248 {
249 thread = process.GetThreadAtIndex(i);
250 if (thread.GetStopReason () != eStopReasonInvalid)
251 {
252 switch (thread.GetStopReason ())
253 {
254 default:
255 case eStopReasonInvalid:
256 case eStopReasonNone:
257 break;
258
259 case eStopReasonTrace:
260 case eStopReasonBreakpoint:
261 case eStopReasonWatchpoint:
262 case eStopReasonSignal:
263 case eStopReasonException:
264 if (! other_thread.IsValid())
265 other_thread = thread;
266 break;
267 case eStopReasonPlanComplete:
268 if (! plan_thread.IsValid())
269 plan_thread = thread;
270 break;
271 }
272 }
273 }
274 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000275 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000276 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000277 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000278 else
279 {
280 if (curr_thread.IsValid())
281 thread = curr_thread;
282 else
283 thread = process.GetThreadAtIndex(0);
284
285 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000286 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000287 }
288 }
289 }
290}
291
Chris Lattner24943d22010-06-08 16:52:24 +0000292SBSourceManager &
293SBDebugger::GetSourceManager ()
294{
295 static SourceManager g_lldb_source_manager;
296 static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
297 return g_sb_source_manager;
298}
299
300
301bool
302SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
303{
304 if (arch_name && arch_name_len)
305 {
306 ArchSpec &default_arch = lldb_private::GetDefaultArchitecture ();
307 if (default_arch.IsValid())
308 {
309 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
310 return true;
311 }
312 }
313 if (arch_name && arch_name_len)
314 arch_name[0] = '\0';
315 return false;
316}
317
318
319bool
320SBDebugger::SetDefaultArchitecture (const char *arch_name)
321{
322 if (arch_name)
323 {
324 ArchSpec arch (arch_name);
325 if (arch.IsValid())
326 {
327 lldb_private::GetDefaultArchitecture () = arch;
328 return true;
329 }
330 }
331 return false;
332}
333
334ScriptLanguage
335SBDebugger::GetScriptingLanguage (const char *script_language_name)
336{
337 return Args::StringToScriptLanguage (script_language_name,
338 eScriptLanguageDefault,
339 NULL);
340}
Chris Lattner24943d22010-06-08 16:52:24 +0000341
342const char *
343SBDebugger::GetVersionString ()
344{
345 return lldb_private::GetVersion();
346}
347
348const char *
349SBDebugger::StateAsCString (lldb::StateType state)
350{
351 return lldb_private::StateAsCString (state);
352}
353
354bool
355SBDebugger::StateIsRunningState (lldb::StateType state)
356{
357 return lldb_private::StateIsRunningState (state);
358}
359
360bool
361SBDebugger::StateIsStoppedState (lldb::StateType state)
362{
363 return lldb_private::StateIsStoppedState (state);
364}
365
366
367SBTarget
368SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
369 const char *target_triple)
370{
Greg Clayton63094e02010-06-23 01:19:29 +0000371 SBTarget target;
372 if (m_opaque_sp)
373 {
374 ArchSpec arch;
375 FileSpec file_spec (filename);
376 arch.SetArchFromTargetTriple(target_triple);
377 TargetSP target_sp;
378 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
379 target.reset (target_sp);
380 }
Chris Lattner24943d22010-06-08 16:52:24 +0000381 return target;
382}
383
384SBTarget
385SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
386{
Greg Clayton63094e02010-06-23 01:19:29 +0000387 SBTarget target;
388 if (m_opaque_sp)
389 {
390 FileSpec file (filename);
391 ArchSpec arch = lldb_private::GetDefaultArchitecture();
392 TargetSP target_sp;
393 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000394
Greg Clayton63094e02010-06-23 01:19:29 +0000395 if (archname != NULL)
396 {
397 ArchSpec arch2 (archname);
398 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
399 }
400 else
401 {
402 if (!arch.IsValid())
403 arch = LLDB_ARCH_DEFAULT;
404
405 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
406
407 if (error.Fail())
408 {
409 if (arch == LLDB_ARCH_DEFAULT_32BIT)
410 arch = LLDB_ARCH_DEFAULT_64BIT;
411 else
412 arch = LLDB_ARCH_DEFAULT_32BIT;
413
414 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
415 }
416 }
417
418 if (error.Success())
419 {
Jim Inghamc8332952010-08-26 21:32:51 +0000420 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000421 target.reset(target_sp);
422 }
Chris Lattner24943d22010-06-08 16:52:24 +0000423 }
Greg Clayton63094e02010-06-23 01:19:29 +0000424 return target;
425}
426
427SBTarget
428SBDebugger::CreateTarget (const char *filename)
429{
430 SBTarget target;
431 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000432 {
Greg Clayton63094e02010-06-23 01:19:29 +0000433 FileSpec file (filename);
434 ArchSpec arch = lldb_private::GetDefaultArchitecture();
435 TargetSP target_sp;
436 Error error;
437
Chris Lattner24943d22010-06-08 16:52:24 +0000438 if (!arch.IsValid())
439 arch = LLDB_ARCH_DEFAULT;
440
Greg Clayton63094e02010-06-23 01:19:29 +0000441 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000442
443 if (error.Fail())
444 {
445 if (arch == LLDB_ARCH_DEFAULT_32BIT)
446 arch = LLDB_ARCH_DEFAULT_64BIT;
447 else
448 arch = LLDB_ARCH_DEFAULT_32BIT;
449
Greg Clayton63094e02010-06-23 01:19:29 +0000450 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
451 }
452
453 if (error.Success())
454 {
Jim Inghamc8332952010-08-26 21:32:51 +0000455 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000456 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000457 }
458 }
Greg Clayton63094e02010-06-23 01:19:29 +0000459 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000460}
461
462SBTarget
463SBDebugger::GetTargetAtIndex (uint32_t idx)
464{
Greg Clayton63094e02010-06-23 01:19:29 +0000465 SBTarget sb_target;
466 if (m_opaque_sp)
467 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000468 return sb_target;
469}
470
471SBTarget
472SBDebugger::FindTargetWithProcessID (pid_t pid)
473{
Greg Clayton63094e02010-06-23 01:19:29 +0000474 SBTarget sb_target;
475 if (m_opaque_sp)
476 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000477 return sb_target;
478}
479
480SBTarget
481SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
482{
Greg Clayton63094e02010-06-23 01:19:29 +0000483 SBTarget sb_target;
484 if (m_opaque_sp && filename && filename[0])
485 {
486 ArchSpec arch;
487 if (arch_name)
488 arch.SetArch(arch_name);
489 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename), arch_name ? &arch : NULL));
490 sb_target.reset(target_sp);
491 }
492 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000493}
494
495SBTarget
496SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
497{
Greg Clayton63094e02010-06-23 01:19:29 +0000498 SBTarget sb_target;
499 if (m_opaque_sp)
500 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000501 return sb_target;
502}
503
504
505uint32_t
506SBDebugger::GetNumTargets ()
507{
Greg Clayton63094e02010-06-23 01:19:29 +0000508 if (m_opaque_sp)
509 return m_opaque_sp->GetTargetList().GetNumTargets ();
510 return 0;
511}
Chris Lattner24943d22010-06-08 16:52:24 +0000512
513SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000514SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000515{
Greg Clayton63094e02010-06-23 01:19:29 +0000516 SBTarget sb_target;
517 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000518 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Chris Lattner24943d22010-06-08 16:52:24 +0000519 return sb_target;
520}
521
522void
523SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
524{
Greg Clayton63094e02010-06-23 01:19:29 +0000525 if (m_opaque_sp)
526 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000527}
528
529void
530SBDebugger::PushInputReader (SBInputReader &reader)
531{
Greg Clayton63094e02010-06-23 01:19:29 +0000532 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000533 {
534 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000535 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000536 }
537}
Greg Clayton63094e02010-06-23 01:19:29 +0000538
539void
540SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
541{
542 m_opaque_sp = debugger_sp;
543}
544
545Debugger *
546SBDebugger::get () const
547{
548 return m_opaque_sp.get();
549}
550
551Debugger &
552SBDebugger::ref () const
553{
554 assert (m_opaque_sp.get());
555 return *m_opaque_sp;
556}
557
558
Caroline Tice558be582010-06-30 16:22:25 +0000559SBDebugger
560SBDebugger::FindDebuggerWithID (int id)
561{
562 SBDebugger sb_debugger;
563 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
564 if (debugger_sp)
565 sb_debugger.reset (debugger_sp);
566 return sb_debugger;
567}
Jim Ingham74989e82010-08-30 19:44:40 +0000568
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000569const char *
570SBDebugger::GetInstanceName()
571{
572 if (m_opaque_sp)
573 return m_opaque_sp->GetInstanceName().AsCString();
574 else
575 return NULL;
576}
577
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000578SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000579SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000580{
581 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000582
583 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, false,
584 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000585 SBError sb_error;
586 sb_error.SetError (err);
587
588 return sb_error;
589}
590
591lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000592SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000593{
594 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000595 lldb::SettableVariableType var_type;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000596
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000597 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
598
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000599 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name);
Chris Lattner5bc7b672010-09-08 23:01:14 +0000600 for (unsigned i = 0; i != value.GetSize(); ++i)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000601 ret_value.AppendString (value.GetStringAtIndex(i));
602
603 return ret_value;
604}
605
Greg Clayton238c0a12010-09-18 01:14:36 +0000606uint32_t
607SBDebugger::GetTerminalWidth () const
608{
609 if (m_opaque_sp)
610 return m_opaque_sp->GetTerminalWidth ();
611 return 0;
612}
613
614void
615SBDebugger::SetTerminalWidth (uint32_t term_width)
616{
617 if (m_opaque_sp)
618 m_opaque_sp->SetTerminalWidth (term_width);
619}
620
621const char *
622SBDebugger::GetPrompt() const
623{
624 if (m_opaque_sp)
625 return m_opaque_sp->GetPrompt ();
626 return 0;
627}
628
629void
630SBDebugger::SetPrompt (const char *prompt)
631{
632 if (m_opaque_sp)
633 m_opaque_sp->SetPrompt (prompt);
634}
635
636
637lldb::ScriptLanguage
638SBDebugger::GetScriptLanguage() const
639{
640 if (m_opaque_sp)
641 return m_opaque_sp->GetScriptLanguage ();
642 return eScriptLanguageNone;
643}
644
645void
646SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
647{
648 if (m_opaque_sp)
649 m_opaque_sp->SetScriptLanguage (script_lang);
650}
651
652
653
654
Jim Ingham74989e82010-08-30 19:44:40 +0000655bool
656SBDebugger::SetUseExternalEditor (bool value)
657{
658 if (m_opaque_sp)
659 return m_opaque_sp->SetUseExternalEditor (value);
660 else
661 return false;
662}
663
664bool
665SBDebugger::UseExternalEditor ()
666{
667 if (m_opaque_sp)
668 return m_opaque_sp->UseExternalEditor ();
669 else
670 return false;
671}
672
Caroline Tice98f930f2010-09-20 05:20:02 +0000673bool
674SBDebugger::GetDescription (SBStream &description)
675{
676 if (m_opaque_sp)
677 {
678 const char *name = m_opaque_sp->GetInstanceName().AsCString();
679 lldb::user_id_t id = m_opaque_sp->GetID();
680 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
681 }
682 else
683 description.Printf ("No value");
684
685 return true;
686}
687
688
689PyObject *
690SBDebugger::__repr__ ()
691{
692 SBStream description;
693 GetDescription (description);
694 return PyString_FromString (description.GetData());
695}