blob: abaf4c678912d9a6ef5f72e6a169fce9c864f064 [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
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner24943d22010-06-08 16:52:24 +000012#include "CommandObjectExpression.h"
13
14// C Includes
15// C++ Includes
16// Other libraries and framework includes
17// Project includes
Sean Callanan841026f2010-07-23 00:16:21 +000018#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/Value.h"
20#include "lldb/Core/InputReader.h"
Jim Ingham324067b2010-09-30 00:54:27 +000021#include "lldb/Core/ValueObjectVariable.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Expression/ClangExpressionVariable.h"
Sean Callanan65dafa82010-08-27 01:01:44 +000023#include "lldb/Expression/ClangUserExpression.h"
Stephen Wilson63c468c2010-07-23 21:47:22 +000024#include "lldb/Expression/ClangFunction.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Expression/DWARFExpression.h"
26#include "lldb/Host/Host.h"
Sean Callanan841026f2010-07-23 00:16:21 +000027#include "lldb/Core/Debugger.h"
Greg Clayton63094e02010-06-23 01:19:29 +000028#include "lldb/Interpreter/CommandInterpreter.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Interpreter/CommandReturnObject.h"
Jim Ingham324067b2010-09-30 00:54:27 +000030#include "lldb/Target/ObjCLanguageRuntime.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/ObjectFile.h"
32#include "lldb/Symbol/Variable.h"
33#include "lldb/Target/Process.h"
34#include "lldb/Target/StackFrame.h"
35#include "lldb/Target/Target.h"
Greg Claytonabe0fed2011-04-18 08:33:37 +000036#include "lldb/Target/Thread.h"
Sean Callanan841026f2010-07-23 00:16:21 +000037#include "llvm/ADT/StringRef.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038
39using namespace lldb;
40using namespace lldb_private;
41
Greg Claytona42880a2011-10-25 06:44:01 +000042CommandObjectExpression::CommandOptions::CommandOptions () :
43 OptionGroup()
Chris Lattner24943d22010-06-08 16:52:24 +000044{
Chris Lattner24943d22010-06-08 16:52:24 +000045}
46
47
48CommandObjectExpression::CommandOptions::~CommandOptions ()
49{
50}
51
Greg Claytona42880a2011-10-25 06:44:01 +000052OptionDefinition
53CommandObjectExpression::CommandOptions::g_option_table[] =
54{
Jim Ingham47beabb2012-10-16 21:41:58 +000055 { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "all-threads", 'a', required_argument, NULL, 0, eArgTypeBoolean, "Should we run all threads if the execution doesn't complete on one thread."},
Jim Inghamb7940202013-01-15 02:47:48 +000056 { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "ignore-breakpoints", 'i', required_argument, NULL, 0, eArgTypeBoolean, "Ignore breakpoint hits while running expressions"},
Jim Ingham47beabb2012-10-16 21:41:58 +000057 { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "timeout", 't', required_argument, NULL, 0, eArgTypeUnsignedInteger, "Timeout value for running the expression."},
Greg Claytona42880a2011-10-25 06:44:01 +000058 { 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."},
Greg Claytona42880a2011-10-25 06:44:01 +000059};
60
61
62uint32_t
63CommandObjectExpression::CommandOptions::GetNumDefinitions ()
64{
65 return sizeof(g_option_table)/sizeof(OptionDefinition);
66}
67
Chris Lattner24943d22010-06-08 16:52:24 +000068Error
Greg Claytona42880a2011-10-25 06:44:01 +000069CommandObjectExpression::CommandOptions::SetOptionValue (CommandInterpreter &interpreter,
70 uint32_t option_idx,
71 const char *option_arg)
Chris Lattner24943d22010-06-08 16:52:24 +000072{
73 Error error;
74
Greg Clayton6475c422012-12-04 00:32:51 +000075 const int short_option = g_option_table[option_idx].short_option;
Chris Lattner24943d22010-06-08 16:52:24 +000076
77 switch (short_option)
78 {
Caroline Ticec1ad82e2010-09-07 22:38:08 +000079 //case 'l':
80 //if (language.SetLanguageFromCString (option_arg) == false)
81 //{
Greg Clayton9c236732011-10-26 00:56:27 +000082 // error.SetErrorStringWithFormat("invalid language option argument '%s'", option_arg);
Caroline Ticec1ad82e2010-09-07 22:38:08 +000083 //}
84 //break;
Chris Lattner24943d22010-06-08 16:52:24 +000085
Jim Ingham47beabb2012-10-16 21:41:58 +000086 case 'a':
87 {
88 bool success;
89 bool result;
90 result = Args::StringToBoolean(option_arg, true, &success);
91 if (!success)
92 error.SetErrorStringWithFormat("invalid all-threads value setting: \"%s\"", option_arg);
93 else
94 try_all_threads = result;
95 }
Jim Ingham324067b2010-09-30 00:54:27 +000096 break;
Jim Inghamea9d4262010-11-05 19:25:48 +000097
Jim Inghamb7940202013-01-15 02:47:48 +000098 case 'i':
99 {
100 bool success;
101 bool tmp_value = Args::StringToBoolean(option_arg, true, &success);
102 if (success)
103 ignore_breakpoints = tmp_value;
104 else
105 error.SetErrorStringWithFormat("could not convert \"%s\" to a boolean value.", option_arg);
106 break;
107 }
Jim Ingham47beabb2012-10-16 21:41:58 +0000108 case 't':
109 {
110 bool success;
111 uint32_t result;
112 result = Args::StringToUInt32(option_arg, 0, 0, &success);
113 if (success)
114 timeout = result;
115 else
116 error.SetErrorStringWithFormat ("invalid timeout setting \"%s\"", option_arg);
117 }
118 break;
119
Jim Inghamea9d4262010-11-05 19:25:48 +0000120 case 'u':
Sean Callanan47dc4572011-09-15 02:13:07 +0000121 {
122 bool success;
Jim Inghamb7940202013-01-15 02:47:48 +0000123 bool tmp_value = Args::StringToBoolean(option_arg, true, &success);
124 if (success)
125 unwind_on_error = tmp_value;
126 else
Greg Clayton9c236732011-10-26 00:56:27 +0000127 error.SetErrorStringWithFormat("could not convert \"%s\" to a boolean value.", option_arg);
Sean Callanan47dc4572011-09-15 02:13:07 +0000128 break;
129 }
Chris Lattner24943d22010-06-08 16:52:24 +0000130 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000131 error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
Chris Lattner24943d22010-06-08 16:52:24 +0000132 break;
133 }
134
135 return error;
136}
137
138void
Greg Claytona42880a2011-10-25 06:44:01 +0000139CommandObjectExpression::CommandOptions::OptionParsingStarting (CommandInterpreter &interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +0000140{
Jim Inghamb7940202013-01-15 02:47:48 +0000141 Process *process = interpreter.GetExecutionContext().GetProcessPtr();
142 if (process != NULL)
143 {
144 ignore_breakpoints = process->GetIgnoreBreakpointsInExpressions();
145 unwind_on_error = process->GetUnwindOnErrorInExpressions();
146 }
147 else
148 {
149 ignore_breakpoints = false;
150 unwind_on_error = true;
151 }
152
Chris Lattner24943d22010-06-08 16:52:24 +0000153 show_summary = true;
Jim Ingham47beabb2012-10-16 21:41:58 +0000154 try_all_threads = true;
155 timeout = 0;
Chris Lattner24943d22010-06-08 16:52:24 +0000156}
157
Greg Claytonb3448432011-03-24 21:19:54 +0000158const OptionDefinition*
Chris Lattner24943d22010-06-08 16:52:24 +0000159CommandObjectExpression::CommandOptions::GetDefinitions ()
160{
161 return g_option_table;
162}
163
Greg Clayton238c0a12010-09-18 01:14:36 +0000164CommandObjectExpression::CommandObjectExpression (CommandInterpreter &interpreter) :
Jim Inghamda26bd22012-06-08 21:56:10 +0000165 CommandObjectRaw (interpreter,
166 "expression",
Jim Ingham02ed2852012-10-25 18:11:24 +0000167 "Evaluate a C/ObjC/C++ expression in the current program context, using user defined variables and variables currently in scope.",
Jim Inghamda26bd22012-06-08 21:56:10 +0000168 NULL,
Greg Claytonea0bb4d2013-01-09 19:44:40 +0000169 eFlagProcessMustBePaused | eFlagTryTargetAPILock),
Greg Claytona42880a2011-10-25 06:44:01 +0000170 m_option_group (interpreter),
171 m_format_options (eFormatDefault),
172 m_command_options (),
Johnny Chencc112ac2010-09-30 18:30:25 +0000173 m_expr_line_count (0),
Chris Lattner24943d22010-06-08 16:52:24 +0000174 m_expr_lines ()
175{
176 SetHelpLong(
Jim Ingham47beabb2012-10-16 21:41:58 +0000177"Timeouts:\n\
178 If the expression can be evaluated statically (without runnning code) then it will be.\n\
179 Otherwise, by default the expression will run on the current thread with a short timeout:\n\
180 currently .25 seconds. If it doesn't return in that time, the evaluation will be interrupted\n\
181 and resumed with all threads running. You can use the -a option to disable retrying on all\n\
182 threads. You can use the -t option to set a shorter timeout.\n\
Jim Ingham02ed2852012-10-25 18:11:24 +0000183\n\
184User defined variables:\n\
185 You can define your own variables for convenience or to be used in subsequent expressions.\n\
186 You define them the same way you would define variables in C. If the first character of \n\
187 your user defined variable is a $, then the variable's value will be available in future\n\
188 expressions, otherwise it will just be available in the current expression.\n\
189\n\
Jim Ingham47beabb2012-10-16 21:41:58 +0000190Examples: \n\
Chris Lattner24943d22010-06-08 16:52:24 +0000191\n\
192 expr my_struct->a = my_array[3] \n\
193 expr -f bin -- (index * 8) + 5 \n\
Jim Ingham02ed2852012-10-25 18:11:24 +0000194 expr unsigned int $foo = 5\n\
Chris Lattner24943d22010-06-08 16:52:24 +0000195 expr char c[] = \"foo\"; c[0]\n");
Caroline Tice43b014a2010-10-04 22:28:36 +0000196
197 CommandArgumentEntry arg;
198 CommandArgumentData expression_arg;
199
200 // Define the first (and only) variant of this arg.
201 expression_arg.arg_type = eArgTypeExpression;
202 expression_arg.arg_repetition = eArgRepeatPlain;
203
204 // There is only one variant this argument could be; put it into the argument entry.
205 arg.push_back (expression_arg);
206
207 // Push the data for the first argument into the m_arguments vector.
208 m_arguments.push_back (arg);
Greg Claytona42880a2011-10-25 06:44:01 +0000209
Greg Clayton24a6bd92011-10-27 17:55:14 +0000210 // Add the "--format" and "--gdb-format"
211 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 +0000212 m_option_group.Append (&m_command_options);
Enrico Granata3a91e142013-01-09 20:12:53 +0000213 m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1 | LLDB_OPT_SET_2);
Greg Claytona42880a2011-10-25 06:44:01 +0000214 m_option_group.Finalize();
Chris Lattner24943d22010-06-08 16:52:24 +0000215}
216
217CommandObjectExpression::~CommandObjectExpression ()
218{
219}
220
221Options *
222CommandObjectExpression::GetOptions ()
223{
Greg Claytona42880a2011-10-25 06:44:01 +0000224 return &m_option_group;
Chris Lattner24943d22010-06-08 16:52:24 +0000225}
226
Chris Lattner24943d22010-06-08 16:52:24 +0000227size_t
228CommandObjectExpression::MultiLineExpressionCallback
229(
230 void *baton,
Greg Clayton63094e02010-06-23 01:19:29 +0000231 InputReader &reader,
Chris Lattner24943d22010-06-08 16:52:24 +0000232 lldb::InputReaderAction notification,
233 const char *bytes,
234 size_t bytes_len
235)
236{
Chris Lattner24943d22010-06-08 16:52:24 +0000237 CommandObjectExpression *cmd_object_expr = (CommandObjectExpression *) baton;
Caroline Tice892fadd2011-06-16 16:27:19 +0000238 bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
239
Chris Lattner24943d22010-06-08 16:52:24 +0000240 switch (notification)
241 {
242 case eInputReaderActivate:
Caroline Tice892fadd2011-06-16 16:27:19 +0000243 if (!batch_mode)
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000244 {
Greg Clayton234981a2011-07-20 03:41:06 +0000245 StreamSP async_strm_sp(reader.GetDebugger().GetAsyncOutputStream());
246 if (async_strm_sp)
247 {
248 async_strm_sp->PutCString("Enter expressions, then terminate with an empty line to evaluate:\n");
249 async_strm_sp->Flush();
250 }
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000251 }
Chris Lattner24943d22010-06-08 16:52:24 +0000252 // Fall through
253 case eInputReaderReactivate:
Chris Lattner24943d22010-06-08 16:52:24 +0000254 break;
255
256 case eInputReaderDeactivate:
257 break;
258
Caroline Tice4a348082011-05-02 20:41:46 +0000259 case eInputReaderAsynchronousOutputWritten:
260 break;
261
Chris Lattner24943d22010-06-08 16:52:24 +0000262 case eInputReaderGotToken:
263 ++cmd_object_expr->m_expr_line_count;
264 if (bytes && bytes_len)
265 {
266 cmd_object_expr->m_expr_lines.append (bytes, bytes_len + 1);
267 }
268
269 if (bytes_len == 0)
Greg Clayton63094e02010-06-23 01:19:29 +0000270 reader.SetIsDone(true);
Chris Lattner24943d22010-06-08 16:52:24 +0000271 break;
272
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000273 case eInputReaderInterrupt:
274 cmd_object_expr->m_expr_lines.clear();
275 reader.SetIsDone (true);
Caroline Tice892fadd2011-06-16 16:27:19 +0000276 if (!batch_mode)
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000277 {
Greg Clayton234981a2011-07-20 03:41:06 +0000278 StreamSP async_strm_sp (reader.GetDebugger().GetAsyncOutputStream());
279 if (async_strm_sp)
280 {
281 async_strm_sp->PutCString("Expression evaluation cancelled.\n");
282 async_strm_sp->Flush();
283 }
Caroline Tice2b5e4e62011-06-15 19:35:17 +0000284 }
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000285 break;
286
287 case eInputReaderEndOfFile:
288 reader.SetIsDone (true);
289 break;
290
Chris Lattner24943d22010-06-08 16:52:24 +0000291 case eInputReaderDone:
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000292 if (cmd_object_expr->m_expr_lines.size() > 0)
Chris Lattner24943d22010-06-08 16:52:24 +0000293 {
Caroline Tice87e1f772011-06-13 20:20:29 +0000294 StreamSP output_stream = reader.GetDebugger().GetAsyncOutputStream();
295 StreamSP error_stream = reader.GetDebugger().GetAsyncErrorStream();
Chris Lattner24943d22010-06-08 16:52:24 +0000296 cmd_object_expr->EvaluateExpression (cmd_object_expr->m_expr_lines.c_str(),
Caroline Tice87e1f772011-06-13 20:20:29 +0000297 output_stream.get(),
298 error_stream.get());
299 output_stream->Flush();
300 error_stream->Flush();
Chris Lattner24943d22010-06-08 16:52:24 +0000301 }
302 break;
303 }
304
305 return bytes_len;
306}
307
308bool
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000309CommandObjectExpression::EvaluateExpression
310(
311 const char *expr,
Caroline Tice87e1f772011-06-13 20:20:29 +0000312 Stream *output_stream,
313 Stream *error_stream,
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000314 CommandReturnObject *result
315)
Chris Lattner24943d22010-06-08 16:52:24 +0000316{
Greg Claytonea0bb4d2013-01-09 19:44:40 +0000317 Target *target = m_exe_ctx.GetTargetPtr();
Sean Callananf35a96c2011-10-27 21:22:25 +0000318
319 if (!target)
320 target = Host::GetDummyTarget(m_interpreter.GetDebugger()).get();
321
Greg Clayton567e7f32011-09-22 04:58:26 +0000322 if (target)
Chris Lattner24943d22010-06-08 16:52:24 +0000323 {
Greg Clayton427f2902010-12-14 02:59:59 +0000324 lldb::ValueObjectSP result_valobj_sp;
Greg Clayton11730f32010-10-06 03:09:11 +0000325
Greg Claytonb3448432011-03-24 21:19:54 +0000326 ExecutionResults exe_results;
Sean Callanan6a925532011-01-13 08:53:35 +0000327
328 bool keep_in_memory = true;
Enrico Granata3a91e142013-01-09 20:12:53 +0000329
Jim Ingham47beabb2012-10-16 21:41:58 +0000330 EvaluateExpressionOptions options;
Enrico Granata3a91e142013-01-09 20:12:53 +0000331 options.SetCoerceToId(m_varobj_options.use_objc)
Enrico Granatad27026e2012-09-05 20:41:26 +0000332 .SetUnwindOnError(m_command_options.unwind_on_error)
Jim Inghamb7940202013-01-15 02:47:48 +0000333 .SetIgnoreBreakpoints (m_command_options.ignore_breakpoints)
Enrico Granatad27026e2012-09-05 20:41:26 +0000334 .SetKeepInMemory(keep_in_memory)
Enrico Granata3a91e142013-01-09 20:12:53 +0000335 .SetUseDynamic(m_varobj_options.use_dynamic)
Jim Ingham47beabb2012-10-16 21:41:58 +0000336 .SetRunOthers(m_command_options.try_all_threads)
337 .SetTimeoutUsec(m_command_options.timeout);
Enrico Granatad27026e2012-09-05 20:41:26 +0000338
Greg Clayton567e7f32011-09-22 04:58:26 +0000339 exe_results = target->EvaluateExpression (expr,
Greg Claytonea0bb4d2013-01-09 19:44:40 +0000340 m_exe_ctx.GetFramePtr(),
Enrico Granata6cca9692012-07-16 23:10:35 +0000341 result_valobj_sp,
Enrico Granatad27026e2012-09-05 20:41:26 +0000342 options);
Greg Clayton427f2902010-12-14 02:59:59 +0000343
Jim Inghamb7940202013-01-15 02:47:48 +0000344 if ((exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
345 ||(exe_results == eExecutionHitBreakpoint && !m_command_options.ignore_breakpoints))
Jim Ingham360f53f2010-11-30 02:22:11 +0000346 {
Greg Claytonabe0fed2011-04-18 08:33:37 +0000347 uint32_t start_frame = 0;
348 uint32_t num_frames = 1;
349 uint32_t num_frames_with_source = 0;
Greg Claytonea0bb4d2013-01-09 19:44:40 +0000350 Thread *thread = m_exe_ctx.GetThreadPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000351 if (thread)
Greg Claytonabe0fed2011-04-18 08:33:37 +0000352 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000353 thread->GetStatus (result->GetOutputStream(),
354 start_frame,
355 num_frames,
356 num_frames_with_source);
Greg Claytonabe0fed2011-04-18 08:33:37 +0000357 }
Greg Clayton567e7f32011-09-22 04:58:26 +0000358 else
Greg Claytonabe0fed2011-04-18 08:33:37 +0000359 {
Greg Claytonea0bb4d2013-01-09 19:44:40 +0000360 Process *process = m_exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000361 if (process)
362 {
363 bool only_threads_with_stop_reason = true;
364 process->GetThreadStatus (result->GetOutputStream(),
365 only_threads_with_stop_reason,
366 start_frame,
367 num_frames,
368 num_frames_with_source);
369 }
Greg Claytonabe0fed2011-04-18 08:33:37 +0000370 }
Greg Clayton427f2902010-12-14 02:59:59 +0000371 }
Sean Callanan96abc622012-08-08 17:35:10 +0000372
Greg Clayton427f2902010-12-14 02:59:59 +0000373 if (result_valobj_sp)
374 {
Sean Callanan96abc622012-08-08 17:35:10 +0000375 Format format = m_format_options.GetFormat();
376
Greg Clayton427f2902010-12-14 02:59:59 +0000377 if (result_valobj_sp->GetError().Success())
378 {
Sean Callanan96abc622012-08-08 17:35:10 +0000379 if (format != eFormatVoid)
380 {
381 if (format != eFormatDefault)
382 result_valobj_sp->SetFormat (format);
Greg Clayton427f2902010-12-14 02:59:59 +0000383
Sean Callanan96abc622012-08-08 17:35:10 +0000384 ValueObject::DumpValueObjectOptions options;
Enrico Granata3a91e142013-01-09 20:12:53 +0000385 options.SetMaximumPointerDepth(m_varobj_options.ptr_depth)
386 .SetMaximumDepth(m_varobj_options.max_depth)
387 .SetShowTypes(m_varobj_options.show_types)
388 .SetShowLocation(m_varobj_options.show_location)
389 .SetUseObjectiveC(m_varobj_options.use_objc)
390 .SetUseDynamicType(m_varobj_options.use_dynamic)
391 .SetUseSyntheticValue(m_varobj_options.use_synth)
392 .SetFlatOutput(m_varobj_options.flat_output)
393 .SetOmitSummaryDepth(m_varobj_options.no_summary_depth)
394 .SetIgnoreCap(m_varobj_options.ignore_cap)
Sean Callanan96abc622012-08-08 17:35:10 +0000395 .SetFormat(format)
396 .SetSummary()
Enrico Granata3a91e142013-01-09 20:12:53 +0000397 .SetShowSummary(!m_varobj_options.use_objc)
398 .SetHideRootType(m_varobj_options.use_objc);
Enrico Granatacd8cd612013-01-14 23:53:26 +0000399
400 if (m_varobj_options.be_raw)
401 options.SetRawDisplay(true);
Enrico Granata3a91e142013-01-09 20:12:53 +0000402
Sean Callanan96abc622012-08-08 17:35:10 +0000403 ValueObject::DumpValueObject (*(output_stream),
404 result_valobj_sp.get(), // Variable object to dump
405 options);
406 if (result)
407 result->SetStatus (eReturnStatusSuccessFinishResult);
408 }
Greg Clayton427f2902010-12-14 02:59:59 +0000409 }
410 else
411 {
Sean Callanan24312442011-08-23 21:20:51 +0000412 if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult)
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000413 {
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000414 if (format != eFormatVoid && m_interpreter.GetDebugger().GetNotifyVoid())
Sean Callanan96abc622012-08-08 17:35:10 +0000415 {
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000416 error_stream->PutCString("(void)\n");
Sean Callanan96abc622012-08-08 17:35:10 +0000417 }
Sean Callanan1e1e6cb2012-08-09 18:18:47 +0000418
419 if (result)
420 result->SetStatus (eReturnStatusSuccessFinishResult);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000421 }
422 else
423 {
Sean Callanan24312442011-08-23 21:20:51 +0000424 const char *error_cstr = result_valobj_sp->GetError().AsCString();
425 if (error_cstr && error_cstr[0])
426 {
427 int error_cstr_len = strlen (error_cstr);
428 const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
429 if (strstr(error_cstr, "error:") != error_cstr)
430 error_stream->PutCString ("error: ");
431 error_stream->Write(error_cstr, error_cstr_len);
432 if (!ends_with_newline)
433 error_stream->EOL();
434 }
435 else
436 {
437 error_stream->PutCString ("error: unknown error\n");
438 }
439
440 if (result)
441 result->SetStatus (eReturnStatusFailed);
Greg Claytonfe1b47d2011-06-24 22:31:10 +0000442 }
Jim Ingham360f53f2010-11-30 02:22:11 +0000443 }
444 }
Greg Clayton427f2902010-12-14 02:59:59 +0000445 }
446 else
447 {
Caroline Tice87e1f772011-06-13 20:20:29 +0000448 error_stream->Printf ("error: invalid execution context for expression\n");
Greg Clayton427f2902010-12-14 02:59:59 +0000449 return false;
Sean Callanan841026f2010-07-23 00:16:21 +0000450 }
Sean Callanan82b74c82010-08-12 01:56:52 +0000451
Sean Callanan841026f2010-07-23 00:16:21 +0000452 return true;
Chris Lattner24943d22010-06-08 16:52:24 +0000453}
454
455bool
Jim Inghamda26bd22012-06-08 21:56:10 +0000456CommandObjectExpression::DoExecute
Chris Lattner24943d22010-06-08 16:52:24 +0000457(
458 const char *command,
Chris Lattner24943d22010-06-08 16:52:24 +0000459 CommandReturnObject &result
460)
461{
Greg Claytona42880a2011-10-25 06:44:01 +0000462 m_option_group.NotifyOptionParsingStarting();
Chris Lattner24943d22010-06-08 16:52:24 +0000463
464 const char * expr = NULL;
465
466 if (command[0] == '\0')
467 {
468 m_expr_lines.clear();
469 m_expr_line_count = 0;
470
Greg Clayton238c0a12010-09-18 01:14:36 +0000471 InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
Chris Lattner24943d22010-06-08 16:52:24 +0000472 if (reader_sp)
473 {
474 Error err (reader_sp->Initialize (CommandObjectExpression::MultiLineExpressionCallback,
475 this, // baton
476 eInputReaderGranularityLine, // token size, to pass to callback function
Greg Clayton63094e02010-06-23 01:19:29 +0000477 NULL, // end token
Chris Lattner24943d22010-06-08 16:52:24 +0000478 NULL, // prompt
479 true)); // echo input
480 if (err.Success())
481 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000482 m_interpreter.GetDebugger().PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000483 result.SetStatus (eReturnStatusSuccessFinishNoResult);
484 }
485 else
486 {
487 result.AppendError (err.AsCString());
488 result.SetStatus (eReturnStatusFailed);
489 }
490 }
491 else
492 {
493 result.AppendError("out of memory");
494 result.SetStatus (eReturnStatusFailed);
495 }
496 return result.Succeeded();
497 }
498
499 if (command[0] == '-')
500 {
501 // We have some options and these options MUST end with --.
502 const char *end_options = NULL;
503 const char *s = command;
504 while (s && s[0])
505 {
506 end_options = ::strstr (s, "--");
507 if (end_options)
508 {
509 end_options += 2; // Get past the "--"
510 if (::isspace (end_options[0]))
511 {
512 expr = end_options;
513 while (::isspace (*expr))
514 ++expr;
515 break;
516 }
517 }
518 s = end_options;
519 }
520
521 if (end_options)
522 {
Greg Clayton63094e02010-06-23 01:19:29 +0000523 Args args (command, end_options - command);
Greg Clayton238c0a12010-09-18 01:14:36 +0000524 if (!ParseOptions (args, result))
Chris Lattner24943d22010-06-08 16:52:24 +0000525 return false;
Greg Clayton143fcc32011-04-13 00:18:08 +0000526
Greg Claytona42880a2011-10-25 06:44:01 +0000527 Error error (m_option_group.NotifyOptionParsingFinished());
Greg Clayton143fcc32011-04-13 00:18:08 +0000528 if (error.Fail())
529 {
530 result.AppendError (error.AsCString());
531 result.SetStatus (eReturnStatusFailed);
532 return false;
533 }
Chris Lattner24943d22010-06-08 16:52:24 +0000534 }
535 }
536
Chris Lattner24943d22010-06-08 16:52:24 +0000537 if (expr == NULL)
538 expr = command;
Sean Callanan46b62492010-06-24 00:16:27 +0000539
Caroline Tice87e1f772011-06-13 20:20:29 +0000540 if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
Johnny Chen0deefc72010-08-13 00:42:30 +0000541 return true;
542
543 result.SetStatus (eReturnStatusFailed);
544 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000545}
546