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 {
53*35e1bda6SJim 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."},
55*35e1bda6SJim 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 
85*35e1bda6SJim Ingham     case 'a':
86*35e1bda6SJim Ingham         {
87*35e1bda6SJim Ingham             bool success;
88*35e1bda6SJim Ingham             bool result;
89*35e1bda6SJim Ingham             result = Args::StringToBoolean(option_arg, true, &success);
90*35e1bda6SJim Ingham             if (!success)
91*35e1bda6SJim Ingham                 error.SetErrorStringWithFormat("invalid all-threads value setting: \"%s\"", option_arg);
92*35e1bda6SJim Ingham             else
93*35e1bda6SJim Ingham                 try_all_threads = result;
94*35e1bda6SJim 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 
114*35e1bda6SJim Ingham     case 'o':
115*35e1bda6SJim Ingham         print_object = true;
116*35e1bda6SJim Ingham         break;
117*35e1bda6SJim Ingham 
118*35e1bda6SJim Ingham     case 't':
119*35e1bda6SJim Ingham         {
120*35e1bda6SJim Ingham             bool success;
121*35e1bda6SJim Ingham             uint32_t result;
122*35e1bda6SJim Ingham             result = Args::StringToUInt32(option_arg, 0, 0, &success);
123*35e1bda6SJim Ingham             if (success)
124*35e1bda6SJim Ingham                 timeout = result;
125*35e1bda6SJim Ingham             else
126*35e1bda6SJim Ingham                 error.SetErrorStringWithFormat ("invalid timeout setting \"%s\"", option_arg);
127*35e1bda6SJim Ingham         }
128*35e1bda6SJim Ingham         break;
129*35e1bda6SJim 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;
154*35e1bda6SJim Ingham     try_all_threads = true;
155*35e1bda6SJim 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",
167a9a764e6SJohnny Chen                       "Evaluate a C/ObjC/C++ expression in the current program context, using 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(
177*35e1bda6SJim Ingham "Timeouts:\n\
178*35e1bda6SJim Ingham     If the expression can be evaluated statically (without runnning code) then it will be.\n\
179*35e1bda6SJim Ingham     Otherwise, by default the expression will run on the current thread with a short timeout:\n\
180*35e1bda6SJim Ingham     currently .25 seconds.  If it doesn't return in that time, the evaluation will be interrupted\n\
181*35e1bda6SJim Ingham     and resumed with all threads running.  You can use the -a option to disable retrying on all\n\
182*35e1bda6SJim Ingham     threads.  You can use the -t option to set a shorter timeout.\n\
183*35e1bda6SJim Ingham Examples: \n\
18430fdc8d8SChris Lattner \n\
18530fdc8d8SChris Lattner    expr my_struct->a = my_array[3] \n\
18630fdc8d8SChris Lattner    expr -f bin -- (index * 8) + 5 \n\
18730fdc8d8SChris Lattner    expr char c[] = \"foo\"; c[0]\n");
188405fe67fSCaroline Tice 
189405fe67fSCaroline Tice     CommandArgumentEntry arg;
190405fe67fSCaroline Tice     CommandArgumentData expression_arg;
191405fe67fSCaroline Tice 
192405fe67fSCaroline Tice     // Define the first (and only) variant of this arg.
193405fe67fSCaroline Tice     expression_arg.arg_type = eArgTypeExpression;
194405fe67fSCaroline Tice     expression_arg.arg_repetition = eArgRepeatPlain;
195405fe67fSCaroline Tice 
196405fe67fSCaroline Tice     // There is only one variant this argument could be; put it into the argument entry.
197405fe67fSCaroline Tice     arg.push_back (expression_arg);
198405fe67fSCaroline Tice 
199405fe67fSCaroline Tice     // Push the data for the first argument into the m_arguments vector.
200405fe67fSCaroline Tice     m_arguments.push_back (arg);
2011deb7962SGreg Clayton 
2025009f9d5SGreg Clayton     // Add the "--format" and "--gdb-format"
2035009f9d5SGreg Clayton     m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
2041deb7962SGreg Clayton     m_option_group.Append (&m_command_options);
2051deb7962SGreg Clayton     m_option_group.Finalize();
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner CommandObjectExpression::~CommandObjectExpression ()
20930fdc8d8SChris Lattner {
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
21230fdc8d8SChris Lattner Options *
21330fdc8d8SChris Lattner CommandObjectExpression::GetOptions ()
21430fdc8d8SChris Lattner {
2151deb7962SGreg Clayton     return &m_option_group;
21630fdc8d8SChris Lattner }
21730fdc8d8SChris Lattner 
21830fdc8d8SChris Lattner size_t
21930fdc8d8SChris Lattner CommandObjectExpression::MultiLineExpressionCallback
22030fdc8d8SChris Lattner (
22130fdc8d8SChris Lattner     void *baton,
2226611103cSGreg Clayton     InputReader &reader,
22330fdc8d8SChris Lattner     lldb::InputReaderAction notification,
22430fdc8d8SChris Lattner     const char *bytes,
22530fdc8d8SChris Lattner     size_t bytes_len
22630fdc8d8SChris Lattner )
22730fdc8d8SChris Lattner {
22830fdc8d8SChris Lattner     CommandObjectExpression *cmd_object_expr = (CommandObjectExpression *) baton;
229d61c10bcSCaroline Tice     bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
23030fdc8d8SChris Lattner 
23130fdc8d8SChris Lattner     switch (notification)
23230fdc8d8SChris Lattner     {
23330fdc8d8SChris Lattner     case eInputReaderActivate:
234d61c10bcSCaroline Tice         if (!batch_mode)
23515356e7fSCaroline Tice         {
23607e66e3eSGreg Clayton             StreamSP async_strm_sp(reader.GetDebugger().GetAsyncOutputStream());
23707e66e3eSGreg Clayton             if (async_strm_sp)
23807e66e3eSGreg Clayton             {
23907e66e3eSGreg Clayton                 async_strm_sp->PutCString("Enter expressions, then terminate with an empty line to evaluate:\n");
24007e66e3eSGreg Clayton                 async_strm_sp->Flush();
24107e66e3eSGreg Clayton             }
24215356e7fSCaroline Tice         }
24330fdc8d8SChris Lattner         // Fall through
24430fdc8d8SChris Lattner     case eInputReaderReactivate:
24530fdc8d8SChris Lattner         break;
24630fdc8d8SChris Lattner 
24730fdc8d8SChris Lattner     case eInputReaderDeactivate:
24830fdc8d8SChris Lattner         break;
24930fdc8d8SChris Lattner 
250969ed3d1SCaroline Tice     case eInputReaderAsynchronousOutputWritten:
251969ed3d1SCaroline Tice         break;
252969ed3d1SCaroline Tice 
25330fdc8d8SChris Lattner     case eInputReaderGotToken:
25430fdc8d8SChris Lattner         ++cmd_object_expr->m_expr_line_count;
25530fdc8d8SChris Lattner         if (bytes && bytes_len)
25630fdc8d8SChris Lattner         {
25730fdc8d8SChris Lattner             cmd_object_expr->m_expr_lines.append (bytes, bytes_len + 1);
25830fdc8d8SChris Lattner         }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner         if (bytes_len == 0)
2616611103cSGreg Clayton             reader.SetIsDone(true);
26230fdc8d8SChris Lattner         break;
26330fdc8d8SChris Lattner 
264efed6131SCaroline Tice     case eInputReaderInterrupt:
265efed6131SCaroline Tice         cmd_object_expr->m_expr_lines.clear();
266efed6131SCaroline Tice         reader.SetIsDone (true);
267d61c10bcSCaroline Tice         if (!batch_mode)
26815356e7fSCaroline Tice         {
26907e66e3eSGreg Clayton             StreamSP async_strm_sp (reader.GetDebugger().GetAsyncOutputStream());
27007e66e3eSGreg Clayton             if (async_strm_sp)
27107e66e3eSGreg Clayton             {
27207e66e3eSGreg Clayton                 async_strm_sp->PutCString("Expression evaluation cancelled.\n");
27307e66e3eSGreg Clayton                 async_strm_sp->Flush();
27407e66e3eSGreg Clayton             }
27515356e7fSCaroline Tice         }
276efed6131SCaroline Tice         break;
277efed6131SCaroline Tice 
278efed6131SCaroline Tice     case eInputReaderEndOfFile:
279efed6131SCaroline Tice         reader.SetIsDone (true);
280efed6131SCaroline Tice         break;
281efed6131SCaroline Tice 
28230fdc8d8SChris Lattner     case eInputReaderDone:
283efed6131SCaroline Tice 		if (cmd_object_expr->m_expr_lines.size() > 0)
28430fdc8d8SChris Lattner         {
2856e8dc334SCaroline Tice             StreamSP output_stream = reader.GetDebugger().GetAsyncOutputStream();
2866e8dc334SCaroline Tice             StreamSP error_stream = reader.GetDebugger().GetAsyncErrorStream();
28730fdc8d8SChris Lattner             cmd_object_expr->EvaluateExpression (cmd_object_expr->m_expr_lines.c_str(),
2886e8dc334SCaroline Tice                                                  output_stream.get(),
2896e8dc334SCaroline Tice                                                  error_stream.get());
2906e8dc334SCaroline Tice             output_stream->Flush();
2916e8dc334SCaroline Tice             error_stream->Flush();
29230fdc8d8SChris Lattner         }
29330fdc8d8SChris Lattner         break;
29430fdc8d8SChris Lattner     }
29530fdc8d8SChris Lattner 
29630fdc8d8SChris Lattner     return bytes_len;
29730fdc8d8SChris Lattner }
29830fdc8d8SChris Lattner 
29930fdc8d8SChris Lattner bool
3001d3afba3SGreg Clayton CommandObjectExpression::EvaluateExpression
3011d3afba3SGreg Clayton (
3021d3afba3SGreg Clayton     const char *expr,
3036e8dc334SCaroline Tice     Stream *output_stream,
3046e8dc334SCaroline Tice     Stream *error_stream,
3051d3afba3SGreg Clayton     CommandReturnObject *result
3061d3afba3SGreg Clayton )
30730fdc8d8SChris Lattner {
308a73d2692SGreg Clayton     Target *target = m_interpreter.GetExecutionContext().GetTargetPtr();
309c0a6e061SSean Callanan 
310c0a6e061SSean Callanan     if (!target)
311c0a6e061SSean Callanan         target = Host::GetDummyTarget(m_interpreter.GetDebugger()).get();
312c0a6e061SSean Callanan 
313c14ee32dSGreg Clayton     if (target)
3146961e878SSean Callanan     {
3158b2fe6dcSGreg Clayton         lldb::ValueObjectSP result_valobj_sp;
3168b2fe6dcSGreg Clayton 
317e0d378b3SGreg Clayton         ExecutionResults exe_results;
31892adcac9SSean Callanan 
31992adcac9SSean Callanan         bool keep_in_memory = true;
3202837b766SJim Ingham         lldb::DynamicValueType use_dynamic;
32178a685aaSJim Ingham         // If use dynamic is not set, get it from the target:
3221deb7962SGreg Clayton         switch (m_command_options.use_dynamic)
32378a685aaSJim Ingham         {
32478a685aaSJim Ingham         case eLazyBoolCalculate:
325c14ee32dSGreg Clayton             use_dynamic = target->GetPreferDynamicValue();
32678a685aaSJim Ingham             break;
32778a685aaSJim Ingham         case eLazyBoolYes:
3282837b766SJim Ingham             use_dynamic = lldb::eDynamicCanRunTarget;
32978a685aaSJim Ingham             break;
33078a685aaSJim Ingham         case eLazyBoolNo:
3312837b766SJim Ingham             use_dynamic = lldb::eNoDynamicValues;
33278a685aaSJim Ingham             break;
33378a685aaSJim Ingham         }
33492adcac9SSean Callanan 
335*35e1bda6SJim Ingham         EvaluateExpressionOptions options;
336d4439aa9SEnrico Granata         options.SetCoerceToId(m_command_options.print_object)
337d4439aa9SEnrico Granata         .SetUnwindOnError(m_command_options.unwind_on_error)
338d4439aa9SEnrico Granata         .SetKeepInMemory(keep_in_memory)
339d4439aa9SEnrico Granata         .SetUseDynamic(use_dynamic)
340*35e1bda6SJim Ingham         .SetRunOthers(m_command_options.try_all_threads)
341*35e1bda6SJim Ingham         .SetTimeoutUsec(m_command_options.timeout);
342d4439aa9SEnrico Granata 
343c14ee32dSGreg Clayton         exe_results = target->EvaluateExpression (expr,
344a73d2692SGreg Clayton                                                   m_interpreter.GetExecutionContext().GetFramePtr(),
3453372f581SEnrico Granata                                                   result_valobj_sp,
346d4439aa9SEnrico Granata                                                   options);
3478b2fe6dcSGreg Clayton 
3481deb7962SGreg Clayton         if (exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
3498b2fe6dcSGreg Clayton         {
3507260f620SGreg Clayton             uint32_t start_frame = 0;
3517260f620SGreg Clayton             uint32_t num_frames = 1;
3527260f620SGreg Clayton             uint32_t num_frames_with_source = 0;
353a73d2692SGreg Clayton             Thread *thread = m_interpreter.GetExecutionContext().GetThreadPtr();
354c14ee32dSGreg Clayton             if (thread)
3557260f620SGreg Clayton             {
356c14ee32dSGreg Clayton                 thread->GetStatus (result->GetOutputStream(),
3577260f620SGreg Clayton                                    start_frame,
3587260f620SGreg Clayton                                    num_frames,
3597260f620SGreg Clayton                                    num_frames_with_source);
3607260f620SGreg Clayton             }
361c14ee32dSGreg Clayton             else
362c14ee32dSGreg Clayton             {
363a73d2692SGreg Clayton                 Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
364c14ee32dSGreg Clayton                 if (process)
3657260f620SGreg Clayton                 {
3667260f620SGreg Clayton                     bool only_threads_with_stop_reason = true;
367c14ee32dSGreg Clayton                     process->GetThreadStatus (result->GetOutputStream(),
3687260f620SGreg Clayton                                               only_threads_with_stop_reason,
3697260f620SGreg Clayton                                               start_frame,
3707260f620SGreg Clayton                                               num_frames,
3717260f620SGreg Clayton                                               num_frames_with_source);
3727260f620SGreg Clayton                 }
3736961e878SSean Callanan             }
374c14ee32dSGreg Clayton         }
3756961e878SSean Callanan 
3768b2fe6dcSGreg Clayton         if (result_valobj_sp)
3778b2fe6dcSGreg Clayton         {
378bf154daeSSean Callanan             Format format = m_format_options.GetFormat();
379bf154daeSSean Callanan 
380b71f3844SGreg Clayton             if (result_valobj_sp->GetError().Success())
38130fdc8d8SChris Lattner             {
382bf154daeSSean Callanan                 if (format != eFormatVoid)
383bf154daeSSean Callanan                 {
3841deb7962SGreg Clayton                     if (format != eFormatDefault)
3851deb7962SGreg Clayton                         result_valobj_sp->SetFormat (format);
38632c4085bSGreg Clayton 
3870c489f58SEnrico Granata                     ValueObject::DumpValueObjectOptions options;
3880c489f58SEnrico Granata                     options.SetMaximumPointerDepth(0)
3890c489f58SEnrico Granata                     .SetMaximumDepth(UINT32_MAX)
3900c489f58SEnrico Granata                     .SetShowLocation(false)
3910c489f58SEnrico Granata                     .SetShowTypes(m_command_options.show_types)
3920c489f58SEnrico Granata                     .SetUseObjectiveC(m_command_options.print_object)
3930c489f58SEnrico Granata                     .SetUseDynamicType(use_dynamic)
3940c489f58SEnrico Granata                     .SetScopeChecked(true)
3950c489f58SEnrico Granata                     .SetFlatOutput(false)
39686cc9829SEnrico Granata                     .SetUseSyntheticValue(true)
3970c489f58SEnrico Granata                     .SetIgnoreCap(false)
3980c489f58SEnrico Granata                     .SetFormat(format)
399770eb05aSEnrico Granata                     .SetSummary()
4002b2631c9SEnrico Granata                     .SetShowSummary(!m_command_options.print_object)
4012b2631c9SEnrico Granata                     .SetHideRootType(m_command_options.print_object);
402770eb05aSEnrico Granata 
4036e8dc334SCaroline Tice                     ValueObject::DumpValueObject (*(output_stream),
4040184f019SGreg Clayton                                                   result_valobj_sp.get(),   // Variable object to dump
4050c489f58SEnrico Granata                                                   options);
406fcd43b71SJohnny Chen                     if (result)
407fcd43b71SJohnny Chen                         result->SetStatus (eReturnStatusSuccessFinishResult);
40830fdc8d8SChris Lattner                 }
409bf154daeSSean Callanan             }
41030fdc8d8SChris Lattner             else
41130fdc8d8SChris Lattner             {
412bccce813SSean Callanan                 if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult)
413bccce813SSean Callanan                 {
414bcf897faSSean Callanan                     if (format != eFormatVoid && m_interpreter.GetDebugger().GetNotifyVoid())
415bf154daeSSean Callanan                     {
416bcf897faSSean Callanan                         error_stream->PutCString("(void)\n");
417bcf897faSSean Callanan                     }
418bccce813SSean Callanan 
419bccce813SSean Callanan                     if (result)
420bccce813SSean Callanan                         result->SetStatus (eReturnStatusSuccessFinishResult);
421bccce813SSean Callanan                 }
422bccce813SSean Callanan                 else
423bccce813SSean Callanan                 {
4245fd05903SGreg Clayton                     const char *error_cstr = result_valobj_sp->GetError().AsCString();
4255fd05903SGreg Clayton                     if (error_cstr && error_cstr[0])
4265fd05903SGreg Clayton                     {
4275fd05903SGreg Clayton                         int error_cstr_len = strlen (error_cstr);
4285fd05903SGreg Clayton                         const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
4295fd05903SGreg Clayton                         if (strstr(error_cstr, "error:") != error_cstr)
4305fd05903SGreg Clayton                             error_stream->PutCString ("error: ");
4315fd05903SGreg Clayton                         error_stream->Write(error_cstr, error_cstr_len);
4325fd05903SGreg Clayton                         if (!ends_with_newline)
4335fd05903SGreg Clayton                             error_stream->EOL();
4345fd05903SGreg Clayton                     }
4355fd05903SGreg Clayton                     else
4365fd05903SGreg Clayton                     {
4375fd05903SGreg Clayton                         error_stream->PutCString ("error: unknown error\n");
4385fd05903SGreg Clayton                     }
4395fd05903SGreg Clayton 
440fcd43b71SJohnny Chen                     if (result)
441b71f3844SGreg Clayton                         result->SetStatus (eReturnStatusFailed);
44230fdc8d8SChris Lattner                 }
4438b2fe6dcSGreg Clayton             }
4448b2fe6dcSGreg Clayton         }
445bccce813SSean Callanan     }
4468b2fe6dcSGreg Clayton     else
4478b2fe6dcSGreg Clayton     {
4486e8dc334SCaroline Tice         error_stream->Printf ("error: invalid execution context for expression\n");
4498b2fe6dcSGreg Clayton         return false;
4508b2fe6dcSGreg Clayton     }
45130fdc8d8SChris Lattner 
45216ad5faeSSean Callanan     return true;
45330fdc8d8SChris Lattner }
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner bool
4565a988416SJim Ingham CommandObjectExpression::DoExecute
45730fdc8d8SChris Lattner (
45830fdc8d8SChris Lattner     const char *command,
45930fdc8d8SChris Lattner     CommandReturnObject &result
46030fdc8d8SChris Lattner )
46130fdc8d8SChris Lattner {
4621deb7962SGreg Clayton     m_option_group.NotifyOptionParsingStarting();
46330fdc8d8SChris Lattner 
46430fdc8d8SChris Lattner     const char * expr = NULL;
46530fdc8d8SChris Lattner 
46630fdc8d8SChris Lattner     if (command[0] == '\0')
46730fdc8d8SChris Lattner     {
46830fdc8d8SChris Lattner         m_expr_lines.clear();
46930fdc8d8SChris Lattner         m_expr_line_count = 0;
47030fdc8d8SChris Lattner 
471a7015092SGreg Clayton         InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
47230fdc8d8SChris Lattner         if (reader_sp)
47330fdc8d8SChris Lattner         {
47430fdc8d8SChris Lattner             Error err (reader_sp->Initialize (CommandObjectExpression::MultiLineExpressionCallback,
47530fdc8d8SChris Lattner                                               this,                         // baton
47630fdc8d8SChris Lattner                                               eInputReaderGranularityLine,  // token size, to pass to callback function
47730fdc8d8SChris Lattner                                               NULL,                         // end token
47830fdc8d8SChris Lattner                                               NULL,                         // prompt
47930fdc8d8SChris Lattner                                               true));                       // echo input
48030fdc8d8SChris Lattner             if (err.Success())
48130fdc8d8SChris Lattner             {
482a7015092SGreg Clayton                 m_interpreter.GetDebugger().PushInputReader (reader_sp);
48330fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusSuccessFinishNoResult);
48430fdc8d8SChris Lattner             }
48530fdc8d8SChris Lattner             else
48630fdc8d8SChris Lattner             {
48730fdc8d8SChris Lattner                 result.AppendError (err.AsCString());
48830fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
48930fdc8d8SChris Lattner             }
49030fdc8d8SChris Lattner         }
49130fdc8d8SChris Lattner         else
49230fdc8d8SChris Lattner         {
49330fdc8d8SChris Lattner             result.AppendError("out of memory");
49430fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
49530fdc8d8SChris Lattner         }
49630fdc8d8SChris Lattner         return result.Succeeded();
49730fdc8d8SChris Lattner     }
49830fdc8d8SChris Lattner 
49930fdc8d8SChris Lattner     if (command[0] == '-')
50030fdc8d8SChris Lattner     {
50130fdc8d8SChris Lattner         // We have some options and these options MUST end with --.
50230fdc8d8SChris Lattner         const char *end_options = NULL;
50330fdc8d8SChris Lattner         const char *s = command;
50430fdc8d8SChris Lattner         while (s && s[0])
50530fdc8d8SChris Lattner         {
50630fdc8d8SChris Lattner             end_options = ::strstr (s, "--");
50730fdc8d8SChris Lattner             if (end_options)
50830fdc8d8SChris Lattner             {
50930fdc8d8SChris Lattner                 end_options += 2; // Get past the "--"
51030fdc8d8SChris Lattner                 if (::isspace (end_options[0]))
51130fdc8d8SChris Lattner                 {
51230fdc8d8SChris Lattner                     expr = end_options;
51330fdc8d8SChris Lattner                     while (::isspace (*expr))
51430fdc8d8SChris Lattner                         ++expr;
51530fdc8d8SChris Lattner                     break;
51630fdc8d8SChris Lattner                 }
51730fdc8d8SChris Lattner             }
51830fdc8d8SChris Lattner             s = end_options;
51930fdc8d8SChris Lattner         }
52030fdc8d8SChris Lattner 
52130fdc8d8SChris Lattner         if (end_options)
52230fdc8d8SChris Lattner         {
52330fdc8d8SChris Lattner             Args args (command, end_options - command);
524a7015092SGreg Clayton             if (!ParseOptions (args, result))
52530fdc8d8SChris Lattner                 return false;
526f6b8b581SGreg Clayton 
5271deb7962SGreg Clayton             Error error (m_option_group.NotifyOptionParsingFinished());
528f6b8b581SGreg Clayton             if (error.Fail())
529f6b8b581SGreg Clayton             {
530f6b8b581SGreg Clayton                 result.AppendError (error.AsCString());
531f6b8b581SGreg Clayton                 result.SetStatus (eReturnStatusFailed);
532f6b8b581SGreg Clayton                 return false;
533f6b8b581SGreg Clayton             }
53430fdc8d8SChris Lattner         }
53530fdc8d8SChris Lattner     }
53630fdc8d8SChris Lattner 
53730fdc8d8SChris Lattner     if (expr == NULL)
53830fdc8d8SChris Lattner         expr = command;
53930fdc8d8SChris Lattner 
5406e8dc334SCaroline Tice     if (EvaluateExpression (expr, &(result.GetOutputStream()), &(result.GetErrorStream()), &result))
541fcd43b71SJohnny Chen         return true;
542fcd43b71SJohnny Chen 
543fcd43b71SJohnny Chen     result.SetStatus (eReturnStatusFailed);
544fcd43b71SJohnny Chen     return false;
54530fdc8d8SChris Lattner }
54630fdc8d8SChris Lattner 
547