blob: 4fecc6b46b3a9d219ceef9e45f3227c6f47de083 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- CommandObjectExpression.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "CommandObjectExpression.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan841026f2010-07-23 00:16:21 +000016#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Core/Value.h"
18#include "lldb/Core/InputReader.h"
Jim Ingham324067b2010-09-30 00:54:27 +000019#include "lldb/Core/ValueObjectVariable.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Expression/ClangExpressionVariable.h"
Sean Callanan65dafa82010-08-27 01:01:44 +000021#include "lldb/Expression/ClangUserExpression.h"
Stephen Wilson63c468c2010-07-23 21:47:22 +000022#include "lldb/Expression/ClangFunction.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Expression/DWARFExpression.h"
24#include "lldb/Host/Host.h"
Sean Callanan841026f2010-07-23 00:16:21 +000025#include "lldb/Core/Debugger.h"
Greg Clayton63094e02010-06-23 01:19:29 +000026#include "lldb/Interpreter/CommandInterpreter.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Interpreter/CommandReturnObject.h"
Jim Ingham324067b2010-09-30 00:54:27 +000028#include "lldb/Target/ObjCLanguageRuntime.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/ObjectFile.h"
30#include "lldb/Symbol/Variable.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/StackFrame.h"
33#include "lldb/Target/Target.h"
Greg Claytonabe0fed2011-04-18 08:33:37 +000034#include "lldb/Target/Thread.h"
Sean Callanan841026f2010-07-23 00:16:21 +000035#include "llvm/ADT/StringRef.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036
37using namespace lldb;
38using namespace lldb_private;
39
Greg Claytona42880a2011-10-25 06:44:01 +000040CommandObjectExpression::CommandOptions::CommandOptions () :
41 OptionGroup()
Chris Lattner24943d22010-06-08 16:52:24 +000042{
Chris Lattner24943d22010-06-08 16:52:24 +000043}
44
45
46CommandObjectExpression::CommandOptions::~CommandOptions ()
47{
48}
49
Greg Claytona42880a2011-10-25 06:44:01 +000050OptionDefinition
51CommandObjectExpression::CommandOptions::g_option_table[] =
52{
53 { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "dynamic-value", 'd', required_argument, NULL, 0, eArgTypeBoolean, "Upcast the value resulting from the expression to its dynamic type if available."},
54 { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "unwind-on-error", 'u', required_argument, NULL, 0, eArgTypeBoolean, "Clean up program state if the expression causes a crash, breakpoint hit or signal."},
55 { LLDB_OPT_SET_2 , false, "object-description", 'o', no_argument, NULL, 0, eArgTypeNone, "Print the object description of the value resulting from the expression."},
56};
57
58
59uint32_t
60CommandObjectExpression::CommandOptions::GetNumDefinitions ()
61{
62 return sizeof(g_option_table)/sizeof(OptionDefinition);
63}
64
Chris Lattner24943d22010-06-08 16:52:24 +000065Error
Greg Claytona42880a2011-10-25 06:44:01 +000066CommandObjectExpression::CommandOptions::SetOptionValue (CommandInterpreter &interpreter,
67 uint32_t option_idx,
68 const char *option_arg)
Chris Lattner24943d22010-06-08 16:52:24 +000069{
70 Error error;
71
Greg Claytona42880a2011-10-25 06:44:01 +000072 const char short_option = (char) g_option_table[option_idx].short_option;
Chris Lattner24943d22010-06-08 16:52:24 +000073
74 switch (short_option)
75 {
Caroline Ticec1ad82e2010-09-07 22:38:08 +000076 //case 'l':
77 //if (language.SetLanguageFromCString (option_arg) == false)
78 //{
Greg Clayton9c236732011-10-26 00:56:27 +000079 // error.SetErrorStringWithFormat("invalid language option argument '%s'", option_arg);
Caroline Ticec1ad82e2010-09-07 22:38:08 +000080 //}
81 //break;
Chris Lattner24943d22010-06-08 16:52:24 +000082
Jim Ingham324067b2010-09-30 00:54:27 +000083 case 'o':
84 print_object = true;
85 break;
Jim Inghamea9d4262010-11-05 19:25:48 +000086
Jim Inghame41494a2011-04-16 00:01:13 +000087 case 'd':
88 {
89 bool success;
90 bool result;
91 result = Args::StringToBoolean(option_arg, true, &success);
92 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +000093 error.SetErrorStringWithFormat("invalid dynamic value setting: \"%s\"", option_arg);
Jim Inghame41494a2011-04-16 00:01:13 +000094 else
95 {
96 if (result)
Greg Clayton82f07462011-05-30 00:49:24 +000097 use_dynamic = eLazyBoolYes;
Jim Inghame41494a2011-04-16 00:01:13 +000098 else
99 use_dynamic = eLazyBoolNo;
100 }
101 }
102 break;
103
Jim Inghamea9d4262010-11-05 19:25:48 +0000104 case 'u':
Sean Callanan47dc4572011-09-15 02:13:07 +0000105 {
106 bool success;
107 unwind_on_error = Args::StringToBoolean(option_arg, true, &success);
108 if (!success)
Greg Clayton9c236732011-10-26 00:56:27 +0000109 error.SetErrorStringWithFormat("could not convert \"%s\" to a boolean value.", option_arg);
Sean Callanan47dc4572011-09-15 02:13:07 +0000110 break;
111 }
Chris Lattner24943d22010-06-08 16:52:24 +0000112 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000113 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
Chris Lattner24943d22010-06-08 16:52:24 +0000114 break;
115 }
116
117 return error;
118}
119
120void
Greg Claytona42880a2011-10-25 06:44:01 +0000121CommandObjectExpression::CommandOptions::OptionParsingStarting (CommandInterpreter &interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000122{
Jim Inghame41494a2011-04-16 00:01:13 +0000123 use_dynamic = eLazyBoolCalculate;
Greg Claytona42880a2011-10-25 06:44:01 +0000124 print_object = false;
Jim Inghamea9d4262010-11-05 19:25:48 +0000125 unwind_on_error = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000126 show_types = true;
127 show_summary = true;
128}
129
Greg Claytonb3448432011-03-24 21:19:54 +0000130const OptionDefinition*
Chris Lattner24943d22010-06-08 16:52:24 +0000131CommandObjectExpression::CommandOptions::GetDefinitions ()
132{
133 return g_option_table;
134}
135
Greg Clayton238c0a12010-09-18 01:14:36 +0000136CommandObjectExpression::CommandObjectExpression (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000137 CommandObjectRaw (interpreter,
138 "expression",
139 "Evaluate a C/ObjC/C++ expression in the current program context, using variables currently in scope.",
140 NULL,
141 eFlagProcessMustBePaused),
Greg Claytona42880a2011-10-25 06:44:01 +0000142 m_option_group (interpreter),
143 m_format_options (eFormatDefault),
144 m_command_options (),
Johnny Chencc112ac2010-09-30 18:30:25 +0000145 m_expr_line_count (0),
Chris Lattner24943d22010-06-08 16:52:24 +0000146 m_expr_lines ()
147{
148 SetHelpLong(
149"Examples: \n\
150\n\
151 expr my_struct->a = my_array[3] \n\
152 expr -f bin -- (index * 8) + 5 \n\
153 expr char c[] = \"foo\"; c[0]\n");
Caroline Tice43b014a2010-10-04 22:28:36 +0000154
155 CommandArgumentEntry arg;
156 CommandArgumentData expression_arg;
157
158 // Define the first (and only) variant of this arg.
159 expression_arg.arg_type = eArgTypeExpression;
160 expression_arg.arg_repetition = eArgRepeatPlain;
161
162 // There is only one variant this argument could be; put it into the argument entry.
163 arg.push_back (expression_arg);
164
165 // Push the data for the first argument into the m_arguments vector.
166 m_arguments.push_back (arg);
Greg Claytona42880a2011-10-25 06:44:01 +0000167
Greg Clayton24a6bd92011-10-27 17:55:14 +0000168 // Add the "--format" and "--gdb-format"
169 m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
Greg Claytona42880a2011-10-25 06:44:01 +0000170 m_option_group.Append (&m_command_options);
171 m_option_group.Finalize();
Chris Lattner24943d22010-06-08 16:52:24 +0000172}
173
174CommandObjectExpression::~CommandObjectExpression ()
175{
176}
177
178Options *
179CommandObjectExpression::GetOptions ()
180{
Greg Claytona42880a2011-10-25 06:44:01 +0000181 return &m_option_group;
Chris Lattner24943d22010-06-08 16:52:24 +0000182}
183
Chris Lattner24943d22010-06-08 16:52:24 +0000184size_t
185CommandObjectExpression::MultiLineExpressionCallback
186(
187 void *baton,
Greg Clayton63094e02010-06-23 01:19:29 +0000188 InputReader &reader,
Chris Lattner24943d22010-06-08 16:52:24 +0000189 lldb::InputReaderAction notification,
190 const char *bytes,
191 size_t bytes_len
192)
193{
Chris Lattner24943d22010-06-08 16:52:24 +0000194 CommandObjectExpression *cmd_object_expr = (CommandObjectExpression *) baton;
Caroline Tice892fadd2011-06-16 16:27:19 +0000195 bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
196
Chris Lattner24943d22010-06-08 16:52:24 +0000197 switch (notification)
198 {
199 case eInputReaderActivate:
Caroline Tice892fadd2011-06-16 16:27:19 +0000200 if (!batch_mode)
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000201 {
Greg Clayton234981a2011-07-20 03:41:06 +0000202 StreamSP async_strm_sp(reader.GetDebugger().GetAsyncOutputStream());
203 if (async_strm_sp)
204 {
205 async_strm_sp->PutCString("Enter expressions, then terminate with an empty line to evaluate:\n");
206 async_strm_sp->Flush();
207 }
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000208 }
Chris Lattner24943d22010-06-08 16:52:24 +0000209 // Fall through
210 case eInputReaderReactivate:
Chris Lattner24943d22010-06-08 16:52:24 +0000211 break;
212
213 case eInputReaderDeactivate:
214 break;
215
Caroline Tice4a348082011-05-02 20:41:46 +0000216 case eInputReaderAsynchronousOutputWritten:
217 break;
218
Chris Lattner24943d22010-06-08 16:52:24 +0000219 case eInputReaderGotToken:
220 ++cmd_object_expr->m_expr_line_count;
221 if (bytes && bytes_len)
222 {
223 cmd_object_expr->m_expr_lines.append (bytes, bytes_len + 1);
224 }
225
226 if (bytes_len == 0)
Greg Clayton63094e02010-06-23 01:19:29 +0000227 reader.SetIsDone(true);
Chris Lattner24943d22010-06-08 16:52:24 +0000228 break;
229
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000230 case eInputReaderInterrupt:
231 cmd_object_expr->m_expr_lines.clear();
232 reader.SetIsDone (true);
Caroline Tice892fadd2011-06-16 16:27:19 +0000233 if (!batch_mode)
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000234 {
Greg Clayton234981a2011-07-20 03:41:06 +0000235 StreamSP async_strm_sp (reader.GetDebugger().GetAsyncOutputStream());
236 if (async_strm_sp)
237 {
238 async_strm_sp->PutCString("Expression evaluation cancelled.\n");
239 async_strm_sp->Flush();
240 }
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000241 }
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000242 break;
243
244 case eInputReaderEndOfFile:
245 reader.SetIsDone (true);
246 break;
247
Chris Lattner24943d22010-06-08 16:52:24 +0000248 case eInputReaderDone:
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000249 if (cmd_object_expr->m_expr_lines.size() > 0)
Chris Lattner24943d22010-06-08 16:52:24 +0000250 {
Caroline Tice87e1f772011-06-13 20:20:29 +0000251 StreamSP output_stream = reader.GetDebugger().GetAsyncOutputStream();
252 StreamSP error_stream = reader.GetDebugger().GetAsyncErrorStream();
Chris Lattner24943d22010-06-08 16:52:24 +0000253 cmd_object_expr->EvaluateExpression (cmd_object_expr->m_expr_lines.c_str(),
Caroline Tice87e1f772011-06-13 20:20:29 +0000254 output_stream.get(),
255 error_stream.get());
256 output_stream->Flush();
257 error_stream->Flush();
Chris Lattner24943d22010-06-08 16:52:24 +0000258 }
259 break;
260 }
261
262 return bytes_len;
263}
264
265bool
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000266CommandObjectExpression::EvaluateExpression
267(
268 const char *expr,
Caroline Tice87e1f772011-06-13 20:20:29 +0000269 Stream *output_stream,
270 Stream *error_stream,
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000271 CommandReturnObject *result
272)
Chris Lattner24943d22010-06-08 16:52:24 +0000273{
Greg Claytonf75e3912012-01-27 18:18:23 +0000274 Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
Sean Callananf35a96c2011-10-27 21:22:25 +0000275
276 if (!target)
277 target = Host::GetDummyTarget(m_interpreter.GetDebugger()).get();
278
Greg Clayton567e7f32011-09-22 04:58:26 +0000279 if (target)
Chris Lattner24943d22010-06-08 16:52:24 +0000280 {
Greg Clayton427f2902010-12-14 02:59:59 +0000281 lldb::ValueObjectSP result_valobj_sp;
Greg Clayton11730f32010-10-06 03:09:11 +0000282
Greg Claytonb3448432011-03-24 21:19:54 +0000283 ExecutionResults exe_results;
Sean Callanan6a925532011-01-13 08:53:35 +0000284
285 bool keep_in_memory = true;
Jim Ingham10de7d12011-05-04 03:43:18 +0000286 lldb::DynamicValueType use_dynamic;
Jim Inghame41494a2011-04-16 00:01:13 +0000287 // If use dynamic is not set, get it from the target:
Greg Claytona42880a2011-10-25 06:44:01 +0000288 switch (m_command_options.use_dynamic)
Jim Inghame41494a2011-04-16 00:01:13 +0000289 {
290 case eLazyBoolCalculate:
Greg Clayton567e7f32011-09-22 04:58:26 +0000291 use_dynamic = target->GetPreferDynamicValue();
Jim Inghame41494a2011-04-16 00:01:13 +0000292 break;
293 case eLazyBoolYes:
Jim Ingham10de7d12011-05-04 03:43:18 +0000294 use_dynamic = lldb::eDynamicCanRunTarget;
Jim Inghame41494a2011-04-16 00:01:13 +0000295 break;
296 case eLazyBoolNo:
Jim Ingham10de7d12011-05-04 03:43:18 +0000297 use_dynamic = lldb::eNoDynamicValues;
Jim Inghame41494a2011-04-16 00:01:13 +0000298 break;
299 }
Sean Callanan6a925532011-01-13 08:53:35 +0000300
Greg Clayton567e7f32011-09-22 04:58:26 +0000301 exe_results = target->EvaluateExpression (expr,
Greg Claytonf75e3912012-01-27 18:18:23 +0000302 m_interpreter.GetExecutionContext().GetFramePtr(),
Greg Clayton567e7f32011-09-22 04:58:26 +0000303 eExecutionPolicyOnlyWhenNeeded,
Sean Callanandaa6efe2011-12-21 22:22:58 +0000304 m_command_options.print_object,
Greg Claytona42880a2011-10-25 06:44:01 +0000305 m_command_options.unwind_on_error,
Greg Clayton567e7f32011-09-22 04:58:26 +0000306 keep_in_memory,
307 use_dynamic,
Enrico Granata6cca9692012-07-16 23:10:35 +0000308 result_valobj_sp,
309 0 /* no timeout */);
Greg Clayton427f2902010-12-14 02:59:59 +0000310
Greg Claytona42880a2011-10-25 06:44:01 +0000311 if (exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
Jim Ingham360f53f2010-11-30 02:22:11 +0000312 {
Greg Claytonabe0fed2011-04-18 08:33:37 +0000313 uint32_t start_frame = 0;
314 uint32_t num_frames = 1;
315 uint32_t num_frames_with_source = 0;
Greg Claytonf75e3912012-01-27 18:18:23 +0000316 Thread *thread = m_interpreter.GetExecutionContext().GetThreadPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000317 if (thread)
Greg Claytonabe0fed2011-04-18 08:33:37 +0000318 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000319 thread->GetStatus (result->GetOutputStream(),
320 start_frame,
321 num_frames,
322 num_frames_with_source);
Greg Claytonabe0fed2011-04-18 08:33:37 +0000323 }
Greg Clayton567e7f32011-09-22 04:58:26 +0000324 else
Greg Claytonabe0fed2011-04-18 08:33:37 +0000325 {
Greg Claytonf75e3912012-01-27 18:18:23 +0000326 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000327 if (process)
328 {
329 bool only_threads_with_stop_reason = true;
330 process->GetThreadStatus (result->GetOutputStream(),
331 only_threads_with_stop_reason,
332 start_frame,
333 num_frames,
334 num_frames_with_source);
335 }
Greg Claytonabe0fed2011-04-18 08:33:37 +0000336 }
Greg Clayton427f2902010-12-14 02:59:59 +0000337 }
338
339 if (result_valobj_sp)
340 {
341 if (result_valobj_sp->GetError().Success())
342 {
Greg Claytona42880a2011-10-25 06:44:01 +0000343 Format format = m_format_options.GetFormat();
344 if (format != eFormatDefault)
345 result_valobj_sp->SetFormat (format);
Greg Clayton427f2902010-12-14 02:59:59 +0000346
Enrico Granata3069c622012-03-01 04:24:26 +0000347 ValueObject::DumpValueObjectOptions options;
348 options.SetMaximumPointerDepth(0)
349 .SetMaximumDepth(UINT32_MAX)
350 .SetShowLocation(false)
351 .SetShowTypes(m_command_options.show_types)
352 .SetUseObjectiveC(m_command_options.print_object)
353 .SetUseDynamicType(use_dynamic)
354 .SetScopeChecked(true)
355 .SetFlatOutput(false)
Enrico Granatacf09f882012-03-19 22:58:49 +0000356 .SetUseSyntheticValue(true)
Enrico Granata3069c622012-03-01 04:24:26 +0000357 .SetIgnoreCap(false)
358 .SetFormat(format)
Enrico Granatabd587152012-03-28 22:17:37 +0000359 .SetSummary()
360 .SetShowSummary(!m_command_options.print_object);
361
Caroline Tice87e1f772011-06-13 20:20:29 +0000362 ValueObject::DumpValueObject (*(output_stream),
Greg Clayton427f2902010-12-14 02:59:59 +0000363 result_valobj_sp.get(), // Variable object to dump
Enrico Granata3069c622012-03-01 04:24:26 +0000364 options);
Greg Clayton427f2902010-12-14 02:59:59 +0000365 if (result)
366 result->SetStatus (eReturnStatusSuccessFinishResult);
367 }
368 else
369 {
Sean Callanan24312442011-08-23 21:20:51 +0000370 if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult)
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000371 {
Sean Callanan24312442011-08-23 21:20:51 +0000372 error_stream->PutCString("<no result>\n");
373
374 if (result)
375 result->SetStatus (eReturnStatusSuccessFinishResult);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000376 }
377 else
378 {
Sean Callanan24312442011-08-23 21:20:51 +0000379 const char *error_cstr = result_valobj_sp->GetError().AsCString();
380 if (error_cstr && error_cstr[0])
381 {
382 int error_cstr_len = strlen (error_cstr);
383 const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
384 if (strstr(error_cstr, "error:") != error_cstr)
385 error_stream->PutCString ("error: ");
386 error_stream->Write(error_cstr, error_cstr_len);
387 if (!ends_with_newline)
388 error_stream->EOL();
389 }
390 else
391 {
392 error_stream->PutCString ("error: unknown error\n");
393 }
394
395 if (result)
396 result->SetStatus (eReturnStatusFailed);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000397 }
Jim Ingham360f53f2010-11-30 02:22:11 +0000398 }
399 }
Greg Clayton427f2902010-12-14 02:59:59 +0000400 }
401 else
402 {
Caroline Tice87e1f772011-06-13 20:20:29 +0000403 error_stream->Printf ("error: invalid execution context for expression\n");
Greg Clayton427f2902010-12-14 02:59:59 +0000404 return false;
Sean Callanan841026f2010-07-23 00:16:21 +0000405 }
Sean Callanan82b74c82010-08-12 01:56:52 +0000406
Sean Callanan841026f2010-07-23 00:16:21 +0000407 return true;
Chris Lattner24943d22010-06-08 16:52:24 +0000408}
409
410bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000411CommandObjectExpression::DoExecute
Chris Lattner24943d22010-06-08 16:52:24 +0000412(
413 const char *command,
Chris Lattner24943d22010-06-08 16:52:24 +0000414 CommandReturnObject &result
415)
416{
Greg Claytona42880a2011-10-25 06:44:01 +0000417 m_option_group.NotifyOptionParsingStarting();
Chris Lattner24943d22010-06-08 16:52:24 +0000418
419 const char * expr = NULL;
420
421 if (command[0] == '\0')
422 {
423 m_expr_lines.clear();
424 m_expr_line_count = 0;
425
Greg Clayton238c0a12010-09-18 01:14:36 +0000426 InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
Chris Lattner24943d22010-06-08 16:52:24 +0000427 if (reader_sp)
428 {
429 Error err (reader_sp->Initialize (CommandObjectExpression::MultiLineExpressionCallback,
430 this, // baton
431 eInputReaderGranularityLine, // token size, to pass to callback function
Greg Clayton63094e02010-06-23 01:19:29 +0000432 NULL, // end token
Chris Lattner24943d22010-06-08 16:52:24 +0000433 NULL, // prompt
434 true)); // echo input
435 if (err.Success())
436 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000437 m_interpreter.GetDebugger().PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000438 result.SetStatus (eReturnStatusSuccessFinishNoResult);
439 }
440 else
441 {
442 result.AppendError (err.AsCString());
443 result.SetStatus (eReturnStatusFailed);
444 }
445 }
446 else
447 {
448 result.AppendError("out of memory");
449 result.SetStatus (eReturnStatusFailed);
450 }
451 return result.Succeeded();
452 }
453
454 if (command[0] == '-')
455 {
456 // We have some options and these options MUST end with --.
457 const char *end_options = NULL;
458 const char *s = command;
459 while (s && s[0])
460 {
461 end_options = ::strstr (s, "--");
462 if (end_options)
463 {
464 end_options += 2; // Get past the "--"
465 if (::isspace (end_options[0]))
466 {
467 expr = end_options;
468 while (::isspace (*expr))
469 ++expr;
470 break;
471 }
472 }
473 s = end_options;
474 }
475
476 if (end_options)
477 {
Greg Clayton63094e02010-06-23 01:19:29 +0000478 Args args (command, end_options - command);
Greg Clayton238c0a12010-09-18 01:14:36 +0000479 if (!ParseOptions (args, result))
Chris Lattner24943d22010-06-08 16:52:24 +0000480 return false;
Greg Clayton143fcc32011-04-13 00:18:08 +0000481
Greg Claytona42880a2011-10-25 06:44:01 +0000482 Error error (m_option_group.NotifyOptionParsingFinished());
Greg Clayton143fcc32011-04-13 00:18:08 +0000483 if (error.Fail())
484 {
485 result.AppendError (error.AsCString());
486 result.SetStatus (eReturnStatusFailed);
487 return false;
488 }
Chris Lattner24943d22010-06-08 16:52:24 +0000489 }
490 }
491
Chris Lattner24943d22010-06-08 16:52:24 +0000492 if (expr == NULL)
493 expr = command;
Sean Callanan46b62492010-06-24 00:16:27 +0000494
Caroline Tice87e1f772011-06-13 20:20:29 +0000495 if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
Johnny Chen0deefc72010-08-13 00:42:30 +0000496 return true;
497
498 result.SetStatus (eReturnStatusFailed);
499 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000500}
501