blob: 23c9dc10373599ec3137c91f657e76da27705743 [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
Enrico Granatad27026e2012-09-05 20:41:26 +0000301 Target::EvaluateExpressionOptions options;
302 options.SetCoerceToId(m_command_options.print_object)
303 .SetUnwindOnError(m_command_options.unwind_on_error)
304 .SetKeepInMemory(keep_in_memory)
305 .SetUseDynamic(use_dynamic)
306 .SetSingleThreadTimeoutUsec(0);
307
Greg Clayton567e7f32011-09-22 04:58:26 +0000308 exe_results = target->EvaluateExpression (expr,
Greg Claytonf75e3912012-01-27 18:18:23 +0000309 m_interpreter.GetExecutionContext().GetFramePtr(),
Enrico Granata6cca9692012-07-16 23:10:35 +0000310 result_valobj_sp,
Enrico Granatad27026e2012-09-05 20:41:26 +0000311 options);
Greg Clayton427f2902010-12-14 02:59:59 +0000312
Greg Claytona42880a2011-10-25 06:44:01 +0000313 if (exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
Jim Ingham360f53f2010-11-30 02:22:11 +0000314 {
Greg Claytonabe0fed2011-04-18 08:33:37 +0000315 uint32_t start_frame = 0;
316 uint32_t num_frames = 1;
317 uint32_t num_frames_with_source = 0;
Greg Claytonf75e3912012-01-27 18:18:23 +0000318 Thread *thread = m_interpreter.GetExecutionContext().GetThreadPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000319 if (thread)
Greg Claytonabe0fed2011-04-18 08:33:37 +0000320 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000321 thread->GetStatus (result->GetOutputStream(),
322 start_frame,
323 num_frames,
324 num_frames_with_source);
Greg Claytonabe0fed2011-04-18 08:33:37 +0000325 }
Greg Clayton567e7f32011-09-22 04:58:26 +0000326 else
Greg Claytonabe0fed2011-04-18 08:33:37 +0000327 {
Greg Claytonf75e3912012-01-27 18:18:23 +0000328 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000329 if (process)
330 {
331 bool only_threads_with_stop_reason = true;
332 process->GetThreadStatus (result->GetOutputStream(),
333 only_threads_with_stop_reason,
334 start_frame,
335 num_frames,
336 num_frames_with_source);
337 }
Greg Claytonabe0fed2011-04-18 08:33:37 +0000338 }
Greg Clayton427f2902010-12-14 02:59:59 +0000339 }
Sean Callanan96abc622012-08-08 17:35:10 +0000340
Greg Clayton427f2902010-12-14 02:59:59 +0000341 if (result_valobj_sp)
342 {
Sean Callanan96abc622012-08-08 17:35:10 +0000343 Format format = m_format_options.GetFormat();
344
Greg Clayton427f2902010-12-14 02:59:59 +0000345 if (result_valobj_sp->GetError().Success())
346 {
Sean Callanan96abc622012-08-08 17:35:10 +0000347 if (format != eFormatVoid)
348 {
349 if (format != eFormatDefault)
350 result_valobj_sp->SetFormat (format);
Greg Clayton427f2902010-12-14 02:59:59 +0000351
Sean Callanan96abc622012-08-08 17:35:10 +0000352 ValueObject::DumpValueObjectOptions options;
353 options.SetMaximumPointerDepth(0)
354 .SetMaximumDepth(UINT32_MAX)
355 .SetShowLocation(false)
356 .SetShowTypes(m_command_options.show_types)
357 .SetUseObjectiveC(m_command_options.print_object)
358 .SetUseDynamicType(use_dynamic)
359 .SetScopeChecked(true)
360 .SetFlatOutput(false)
361 .SetUseSyntheticValue(true)
362 .SetIgnoreCap(false)
363 .SetFormat(format)
364 .SetSummary()
Enrico Granata12213582012-08-09 16:51:25 +0000365 .SetShowSummary(!m_command_options.print_object)
366 .SetHideRootType(m_command_options.print_object);
Sean Callanan96abc622012-08-08 17:35:10 +0000367
368 ValueObject::DumpValueObject (*(output_stream),
369 result_valobj_sp.get(), // Variable object to dump
370 options);
371 if (result)
372 result->SetStatus (eReturnStatusSuccessFinishResult);
373 }
Greg Clayton427f2902010-12-14 02:59:59 +0000374 }
375 else
376 {
Sean Callanan24312442011-08-23 21:20:51 +0000377 if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult)
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000378 {
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000379 if (format != eFormatVoid && m_interpreter.GetDebugger().GetNotifyVoid())
Sean Callanan96abc622012-08-08 17:35:10 +0000380 {
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000381 error_stream->PutCString("(void)\n");
Sean Callanan96abc622012-08-08 17:35:10 +0000382 }
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000383
384 if (result)
385 result->SetStatus (eReturnStatusSuccessFinishResult);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000386 }
387 else
388 {
Sean Callanan24312442011-08-23 21:20:51 +0000389 const char *error_cstr = result_valobj_sp->GetError().AsCString();
390 if (error_cstr && error_cstr[0])
391 {
392 int error_cstr_len = strlen (error_cstr);
393 const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
394 if (strstr(error_cstr, "error:") != error_cstr)
395 error_stream->PutCString ("error: ");
396 error_stream->Write(error_cstr, error_cstr_len);
397 if (!ends_with_newline)
398 error_stream->EOL();
399 }
400 else
401 {
402 error_stream->PutCString ("error: unknown error\n");
403 }
404
405 if (result)
406 result->SetStatus (eReturnStatusFailed);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000407 }
Jim Ingham360f53f2010-11-30 02:22:11 +0000408 }
409 }
Greg Clayton427f2902010-12-14 02:59:59 +0000410 }
411 else
412 {
Caroline Tice87e1f772011-06-13 20:20:29 +0000413 error_stream->Printf ("error: invalid execution context for expression\n");
Greg Clayton427f2902010-12-14 02:59:59 +0000414 return false;
Sean Callanan841026f2010-07-23 00:16:21 +0000415 }
Sean Callanan82b74c82010-08-12 01:56:52 +0000416
Sean Callanan841026f2010-07-23 00:16:21 +0000417 return true;
Chris Lattner24943d22010-06-08 16:52:24 +0000418}
419
420bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000421CommandObjectExpression::DoExecute
Chris Lattner24943d22010-06-08 16:52:24 +0000422(
423 const char *command,
Chris Lattner24943d22010-06-08 16:52:24 +0000424 CommandReturnObject &result
425)
426{
Greg Claytona42880a2011-10-25 06:44:01 +0000427 m_option_group.NotifyOptionParsingStarting();
Chris Lattner24943d22010-06-08 16:52:24 +0000428
429 const char * expr = NULL;
430
431 if (command[0] == '\0')
432 {
433 m_expr_lines.clear();
434 m_expr_line_count = 0;
435
Greg Clayton238c0a12010-09-18 01:14:36 +0000436 InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
Chris Lattner24943d22010-06-08 16:52:24 +0000437 if (reader_sp)
438 {
439 Error err (reader_sp->Initialize (CommandObjectExpression::MultiLineExpressionCallback,
440 this, // baton
441 eInputReaderGranularityLine, // token size, to pass to callback function
Greg Clayton63094e02010-06-23 01:19:29 +0000442 NULL, // end token
Chris Lattner24943d22010-06-08 16:52:24 +0000443 NULL, // prompt
444 true)); // echo input
445 if (err.Success())
446 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000447 m_interpreter.GetDebugger().PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000448 result.SetStatus (eReturnStatusSuccessFinishNoResult);
449 }
450 else
451 {
452 result.AppendError (err.AsCString());
453 result.SetStatus (eReturnStatusFailed);
454 }
455 }
456 else
457 {
458 result.AppendError("out of memory");
459 result.SetStatus (eReturnStatusFailed);
460 }
461 return result.Succeeded();
462 }
463
464 if (command[0] == '-')
465 {
466 // We have some options and these options MUST end with --.
467 const char *end_options = NULL;
468 const char *s = command;
469 while (s && s[0])
470 {
471 end_options = ::strstr (s, "--");
472 if (end_options)
473 {
474 end_options += 2; // Get past the "--"
475 if (::isspace (end_options[0]))
476 {
477 expr = end_options;
478 while (::isspace (*expr))
479 ++expr;
480 break;
481 }
482 }
483 s = end_options;
484 }
485
486 if (end_options)
487 {
Greg Clayton63094e02010-06-23 01:19:29 +0000488 Args args (command, end_options - command);
Greg Clayton238c0a12010-09-18 01:14:36 +0000489 if (!ParseOptions (args, result))
Chris Lattner24943d22010-06-08 16:52:24 +0000490 return false;
Greg Clayton143fcc32011-04-13 00:18:08 +0000491
Greg Claytona42880a2011-10-25 06:44:01 +0000492 Error error (m_option_group.NotifyOptionParsingFinished());
Greg Clayton143fcc32011-04-13 00:18:08 +0000493 if (error.Fail())
494 {
495 result.AppendError (error.AsCString());
496 result.SetStatus (eReturnStatusFailed);
497 return false;
498 }
Chris Lattner24943d22010-06-08 16:52:24 +0000499 }
500 }
501
Chris Lattner24943d22010-06-08 16:52:24 +0000502 if (expr == NULL)
503 expr = command;
Sean Callanan46b62492010-06-24 00:16:27 +0000504
Caroline Tice87e1f772011-06-13 20:20:29 +0000505 if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
Johnny Chen0deefc72010-08-13 00:42:30 +0000506 return true;
507
508 result.SetStatus (eReturnStatusFailed);
509 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000510}
511