130fdc8d8SChris Lattner //===-- SBFrame.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 
104c5de699SEli Friedman #include "lldb/API/SBFrame.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
1330fdc8d8SChris Lattner #include <algorithm>
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
23b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h"
2430fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
2530fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
2730fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
2830fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
2930fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3030fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3130fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
3230fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3430fdc8d8SChris Lattner 
354c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
364c5de699SEli Friedman #include "lldb/API/SBValue.h"
374c5de699SEli Friedman #include "lldb/API/SBAddress.h"
38dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
394c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
404c5de699SEli Friedman #include "lldb/API/SBThread.h"
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner using namespace lldb;
4330fdc8d8SChris Lattner using namespace lldb_private;
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner SBFrame::SBFrame () :
466611103cSGreg Clayton     m_opaque_sp ()
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) :
516611103cSGreg Clayton     m_opaque_sp (lldb_object_sp)
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner SBFrame::~SBFrame()
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner }
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner void
6130fdc8d8SChris Lattner SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp)
6230fdc8d8SChris Lattner {
636611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner bool
6830fdc8d8SChris Lattner SBFrame::IsValid() const
6930fdc8d8SChris Lattner {
706611103cSGreg Clayton     return (m_opaque_sp.get() != NULL);
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner SBSymbolContext
7430fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
7530fdc8d8SChris Lattner {
7630fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
776611103cSGreg Clayton     if (m_opaque_sp)
786611103cSGreg Clayton         sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope));
7930fdc8d8SChris Lattner     return sb_sym_ctx;
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
8230fdc8d8SChris Lattner SBModule
8330fdc8d8SChris Lattner SBFrame::GetModule () const
8430fdc8d8SChris Lattner {
856611103cSGreg Clayton     SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp);
8630fdc8d8SChris Lattner     return sb_module;
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner SBCompileUnit
9030fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
9130fdc8d8SChris Lattner {
926611103cSGreg Clayton     SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
9330fdc8d8SChris Lattner     return sb_comp_unit;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner SBFunction
9730fdc8d8SChris Lattner SBFrame::GetFunction () const
9830fdc8d8SChris Lattner {
996611103cSGreg Clayton     SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function);
10030fdc8d8SChris Lattner     return sb_function;
10130fdc8d8SChris Lattner }
10230fdc8d8SChris Lattner 
1033b06557eSGreg Clayton SBSymbol
1043b06557eSGreg Clayton SBFrame::GetSymbol () const
1053b06557eSGreg Clayton {
1063b06557eSGreg Clayton     SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
1073b06557eSGreg Clayton     return sb_symbol;
1083b06557eSGreg Clayton }
1093b06557eSGreg Clayton 
11030fdc8d8SChris Lattner SBBlock
11130fdc8d8SChris Lattner SBFrame::GetBlock () const
11230fdc8d8SChris Lattner {
1136611103cSGreg Clayton     SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block);
11430fdc8d8SChris Lattner     return sb_block;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11795897c6aSGreg Clayton SBBlock
11895897c6aSGreg Clayton SBFrame::GetFrameBlock () const
11995897c6aSGreg Clayton {
12095897c6aSGreg Clayton     SBBlock sb_block(m_opaque_sp->GetFrameBlock ());
12195897c6aSGreg Clayton     return sb_block;
12295897c6aSGreg Clayton }
12395897c6aSGreg Clayton 
12430fdc8d8SChris Lattner SBLineEntry
12530fdc8d8SChris Lattner SBFrame::GetLineEntry () const
12630fdc8d8SChris Lattner {
1276611103cSGreg Clayton     SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
12830fdc8d8SChris Lattner     return sb_line_entry;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner uint32_t
13230fdc8d8SChris Lattner SBFrame::GetFrameID () const
13330fdc8d8SChris Lattner {
1346611103cSGreg Clayton     if (m_opaque_sp)
1351b72fcb7SGreg Clayton         return m_opaque_sp->GetFrameIndex ();
13630fdc8d8SChris Lattner     else
13730fdc8d8SChris Lattner         return UINT32_MAX;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner lldb::addr_t
14130fdc8d8SChris Lattner SBFrame::GetPC () const
14230fdc8d8SChris Lattner {
1436611103cSGreg Clayton     if (m_opaque_sp)
144f5e56de0SGreg Clayton         return m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget());
14530fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner bool
14930fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc)
15030fdc8d8SChris Lattner {
1516611103cSGreg Clayton     if (m_opaque_sp)
1526611103cSGreg Clayton         return m_opaque_sp->GetRegisterContext()->SetPC (new_pc);
15330fdc8d8SChris Lattner     return false;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner lldb::addr_t
15730fdc8d8SChris Lattner SBFrame::GetSP () const
15830fdc8d8SChris Lattner {
1596611103cSGreg Clayton     if (m_opaque_sp)
1606611103cSGreg Clayton         return m_opaque_sp->GetRegisterContext()->GetSP();
16130fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner lldb::addr_t
16630fdc8d8SChris Lattner SBFrame::GetFP () const
16730fdc8d8SChris Lattner {
1686611103cSGreg Clayton     if (m_opaque_sp)
1696611103cSGreg Clayton         return m_opaque_sp->GetRegisterContext()->GetFP();
17030fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner SBAddress
17530fdc8d8SChris Lattner SBFrame::GetPCAddress () const
17630fdc8d8SChris Lattner {
17730fdc8d8SChris Lattner     SBAddress sb_addr;
1786611103cSGreg Clayton     if (m_opaque_sp)
1799da7bd07SGreg Clayton         sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
18030fdc8d8SChris Lattner     return sb_addr;
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
18330fdc8d8SChris Lattner void
18430fdc8d8SChris Lattner SBFrame::Clear()
18530fdc8d8SChris Lattner {
1866611103cSGreg Clayton     m_opaque_sp.reset();
18730fdc8d8SChris Lattner }
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner SBValue
19030fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name)
19130fdc8d8SChris Lattner {
19230fdc8d8SChris Lattner     lldb::VariableSP var_sp;
19330fdc8d8SChris Lattner     if (IsValid ())
19430fdc8d8SChris Lattner     {
19530fdc8d8SChris Lattner         lldb_private::VariableList variable_list;
19630fdc8d8SChris Lattner         SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner         SBBlock block = sc.GetBlock();
19930fdc8d8SChris Lattner         if (block.IsValid())
20030fdc8d8SChris Lattner             block.AppendVariables (true, true, &variable_list);
20130fdc8d8SChris Lattner 
20230fdc8d8SChris Lattner         const uint32_t num_variables = variable_list.GetSize();
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner         bool found = false;
205c982c768SGreg Clayton         for (uint32_t i = 0; i < num_variables && !found; ++i)
20630fdc8d8SChris Lattner         {
20730fdc8d8SChris Lattner             var_sp = variable_list.GetVariableAtIndex(i);
20830fdc8d8SChris Lattner             if (var_sp
20930fdc8d8SChris Lattner                 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
21030fdc8d8SChris Lattner                 found = true;
21130fdc8d8SChris Lattner         }
21230fdc8d8SChris Lattner         if (!found)
21330fdc8d8SChris Lattner             var_sp.reset();
21430fdc8d8SChris Lattner     }
215dde9cff3SCaroline Tice     if (var_sp)
216dde9cff3SCaroline Tice     {
21730fdc8d8SChris Lattner         SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
21830fdc8d8SChris Lattner         return sb_value;
21930fdc8d8SChris Lattner     }
22030fdc8d8SChris Lattner 
221dde9cff3SCaroline Tice     SBValue sb_value;
222dde9cff3SCaroline Tice     return sb_value;
223dde9cff3SCaroline Tice }
224dde9cff3SCaroline Tice 
22530fdc8d8SChris Lattner SBValue
22630fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope)
22730fdc8d8SChris Lattner {
22830fdc8d8SChris Lattner     lldb::VariableSP var_sp;
22930fdc8d8SChris Lattner     if (IsValid())
23030fdc8d8SChris Lattner     {
23130fdc8d8SChris Lattner         std::string scope_str = scope;
23230fdc8d8SChris Lattner         lldb::ValueType var_scope = eValueTypeInvalid;
23330fdc8d8SChris Lattner         // Convert scope_str to be all lowercase;
23430fdc8d8SChris Lattner         std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
23530fdc8d8SChris Lattner 
23630fdc8d8SChris Lattner         if (scope_str.compare ("global") == 0)
23730fdc8d8SChris Lattner             var_scope = eValueTypeVariableGlobal;
23830fdc8d8SChris Lattner         else if (scope_str.compare ("local") == 0)
23930fdc8d8SChris Lattner             var_scope = eValueTypeVariableLocal;
24030fdc8d8SChris Lattner         else if (scope_str.compare ("parameter") == 0)
24130fdc8d8SChris Lattner            var_scope = eValueTypeVariableArgument;
24230fdc8d8SChris Lattner 
24330fdc8d8SChris Lattner         if (var_scope != eValueTypeInvalid)
24430fdc8d8SChris Lattner         {
24530fdc8d8SChris Lattner             lldb_private::VariableList variable_list;
24630fdc8d8SChris Lattner             SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
24730fdc8d8SChris Lattner 
24830fdc8d8SChris Lattner             SBBlock block = sc.GetBlock();
24930fdc8d8SChris Lattner             if (block.IsValid())
25030fdc8d8SChris Lattner                 block.AppendVariables (true, true, &variable_list);
25130fdc8d8SChris Lattner 
25230fdc8d8SChris Lattner             const uint32_t num_variables = variable_list.GetSize();
25330fdc8d8SChris Lattner 
25430fdc8d8SChris Lattner             bool found = false;
255c982c768SGreg Clayton             for (uint32_t i = 0; i < num_variables && !found; ++i)
25630fdc8d8SChris Lattner             {
25730fdc8d8SChris Lattner                 var_sp = variable_list.GetVariableAtIndex(i);
25830fdc8d8SChris Lattner                 if (var_sp
25930fdc8d8SChris Lattner                     && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
26030fdc8d8SChris Lattner                     && var_sp.get()->GetScope() == var_scope)
26130fdc8d8SChris Lattner                     found = true;
26230fdc8d8SChris Lattner             }
26330fdc8d8SChris Lattner             if (!found)
26430fdc8d8SChris Lattner                 var_sp.reset();
26530fdc8d8SChris Lattner         }
26630fdc8d8SChris Lattner     }
267dde9cff3SCaroline Tice 
268dde9cff3SCaroline Tice     if (var_sp)
269dde9cff3SCaroline Tice     {
27030fdc8d8SChris Lattner         SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
27130fdc8d8SChris Lattner         return sb_value;
27230fdc8d8SChris Lattner     }
27330fdc8d8SChris Lattner 
274dde9cff3SCaroline Tice     SBValue sb_value;
275dde9cff3SCaroline Tice     return sb_value;
276dde9cff3SCaroline Tice }
277dde9cff3SCaroline Tice 
27830fdc8d8SChris Lattner bool
27930fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
28030fdc8d8SChris Lattner {
2816611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
28230fdc8d8SChris Lattner }
28330fdc8d8SChris Lattner 
28430fdc8d8SChris Lattner bool
28530fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
28630fdc8d8SChris Lattner {
2876611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
29030fdc8d8SChris Lattner lldb_private::StackFrame *
29130fdc8d8SChris Lattner SBFrame::operator->() const
29230fdc8d8SChris Lattner {
2936611103cSGreg Clayton     return m_opaque_sp.get();
29430fdc8d8SChris Lattner }
29530fdc8d8SChris Lattner 
29630fdc8d8SChris Lattner lldb_private::StackFrame *
29730fdc8d8SChris Lattner SBFrame::get() const
29830fdc8d8SChris Lattner {
2996611103cSGreg Clayton     return m_opaque_sp.get();
30030fdc8d8SChris Lattner }
30130fdc8d8SChris Lattner 
30230fdc8d8SChris Lattner 
30330fdc8d8SChris Lattner SBThread
30430fdc8d8SChris Lattner SBFrame::GetThread () const
30530fdc8d8SChris Lattner {
3066611103cSGreg Clayton     SBThread sb_thread (m_opaque_sp->GetThread().GetSP());
30730fdc8d8SChris Lattner     return sb_thread;
30830fdc8d8SChris Lattner }
30930fdc8d8SChris Lattner 
31030fdc8d8SChris Lattner const char *
31130fdc8d8SChris Lattner SBFrame::Disassemble () const
31230fdc8d8SChris Lattner {
3136611103cSGreg Clayton     if (m_opaque_sp)
3146611103cSGreg Clayton         return m_opaque_sp->Disassemble();
31530fdc8d8SChris Lattner     return NULL;
31630fdc8d8SChris Lattner }
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner 
31930fdc8d8SChris Lattner 
32030fdc8d8SChris Lattner lldb_private::StackFrame *
32130fdc8d8SChris Lattner SBFrame::GetLLDBObjectPtr ()
32230fdc8d8SChris Lattner {
3236611103cSGreg Clayton     return m_opaque_sp.get();
32430fdc8d8SChris Lattner }
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner SBValueList
32730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
32830fdc8d8SChris Lattner                        bool locals,
32930fdc8d8SChris Lattner                        bool statics,
33030fdc8d8SChris Lattner                        bool in_scope_only)
33130fdc8d8SChris Lattner {
33230fdc8d8SChris Lattner     SBValueList value_list;
3336611103cSGreg Clayton     if (m_opaque_sp)
33430fdc8d8SChris Lattner     {
33530fdc8d8SChris Lattner         size_t i;
336288bdf9cSGreg Clayton         VariableList *variable_list = m_opaque_sp->GetVariableList(true);
33730fdc8d8SChris Lattner         if (variable_list)
33830fdc8d8SChris Lattner         {
33930fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
34030fdc8d8SChris Lattner             if (num_variables)
34130fdc8d8SChris Lattner             {
34230fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
34330fdc8d8SChris Lattner                 {
34430fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
34530fdc8d8SChris Lattner                     if (variable_sp)
34630fdc8d8SChris Lattner                     {
34730fdc8d8SChris Lattner                         bool add_variable = false;
34830fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
34930fdc8d8SChris Lattner                         {
35030fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
35130fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
35230fdc8d8SChris Lattner                             add_variable = statics;
35330fdc8d8SChris Lattner                             break;
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
35630fdc8d8SChris Lattner                             add_variable = arguments;
35730fdc8d8SChris Lattner                             break;
35830fdc8d8SChris Lattner 
35930fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
36030fdc8d8SChris Lattner                             add_variable = locals;
36130fdc8d8SChris Lattner                             break;
362c982c768SGreg Clayton 
363c982c768SGreg Clayton                         default:
364c982c768SGreg Clayton                             break;
36530fdc8d8SChris Lattner                         }
36630fdc8d8SChris Lattner                         if (add_variable)
36730fdc8d8SChris Lattner                         {
3686611103cSGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get()))
36930fdc8d8SChris Lattner                                 continue;
37030fdc8d8SChris Lattner 
371288bdf9cSGreg Clayton                             value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp));
37230fdc8d8SChris Lattner                         }
37330fdc8d8SChris Lattner                     }
37430fdc8d8SChris Lattner                 }
37530fdc8d8SChris Lattner             }
37630fdc8d8SChris Lattner         }
37730fdc8d8SChris Lattner     }
37830fdc8d8SChris Lattner     return value_list;
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner lldb::SBValueList
38230fdc8d8SChris Lattner SBFrame::GetRegisters ()
38330fdc8d8SChris Lattner {
38430fdc8d8SChris Lattner     SBValueList value_list;
3856611103cSGreg Clayton     if (m_opaque_sp)
38630fdc8d8SChris Lattner     {
3876611103cSGreg Clayton         RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext();
38830fdc8d8SChris Lattner         if (reg_ctx)
38930fdc8d8SChris Lattner         {
39030fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
39130fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
39230fdc8d8SChris Lattner             {
39330fdc8d8SChris Lattner                 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (reg_ctx, set_idx)));
39430fdc8d8SChris Lattner             }
39530fdc8d8SChris Lattner         }
39630fdc8d8SChris Lattner     }
39730fdc8d8SChris Lattner     return value_list;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
400dde9cff3SCaroline Tice bool
401dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
402dde9cff3SCaroline Tice {
403dde9cff3SCaroline Tice     if (m_opaque_sp)
404dde9cff3SCaroline Tice     {
405*05faeb71SGreg Clayton         description.Printf("SBFrame: idx = %u", m_opaque_sp->GetFrameIndex());
406dde9cff3SCaroline Tice     }
407dde9cff3SCaroline Tice     else
408dde9cff3SCaroline Tice         description.Printf ("No value");
409dde9cff3SCaroline Tice 
410dde9cff3SCaroline Tice     return true;
411dde9cff3SCaroline Tice }
4121d3afba3SGreg Clayton 
4131d3afba3SGreg Clayton lldb::SBValue
4141d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
4151d3afba3SGreg Clayton {
4161d3afba3SGreg Clayton     lldb::SBValue expr_result_value;
4171d3afba3SGreg Clayton     if (m_opaque_sp)
4181d3afba3SGreg Clayton     {
419b71f3844SGreg Clayton         ExecutionContext exe_ctx;
420b71f3844SGreg Clayton         m_opaque_sp->CalculateExecutionContext (exe_ctx);
421b71f3844SGreg Clayton         *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr);
4221d3afba3SGreg Clayton     }
4231d3afba3SGreg Clayton     return expr_result_value;
4241d3afba3SGreg Clayton }
425