130fdc8d8SChris Lattner //===-- CommandObjectExpression.cpp -----------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "CommandObjectExpression.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // C Includes
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
16ebf7707eSSean Callanan #include "lldb/Interpreter/Args.h"
1730fdc8d8SChris Lattner #include "lldb/Core/Value.h"
1830fdc8d8SChris Lattner #include "lldb/Core/InputReader.h"
196c68fb45SJim Ingham #include "lldb/Core/ValueObjectVariable.h"
2030fdc8d8SChris Lattner #include "lldb/Expression/ClangExpressionVariable.h"
211a8d4093SSean Callanan #include "lldb/Expression/ClangUserExpression.h"
22ebb84b24SStephen Wilson #include "lldb/Expression/ClangFunction.h"
2330fdc8d8SChris Lattner #include "lldb/Expression/DWARFExpression.h"
2430fdc8d8SChris Lattner #include "lldb/Host/Host.h"
25ebf7707eSSean Callanan #include "lldb/Core/Debugger.h"
266611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
2730fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
286c68fb45SJim Ingham #include "lldb/Target/ObjCLanguageRuntime.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3230fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Target.h"
347260f620SGreg Clayton #include "lldb/Target/Thread.h"
35ebf7707eSSean Callanan #include "llvm/ADT/StringRef.h"
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner using namespace lldb;
3830fdc8d8SChris Lattner using namespace lldb_private;
3930fdc8d8SChris Lattner 
401deb7962SGreg Clayton CommandObjectExpression::CommandOptions::CommandOptions () :
411deb7962SGreg Clayton     OptionGroup()
4230fdc8d8SChris Lattner {
4330fdc8d8SChris Lattner }
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner CommandObjectExpression::CommandOptions::~CommandOptions ()
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
501deb7962SGreg Clayton OptionDefinition
511deb7962SGreg Clayton CommandObjectExpression::CommandOptions::g_option_table[] =
521deb7962SGreg Clayton {
5335e1bda6SJim Ingham     { 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."},
541deb7962SGreg Clayton     { 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."},
5535e1bda6SJim Ingham     { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "timeout",            't', required_argument, NULL, 0, eArgTypeUnsignedInteger,  "Timeout value for running the expression."},
561deb7962SGreg Clayton     { 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."},
571deb7962SGreg Clayton     { LLDB_OPT_SET_2                 , false, "object-description", 'o', no_argument,       NULL, 0, eArgTypeNone,       "Print the object description of the value resulting from the expression."},
581deb7962SGreg Clayton };
591deb7962SGreg Clayton 
601deb7962SGreg Clayton 
611deb7962SGreg Clayton uint32_t
621deb7962SGreg Clayton CommandObjectExpression::CommandOptions::GetNumDefinitions ()
631deb7962SGreg Clayton {
641deb7962SGreg Clayton     return sizeof(g_option_table)/sizeof(OptionDefinition);
651deb7962SGreg Clayton }
661deb7962SGreg Clayton 
6730fdc8d8SChris Lattner Error
681deb7962SGreg Clayton CommandObjectExpression::CommandOptions::SetOptionValue (CommandInterpreter &interpreter,
691deb7962SGreg Clayton                                                          uint32_t option_idx,
701deb7962SGreg Clayton                                                          const char *option_arg)
7130fdc8d8SChris Lattner {
7230fdc8d8SChris Lattner     Error error;
7330fdc8d8SChris Lattner 
741deb7962SGreg Clayton     const char short_option = (char) g_option_table[option_idx].short_option;
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner     switch (short_option)
7730fdc8d8SChris Lattner     {
783f4c09c1SCaroline Tice       //case 'l':
793f4c09c1SCaroline Tice       //if (language.SetLanguageFromCString (option_arg) == false)
803f4c09c1SCaroline Tice       //{
8186edbf41SGreg Clayton       //    error.SetErrorStringWithFormat("invalid language option argument '%s'", option_arg);
823f4c09c1SCaroline Tice       //}
833f4c09c1SCaroline Tice       //break;
8430fdc8d8SChris Lattner 
8535e1bda6SJim Ingham     case 'a':
8635e1bda6SJim Ingham         {
8735e1bda6SJim Ingham             bool success;
8835e1bda6SJim Ingham             bool result;
8935e1bda6SJim Ingham             result = Args::StringToBoolean(option_arg, true, &success);
9035e1bda6SJim Ingham             if (!success)
9135e1bda6SJim Ingham                 error.SetErrorStringWithFormat("invalid all-threads value setting: \"%s\"", option_arg);
9235e1bda6SJim Ingham             else
9335e1bda6SJim Ingham                 try_all_threads = result;
9435e1bda6SJim Ingham         }
956c68fb45SJim Ingham         break;
966c68fb45SJim Ingham 
9778a685aaSJim Ingham     case 'd':
9878a685aaSJim Ingham         {
9978a685aaSJim Ingham             bool success;
10078a685aaSJim Ingham             bool result;
10178a685aaSJim Ingham             result = Args::StringToBoolean(option_arg, true, &success);
10278a685aaSJim Ingham             if (!success)
10386edbf41SGreg Clayton                 error.SetErrorStringWithFormat("invalid dynamic value setting: \"%s\"", option_arg);
10478a685aaSJim Ingham             else
10578a685aaSJim Ingham             {
10678a685aaSJim Ingham                 if (result)
10778a685aaSJim Ingham                     use_dynamic = eLazyBoolYes;
10878a685aaSJim Ingham                 else
10978a685aaSJim Ingham                     use_dynamic = eLazyBoolNo;
11078a685aaSJim Ingham             }
11178a685aaSJim Ingham         }
11278a685aaSJim Ingham         break;
11378a685aaSJim Ingham 
11435e1bda6SJim Ingham     case 'o':
11535e1bda6SJim Ingham         print_object = true;
11635e1bda6SJim Ingham         break;
11735e1bda6SJim Ingham 
11835e1bda6SJim Ingham     case 't':
11935e1bda6SJim Ingham         {
12035e1bda6SJim Ingham             bool success;
12135e1bda6SJim Ingham             uint32_t result;
12235e1bda6SJim Ingham             result = Args::StringToUInt32(option_arg, 0, 0, &success);
12335e1bda6SJim Ingham             if (success)
12435e1bda6SJim Ingham                 timeout = result;
12535e1bda6SJim Ingham             else
12635e1bda6SJim Ingham                 error.SetErrorStringWithFormat ("invalid timeout setting \"%s\"", option_arg);
12735e1bda6SJim Ingham         }
12835e1bda6SJim Ingham         break;
12935e1bda6SJim Ingham 
130399f1cafSJim Ingham     case 'u':
1313bfdaa2aSSean Callanan         {
132399f1cafSJim Ingham             bool success;
133399f1cafSJim Ingham             unwind_on_error = Args::StringToBoolean(option_arg, true, &success);
134399f1cafSJim Ingham             if (!success)
13586edbf41SGreg Clayton                 error.SetErrorStringWithFormat("could not convert \"%s\" to a boolean value.", option_arg);
136399f1cafSJim Ingham             break;
1373bfdaa2aSSean Callanan         }
13830fdc8d8SChris Lattner     default:
13986edbf41SGreg Clayton         error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
14030fdc8d8SChris Lattner         break;
14130fdc8d8SChris Lattner     }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner     return error;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14630fdc8d8SChris Lattner void
1471deb7962SGreg Clayton CommandObjectExpression::CommandOptions::OptionParsingStarting (CommandInterpreter &interpreter)
14830fdc8d8SChris Lattner {
14978a685aaSJim Ingham     use_dynamic = eLazyBoolCalculate;
1501deb7962SGreg Clayton     print_object = false;
151399f1cafSJim Ingham     unwind_on_error = true;
15230fdc8d8SChris Lattner     show_types = true;
15330fdc8d8SChris Lattner     show_summary = true;
15435e1bda6SJim Ingham     try_all_threads = true;
15535e1bda6SJim Ingham     timeout = 0;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
158e0d378b3SGreg Clayton const OptionDefinition*
15930fdc8d8SChris Lattner CommandObjectExpression::CommandOptions::GetDefinitions ()
16030fdc8d8SChris Lattner {
16130fdc8d8SChris Lattner     return g_option_table;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
164a7015092SGreg Clayton CommandObjectExpression::CommandObjectExpression (CommandInterpreter &interpreter) :
1655a988416SJim Ingham     CommandObjectRaw (interpreter,
16630fdc8d8SChris Lattner                       "expression",
167*5c48d5c5SJim Ingham                       "Evaluate a C/ObjC/C++ expression in the current program context, using user defined variables and variables currently in scope.",
1685a988416SJim Ingham                       NULL,
1695a988416SJim Ingham                       eFlagProcessMustBePaused),
1701deb7962SGreg Clayton     m_option_group (interpreter),
1711deb7962SGreg Clayton     m_format_options (eFormatDefault),
1721deb7962SGreg Clayton     m_command_options (),
17330fdc8d8SChris Lattner     m_expr_line_count (0),
17430fdc8d8SChris Lattner     m_expr_lines ()
17530fdc8d8SChris Lattner {
17630fdc8d8SChris Lattner   SetHelpLong(
17735e1bda6SJim Ingham "Timeouts:\n\
17835e1bda6SJim Ingham     If the expression can be evaluated statically (without runnning code) then it will be.\n\
17935e1bda6SJim Ingham     Otherwise, by default the expression will run on the current thread with a short timeout:\n\
18035e1bda6SJim Ingham     currently .25 seconds.  If it doesn't return in that time, the evaluation will be interrupted\n\
18135e1bda6SJim Ingham     and resumed with all threads running.  You can use the -a option to disable retrying on all\n\
18235e1bda6SJim Ingham     threads.  You can use the -t option to set a shorter timeout.\n\
183*5c48d5c5SJim Ingham \n\
184*5c48d5c5SJim Ingham User defined variables:\n\
185*5c48d5c5SJim Ingham     You can define your own variables for convenience or to be used in subsequent expressions.\n\
186*5c48d5c5SJim Ingham     You define them the same way you would define variables in C.  If the first character of \n\
187*5c48d5c5SJim Ingham     your user defined variable is a $, then the variable's value will be available in future\n\
188*5c48d5c5SJim Ingham     expressions, otherwise it will just be available in the current expression.\n\
189*5c48d5c5SJim Ingham \n\
19035e1bda6SJim Ingham Examples: \n\
19130fdc8d8SChris Lattner \n\
19230fdc8d8SChris Lattner    expr my_struct->a = my_array[3] \n\
19330fdc8d8SChris Lattner    expr -f bin -- (index * 8) + 5 \n\
194*5c48d5c5SJim Ingham    expr unsigned int $foo = 5\n\
19530fdc8d8SChris Lattner    expr char c[] = \"foo\"; c[0]\n");
196405fe67fSCaroline Tice 
197405fe67fSCaroline Tice     CommandArgumentEntry arg;
198405fe67fSCaroline Tice     CommandArgumentData expression_arg;
199405fe67fSCaroline Tice 
200405fe67fSCaroline Tice     // Define the first (and only) variant of this arg.
201405fe67fSCaroline Tice     expression_arg.arg_type = eArgTypeExpression;
202405fe67fSCaroline Tice     expression_arg.arg_repetition = eArgRepeatPlain;
203405fe67fSCaroline Tice 
204405fe67fSCaroline Tice     // There is only one variant this argument could be; put it into the argument entry.
205405fe67fSCaroline Tice     arg.push_back (expression_arg);
206405fe67fSCaroline Tice 
207405fe67fSCaroline Tice     // Push the data for the first argument into the m_arguments vector.
208405fe67fSCaroline Tice     m_arguments.push_back (arg);
2091deb7962SGreg Clayton 
2105009f9d5SGreg Clayton     // Add the "--format" and "--gdb-format"
2115009f9d5SGreg Clayton     m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
2121deb7962SGreg Clayton     m_option_group.Append (&m_command_options);
2131deb7962SGreg Clayton     m_option_group.Finalize();
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner CommandObjectExpression::~CommandObjectExpression ()
21730fdc8d8SChris Lattner {
21830fdc8d8SChris Lattner }
21930fdc8d8SChris Lattner 
22030fdc8d8SChris Lattner Options *
22130fdc8d8SChris Lattner CommandObjectExpression::GetOptions ()
22230fdc8d8SChris Lattner {
2231deb7962SGreg Clayton     return &m_option_group;
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner size_t
22730fdc8d8SChris Lattner CommandObjectExpression::MultiLineExpressionCallback
22830fdc8d8SChris Lattner (
22930fdc8d8SChris Lattner     void *baton,
2306611103cSGreg Clayton     InputReader &reader,
23130fdc8d8SChris Lattner     lldb::InputReaderAction notification,
23230fdc8d8SChris Lattner     const char *bytes,
23330fdc8d8SChris Lattner     size_t bytes_len
23430fdc8d8SChris Lattner )
23530fdc8d8SChris Lattner {
23630fdc8d8SChris Lattner     CommandObjectExpression *cmd_object_expr = (CommandObjectExpression *) baton;
237d61c10bcSCaroline Tice     bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
23830fdc8d8SChris Lattner 
23930fdc8d8SChris Lattner     switch (notification)
24030fdc8d8SChris Lattner     {
24130fdc8d8SChris Lattner     case eInputReaderActivate:
242d61c10bcSCaroline Tice         if (!batch_mode)
24315356e7fSCaroline Tice         {
24407e66e3eSGreg Clayton             StreamSP async_strm_sp(reader.GetDebugger().GetAsyncOutputStream());
24507e66e3eSGreg Clayton             if (async_strm_sp)
24607e66e3eSGreg Clayton             {
24707e66e3eSGreg Clayton                 async_strm_sp->PutCString("Enter expressions, then terminate with an empty line to evaluate:\n");
24807e66e3eSGreg Clayton                 async_strm_sp->Flush();
24907e66e3eSGreg Clayton             }
25015356e7fSCaroline Tice         }
25130fdc8d8SChris Lattner         // Fall through
25230fdc8d8SChris Lattner     case eInputReaderReactivate:
25330fdc8d8SChris Lattner         break;
25430fdc8d8SChris Lattner 
25530fdc8d8SChris Lattner     case eInputReaderDeactivate:
25630fdc8d8SChris Lattner         break;
25730fdc8d8SChris Lattner 
258969ed3d1SCaroline Tice     case eInputReaderAsynchronousOutputWritten:
259969ed3d1SCaroline Tice         break;
260969ed3d1SCaroline Tice 
26130fdc8d8SChris Lattner     case eInputReaderGotToken:
26230fdc8d8SChris Lattner         ++cmd_object_expr->m_expr_line_count;
26330fdc8d8SChris Lattner         if (bytes && bytes_len)
26430fdc8d8SChris Lattner         {
26530fdc8d8SChris Lattner             cmd_object_expr->m_expr_lines.append (bytes, bytes_len + 1);
26630fdc8d8SChris Lattner         }
26730fdc8d8SChris Lattner 
26830fdc8d8SChris Lattner         if (bytes_len == 0)
2696611103cSGreg Clayton             reader.SetIsDone(true);
27030fdc8d8SChris Lattner         break;
27130fdc8d8SChris Lattner 
272efed6131SCaroline Tice     case eInputReaderInterrupt:
273efed6131SCaroline Tice         cmd_object_expr->m_expr_lines.clear();
274efed6131SCaroline Tice         reader.SetIsDone (true);
275d61c10bcSCaroline Tice         if (!batch_mode)
27615356e7fSCaroline Tice         {
27707e66e3eSGreg Clayton             StreamSP async_strm_sp (reader.GetDebugger().GetAsyncOutputStream());
27807e66e3eSGreg Clayton             if (async_strm_sp)
27907e66e3eSGreg Clayton             {
28007e66e3eSGreg Clayton                 async_strm_sp->PutCString("Expression evaluation cancelled.\n");
28107e66e3eSGreg Clayton                 async_strm_sp->Flush();
28207e66e3eSGreg Clayton             }
28315356e7fSCaroline Tice         }
284efed6131SCaroline Tice         break;
285efed6131SCaroline Tice 
286efed6131SCaroline Tice     case eInputReaderEndOfFile:
287efed6131SCaroline Tice         reader.SetIsDone (true);
288efed6131SCaroline Tice         break;
289efed6131SCaroline Tice 
29030fdc8d8SChris Lattner     case eInputReaderDone:
291efed6131SCaroline Tice 		if (cmd_object_expr->m_expr_lines.size() > 0)
29230fdc8d8SChris Lattner         {
2936e8dc334SCaroline Tice             StreamSP output_stream = reader.GetDebugger().GetAsyncOutputStream();
2946e8dc334SCaroline Tice             StreamSP error_stream = reader.GetDebugger().GetAsyncErrorStream();
29530fdc8d8SChris Lattner             cmd_object_expr->EvaluateExpression (cmd_object_expr->m_expr_lines.c_str(),
2966e8dc334SCaroline Tice                                                  output_stream.get(),
2976e8dc334SCaroline Tice                                                  error_stream.get());
2986e8dc334SCaroline Tice             output_stream->Flush();
2996e8dc334SCaroline Tice             error_stream->Flush();
30030fdc8d8SChris Lattner         }
30130fdc8d8SChris Lattner         break;
30230fdc8d8SChris Lattner     }
30330fdc8d8SChris Lattner 
30430fdc8d8SChris Lattner     return bytes_len;
30530fdc8d8SChris Lattner }
30630fdc8d8SChris Lattner 
30730fdc8d8SChris Lattner bool
3081d3afba3SGreg Clayton CommandObjectExpression::EvaluateExpression
3091d3afba3SGreg Clayton (
3101d3afba3SGreg Clayton     const char *expr,
3116e8dc334SCaroline Tice     Stream *output_stream,
3126e8dc334SCaroline Tice     Stream *error_stream,
3131d3afba3SGreg Clayton     CommandReturnObject *result
3141d3afba3SGreg Clayton )
31530fdc8d8SChris Lattner {
316a73d2692SGreg Clayton     Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
317c0a6e061SSean Callanan 
318c0a6e061SSean Callanan     if (!target)
319c0a6e061SSean Callanan         target = Host::GetDummyTarget(m_interpreter.GetDebugger()).get();
320c0a6e061SSean Callanan 
321c14ee32dSGreg Clayton     if (target)
3226961e878SSean Callanan     {
3238b2fe6dcSGreg Clayton         lldb::ValueObjectSP result_valobj_sp;
3248b2fe6dcSGreg Clayton 
325e0d378b3SGreg Clayton         ExecutionResults exe_results;
32692adcac9SSean Callanan 
32792adcac9SSean Callanan         bool keep_in_memory = true;
3282837b766SJim Ingham         lldb::DynamicValueType use_dynamic;
32978a685aaSJim Ingham         // If use dynamic is not set, get it from the target:
3301deb7962SGreg Clayton         switch (m_command_options.use_dynamic)
33178a685aaSJim Ingham         {
33278a685aaSJim Ingham         case eLazyBoolCalculate:
333c14ee32dSGreg Clayton             use_dynamic = target->GetPreferDynamicValue();
33478a685aaSJim Ingham             break;
33578a685aaSJim Ingham         case eLazyBoolYes:
3362837b766SJim Ingham             use_dynamic = lldb::eDynamicCanRunTarget;
33778a685aaSJim Ingham             break;
33878a685aaSJim Ingham         case eLazyBoolNo:
3392837b766SJim Ingham             use_dynamic = lldb::eNoDynamicValues;
34078a685aaSJim Ingham             break;
34178a685aaSJim Ingham         }
34292adcac9SSean Callanan 
34335e1bda6SJim Ingham         EvaluateExpressionOptions options;
344d4439aa9SEnrico Granata         options.SetCoerceToId(m_command_options.print_object)
345d4439aa9SEnrico Granata         .SetUnwindOnError(m_command_options.unwind_on_error)
346d4439aa9SEnrico Granata         .SetKeepInMemory(keep_in_memory)
347d4439aa9SEnrico Granata         .SetUseDynamic(use_dynamic)
34835e1bda6SJim Ingham         .SetRunOthers(m_command_options.try_all_threads)
34935e1bda6SJim Ingham         .SetTimeoutUsec(m_command_options.timeout);
350d4439aa9SEnrico Granata 
351c14ee32dSGreg Clayton         exe_results = target->EvaluateExpression (expr,
352a73d2692SGreg Clayton                                                   m_interpreter.GetExecutionContext().GetFramePtr(),
3533372f581SEnrico Granata                                                   result_valobj_sp,
354d4439aa9SEnrico Granata                                                   options);
3558b2fe6dcSGreg Clayton 
3561deb7962SGreg Clayton         if (exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
3578b2fe6dcSGreg Clayton         {
3587260f620SGreg Clayton             uint32_t start_frame = 0;
3597260f620SGreg Clayton             uint32_t num_frames = 1;
3607260f620SGreg Clayton             uint32_t num_frames_with_source = 0;
361a73d2692SGreg Clayton             Thread *thread = m_interpreter.GetExecutionContext().GetThreadPtr();
362c14ee32dSGreg Clayton             if (thread)
3637260f620SGreg Clayton             {
364c14ee32dSGreg Clayton                 thread->GetStatus (result->GetOutputStream(),
3657260f620SGreg Clayton                                    start_frame,
3667260f620SGreg Clayton                                    num_frames,
3677260f620SGreg Clayton                                    num_frames_with_source);
3687260f620SGreg Clayton             }
369c14ee32dSGreg Clayton             else
370c14ee32dSGreg Clayton             {
371a73d2692SGreg Clayton                 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
372c14ee32dSGreg Clayton                 if (process)
3737260f620SGreg Clayton                 {
3747260f620SGreg Clayton                     bool only_threads_with_stop_reason = true;
375c14ee32dSGreg Clayton                     process->GetThreadStatus (result->GetOutputStream(),
3767260f620SGreg Clayton                                               only_threads_with_stop_reason,
3777260f620SGreg Clayton                                               start_frame,
3787260f620SGreg Clayton                                               num_frames,
3797260f620SGreg Clayton                                               num_frames_with_source);
3807260f620SGreg Clayton                 }
3816961e878SSean Callanan             }
382c14ee32dSGreg Clayton         }
3836961e878SSean Callanan 
3848b2fe6dcSGreg Clayton         if (result_valobj_sp)
3858b2fe6dcSGreg Clayton         {
386bf154daeSSean Callanan             Format format = m_format_options.GetFormat();
387bf154daeSSean Callanan 
388b71f3844SGreg Clayton             if (result_valobj_sp->GetError().Success())
38930fdc8d8SChris Lattner             {
390bf154daeSSean Callanan                 if (format != eFormatVoid)
391bf154daeSSean Callanan                 {
3921deb7962SGreg Clayton                     if (format != eFormatDefault)
3931deb7962SGreg Clayton                         result_valobj_sp->SetFormat (format);
39432c4085bSGreg Clayton 
3950c489f58SEnrico Granata                     ValueObject::DumpValueObjectOptions options;
3960c489f58SEnrico Granata                     options.SetMaximumPointerDepth(0)
3970c489f58SEnrico Granata                     .SetMaximumDepth(UINT32_MAX)
3980c489f58SEnrico Granata                     .SetShowLocation(false)
3990c489f58SEnrico Granata                     .SetShowTypes(m_command_options.show_types)
4000c489f58SEnrico Granata                     .SetUseObjectiveC(m_command_options.print_object)
4010c489f58SEnrico Granata                     .SetUseDynamicType(use_dynamic)
4020c489f58SEnrico Granata                     .SetScopeChecked(true)
4030c489f58SEnrico Granata                     .SetFlatOutput(false)
40486cc9829SEnrico Granata                     .SetUseSyntheticValue(true)
4050c489f58SEnrico Granata                     .SetIgnoreCap(false)
4060c489f58SEnrico Granata                     .SetFormat(format)
407770eb05aSEnrico Granata                     .SetSummary()
4082b2631c9SEnrico Granata                     .SetShowSummary(!m_command_options.print_object)
4092b2631c9SEnrico Granata                     .SetHideRootType(m_command_options.print_object);
410770eb05aSEnrico Granata 
4116e8dc334SCaroline Tice                     ValueObject::DumpValueObject (*(output_stream),
4120184f019SGreg Clayton                                                   result_valobj_sp.get(),   // Variable object to dump
4130c489f58SEnrico Granata                                                   options);
414fcd43b71SJohnny Chen                     if (result)
415fcd43b71SJohnny Chen                         result->SetStatus (eReturnStatusSuccessFinishResult);
41630fdc8d8SChris Lattner                 }
417bf154daeSSean Callanan             }
41830fdc8d8SChris Lattner             else
41930fdc8d8SChris Lattner             {
420bccce813SSean Callanan                 if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult)
421bccce813SSean Callanan                 {
422bcf897faSSean Callanan                     if (format != eFormatVoid && m_interpreter.GetDebugger().GetNotifyVoid())
423bf154daeSSean Callanan                     {
424bcf897faSSean Callanan                         error_stream->PutCString("(void)\n");
425bcf897faSSean Callanan                     }
426bccce813SSean Callanan 
427bccce813SSean Callanan                     if (result)
428bccce813SSean Callanan                         result->SetStatus (eReturnStatusSuccessFinishResult);
429bccce813SSean Callanan                 }
430bccce813SSean Callanan                 else
431bccce813SSean Callanan                 {
4325fd05903SGreg Clayton                     const char *error_cstr = result_valobj_sp->GetError().AsCString();
4335fd05903SGreg Clayton                     if (error_cstr && error_cstr[0])
4345fd05903SGreg Clayton                     {
4355fd05903SGreg Clayton                         int error_cstr_len = strlen (error_cstr);
4365fd05903SGreg Clayton                         const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
4375fd05903SGreg Clayton                         if (strstr(error_cstr, "error:") != error_cstr)
4385fd05903SGreg Clayton                             error_stream->PutCString ("error: ");
4395fd05903SGreg Clayton                         error_stream->Write(error_cstr, error_cstr_len);
4405fd05903SGreg Clayton                         if (!ends_with_newline)
4415fd05903SGreg Clayton                             error_stream->EOL();
4425fd05903SGreg Clayton                     }
4435fd05903SGreg Clayton                     else
4445fd05903SGreg Clayton                     {
4455fd05903SGreg Clayton                         error_stream->PutCString ("error: unknown error\n");
4465fd05903SGreg Clayton                     }
4475fd05903SGreg Clayton 
448fcd43b71SJohnny Chen                     if (result)
449b71f3844SGreg Clayton                         result->SetStatus (eReturnStatusFailed);
45030fdc8d8SChris Lattner                 }
4518b2fe6dcSGreg Clayton             }
4528b2fe6dcSGreg Clayton         }
453bccce813SSean Callanan     }
4548b2fe6dcSGreg Clayton     else
4558b2fe6dcSGreg Clayton     {
4566e8dc334SCaroline Tice         error_stream->Printf ("error: invalid execution context for expression\n");
4578b2fe6dcSGreg Clayton         return false;
4588b2fe6dcSGreg Clayton     }
45930fdc8d8SChris Lattner 
46016ad5faeSSean Callanan     return true;
46130fdc8d8SChris Lattner }
46230fdc8d8SChris Lattner 
46330fdc8d8SChris Lattner bool
4645a988416SJim Ingham CommandObjectExpression::DoExecute
46530fdc8d8SChris Lattner (
46630fdc8d8SChris Lattner     const char *command,
46730fdc8d8SChris Lattner     CommandReturnObject &result
46830fdc8d8SChris Lattner )
46930fdc8d8SChris Lattner {
4701deb7962SGreg Clayton     m_option_group.NotifyOptionParsingStarting();
47130fdc8d8SChris Lattner 
47230fdc8d8SChris Lattner     const char * expr = NULL;
47330fdc8d8SChris Lattner 
47430fdc8d8SChris Lattner     if (command[0] == '\0')
47530fdc8d8SChris Lattner     {
47630fdc8d8SChris Lattner         m_expr_lines.clear();
47730fdc8d8SChris Lattner         m_expr_line_count = 0;
47830fdc8d8SChris Lattner 
479a7015092SGreg Clayton         InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
48030fdc8d8SChris Lattner         if (reader_sp)
48130fdc8d8SChris Lattner         {
48230fdc8d8SChris Lattner             Error err (reader_sp->Initialize (CommandObjectExpression::MultiLineExpressionCallback,
48330fdc8d8SChris Lattner                                               this,                         // baton
48430fdc8d8SChris Lattner                                               eInputReaderGranularityLine,  // token size, to pass to callback function
48530fdc8d8SChris Lattner                                               NULL,                         // end token
48630fdc8d8SChris Lattner                                               NULL,                         // prompt
48730fdc8d8SChris Lattner                                               true));                       // echo input
48830fdc8d8SChris Lattner             if (err.Success())
48930fdc8d8SChris Lattner             {
490a7015092SGreg Clayton                 m_interpreter.GetDebugger().PushInputReader (reader_sp);
49130fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusSuccessFinishNoResult);
49230fdc8d8SChris Lattner             }
49330fdc8d8SChris Lattner             else
49430fdc8d8SChris Lattner             {
49530fdc8d8SChris Lattner                 result.AppendError (err.AsCString());
49630fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
49730fdc8d8SChris Lattner             }
49830fdc8d8SChris Lattner         }
49930fdc8d8SChris Lattner         else
50030fdc8d8SChris Lattner         {
50130fdc8d8SChris Lattner             result.AppendError("out of memory");
50230fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
50330fdc8d8SChris Lattner         }
50430fdc8d8SChris Lattner         return result.Succeeded();
50530fdc8d8SChris Lattner     }
50630fdc8d8SChris Lattner 
50730fdc8d8SChris Lattner     if (command[0] == '-')
50830fdc8d8SChris Lattner     {
50930fdc8d8SChris Lattner         // We have some options and these options MUST end with --.
51030fdc8d8SChris Lattner         const char *end_options = NULL;
51130fdc8d8SChris Lattner         const char *s = command;
51230fdc8d8SChris Lattner         while (s && s[0])
51330fdc8d8SChris Lattner         {
51430fdc8d8SChris Lattner             end_options = ::strstr (s, "--");
51530fdc8d8SChris Lattner             if (end_options)
51630fdc8d8SChris Lattner             {
51730fdc8d8SChris Lattner                 end_options += 2; // Get past the "--"
51830fdc8d8SChris Lattner                 if (::isspace (end_options[0]))
51930fdc8d8SChris Lattner                 {
52030fdc8d8SChris Lattner                     expr = end_options;
52130fdc8d8SChris Lattner                     while (::isspace (*expr))
52230fdc8d8SChris Lattner                         ++expr;
52330fdc8d8SChris Lattner                     break;
52430fdc8d8SChris Lattner                 }
52530fdc8d8SChris Lattner             }
52630fdc8d8SChris Lattner             s = end_options;
52730fdc8d8SChris Lattner         }
52830fdc8d8SChris Lattner 
52930fdc8d8SChris Lattner         if (end_options)
53030fdc8d8SChris Lattner         {
53130fdc8d8SChris Lattner             Args args (command, end_options - command);
532a7015092SGreg Clayton             if (!ParseOptions (args, result))
53330fdc8d8SChris Lattner                 return false;
534f6b8b581SGreg Clayton 
5351deb7962SGreg Clayton             Error error (m_option_group.NotifyOptionParsingFinished());
536f6b8b581SGreg Clayton             if (error.Fail())
537f6b8b581SGreg Clayton             {
538f6b8b581SGreg Clayton                 result.AppendError (error.AsCString());
539f6b8b581SGreg Clayton                 result.SetStatus (eReturnStatusFailed);
540f6b8b581SGreg Clayton                 return false;
541f6b8b581SGreg Clayton             }
54230fdc8d8SChris Lattner         }
54330fdc8d8SChris Lattner     }
54430fdc8d8SChris Lattner 
54530fdc8d8SChris Lattner     if (expr == NULL)
54630fdc8d8SChris Lattner         expr = command;
54730fdc8d8SChris Lattner 
5486e8dc334SCaroline Tice     if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
549fcd43b71SJohnny Chen         return true;
550fcd43b71SJohnny Chen 
551fcd43b71SJohnny Chen     result.SetStatus (eReturnStatusFailed);
552fcd43b71SJohnny Chen     return false;
55330fdc8d8SChris Lattner }
55430fdc8d8SChris Lattner 
555