blob: 6b963606c85aa6562ea96f4cb400966d4bffe58b [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBFrame.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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBFrame.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include <string>
13#include <algorithm>
14
15#include "lldb/lldb-types.h"
16
17#include "lldb/Core/Address.h"
18#include "lldb/Core/ConstString.h"
Caroline Tice7826c882010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Core/ValueObjectRegister.h"
23#include "lldb/Core/ValueObjectVariable.h"
Greg Claytond1719722010-10-05 03:13:51 +000024#include "lldb/Expression/ClangUserExpression.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Symbol/Block.h"
26#include "lldb/Symbol/SymbolContext.h"
27#include "lldb/Symbol/VariableList.h"
28#include "lldb/Symbol/Variable.h"
29#include "lldb/Target/ExecutionContext.h"
30#include "lldb/Target/Target.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/RegisterContext.h"
33#include "lldb/Target/StackFrame.h"
34#include "lldb/Target/Thread.h"
35
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBDebugger.h"
37#include "lldb/API/SBValue.h"
38#include "lldb/API/SBAddress.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000039#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000040#include "lldb/API/SBSymbolContext.h"
41#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000042
43using namespace lldb;
44using namespace lldb_private;
45
46SBFrame::SBFrame () :
Greg Clayton63094e02010-06-23 01:19:29 +000047 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000048{
Caroline Tice7826c882010-10-26 03:11:13 +000049 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
50
51 if (log)
52 log->Printf ("SBFrame::SBFrame () ==> this = %p", this);
Chris Lattner24943d22010-06-08 16:52:24 +000053}
54
55SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000056 m_opaque_sp (lldb_object_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000057{
Caroline Tice7826c882010-10-26 03:11:13 +000058 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
59
60 if (log)
61 {
62 SBStream sstr;
63 GetDescription (sstr);
64 log->Printf ("SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) lldb_object_sp.get() = %p "
65 " ==> this = %p (%s)", lldb_object_sp.get(), this, sstr.GetData());
66 }
Chris Lattner24943d22010-06-08 16:52:24 +000067}
68
69SBFrame::~SBFrame()
70{
71}
72
73
74void
75SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp)
76{
Greg Clayton63094e02010-06-23 01:19:29 +000077 m_opaque_sp = lldb_object_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000078}
79
80
81bool
82SBFrame::IsValid() const
83{
Greg Clayton63094e02010-06-23 01:19:29 +000084 return (m_opaque_sp.get() != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000085}
86
87SBSymbolContext
88SBFrame::GetSymbolContext (uint32_t resolve_scope) const
89{
Caroline Tice7826c882010-10-26 03:11:13 +000090 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
91
92 if (log)
93 log->Printf ("SBFrame::GetSymbolContext (%d)", resolve_scope);
94
Chris Lattner24943d22010-06-08 16:52:24 +000095 SBSymbolContext sb_sym_ctx;
Greg Clayton63094e02010-06-23 01:19:29 +000096 if (m_opaque_sp)
97 sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope));
Caroline Tice7826c882010-10-26 03:11:13 +000098
99 if (log)
100 log->Printf ("SBFrame::GetSymbolContext ==> SBSymbolContext (this = %p)", &sb_sym_ctx);
101
Chris Lattner24943d22010-06-08 16:52:24 +0000102 return sb_sym_ctx;
103}
104
105SBModule
106SBFrame::GetModule () const
107{
Greg Clayton63094e02010-06-23 01:19:29 +0000108 SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000109 return sb_module;
110}
111
112SBCompileUnit
113SBFrame::GetCompileUnit () const
114{
Caroline Tice7826c882010-10-26 03:11:13 +0000115 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
116
117 if (log)
118 log->Printf ("SBFrame::GetCompileUnit()");
119
Greg Clayton63094e02010-06-23 01:19:29 +0000120 SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
Caroline Tice7826c882010-10-26 03:11:13 +0000121
122 if (log)
123 log->Printf ("SBFrame::GetCompileUnit ==> SBCompileUnit (this = %p", &sb_comp_unit);
124
Chris Lattner24943d22010-06-08 16:52:24 +0000125 return sb_comp_unit;
126}
127
128SBFunction
129SBFrame::GetFunction () const
130{
Greg Clayton63094e02010-06-23 01:19:29 +0000131 SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function);
Chris Lattner24943d22010-06-08 16:52:24 +0000132 return sb_function;
133}
134
Greg Clayton8f1e08b2010-10-04 18:37:52 +0000135SBSymbol
136SBFrame::GetSymbol () const
137{
138 SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
139 return sb_symbol;
140}
141
Chris Lattner24943d22010-06-08 16:52:24 +0000142SBBlock
143SBFrame::GetBlock () const
144{
Greg Clayton63094e02010-06-23 01:19:29 +0000145 SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block);
Chris Lattner24943d22010-06-08 16:52:24 +0000146 return sb_block;
147}
148
Greg Clayton69aa5d92010-09-07 04:20:48 +0000149SBBlock
150SBFrame::GetFrameBlock () const
151{
152 SBBlock sb_block(m_opaque_sp->GetFrameBlock ());
153 return sb_block;
154}
155
Chris Lattner24943d22010-06-08 16:52:24 +0000156SBLineEntry
157SBFrame::GetLineEntry () const
158{
Greg Clayton63094e02010-06-23 01:19:29 +0000159 SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +0000160 return sb_line_entry;
161}
162
163uint32_t
164SBFrame::GetFrameID () const
165{
Greg Clayton63094e02010-06-23 01:19:29 +0000166 if (m_opaque_sp)
Greg Clayton33ed1702010-08-24 00:45:41 +0000167 return m_opaque_sp->GetFrameIndex ();
Chris Lattner24943d22010-06-08 16:52:24 +0000168 else
169 return UINT32_MAX;
170}
171
Chris Lattner24943d22010-06-08 16:52:24 +0000172lldb::addr_t
173SBFrame::GetPC () const
174{
Caroline Tice7826c882010-10-26 03:11:13 +0000175 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
176
177 if (log)
178 log->Printf ("SBFrame::GetPC ()");
179
180 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +0000181 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000182 addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget());
183
184 if (log)
185 log->Printf ("SBFrame::GetPC ==> %p", addr);
186
187 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000188}
189
190bool
191SBFrame::SetPC (lldb::addr_t new_pc)
192{
Caroline Tice7826c882010-10-26 03:11:13 +0000193 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
194
195 if (log)
196 log->Printf ("SBFrame::SetPC (%p)", new_pc);
197
198 bool ret_val = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000199 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000200 ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc);
201
202 if (log)
203 log->Printf ("SBFrame::SetPC ==> %s", (ret_val ? "true" : "false"));
204
205 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000206}
207
208lldb::addr_t
209SBFrame::GetSP () const
210{
Greg Clayton63094e02010-06-23 01:19:29 +0000211 if (m_opaque_sp)
212 return m_opaque_sp->GetRegisterContext()->GetSP();
Chris Lattner24943d22010-06-08 16:52:24 +0000213 return LLDB_INVALID_ADDRESS;
214}
215
216
217lldb::addr_t
218SBFrame::GetFP () const
219{
Caroline Tice7826c882010-10-26 03:11:13 +0000220 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
221
222 if (log)
223 log->Printf ("SBFrame::GetFP ()");
224
225 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +0000226 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000227 addr = m_opaque_sp->GetRegisterContext()->GetFP();
228
229 if (log)
230 log->Printf ("SBFrame::GetFP ==> %p", addr);
231
232 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000233}
234
235
236SBAddress
237SBFrame::GetPCAddress () const
238{
239 SBAddress sb_addr;
Greg Clayton63094e02010-06-23 01:19:29 +0000240 if (m_opaque_sp)
Greg Claytonb04e7a82010-08-24 21:05:24 +0000241 sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
Chris Lattner24943d22010-06-08 16:52:24 +0000242 return sb_addr;
243}
244
245void
246SBFrame::Clear()
247{
Greg Clayton63094e02010-06-23 01:19:29 +0000248 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000249}
250
251SBValue
252SBFrame::LookupVar (const char *var_name)
253{
254 lldb::VariableSP var_sp;
255 if (IsValid ())
256 {
257 lldb_private::VariableList variable_list;
258 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
259
260 SBBlock block = sc.GetBlock();
261 if (block.IsValid())
262 block.AppendVariables (true, true, &variable_list);
263
264 const uint32_t num_variables = variable_list.GetSize();
265
266 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000267 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000268 {
269 var_sp = variable_list.GetVariableAtIndex(i);
270 if (var_sp
271 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
272 found = true;
273 }
274 if (!found)
275 var_sp.reset();
276 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000277 if (var_sp)
278 {
279 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
280 return sb_value;
281 }
282
283 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000284 return sb_value;
285}
286
287SBValue
288SBFrame::LookupVarInScope (const char *var_name, const char *scope)
289{
290 lldb::VariableSP var_sp;
291 if (IsValid())
292 {
293 std::string scope_str = scope;
294 lldb::ValueType var_scope = eValueTypeInvalid;
295 // Convert scope_str to be all lowercase;
296 std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
297
298 if (scope_str.compare ("global") == 0)
299 var_scope = eValueTypeVariableGlobal;
300 else if (scope_str.compare ("local") == 0)
301 var_scope = eValueTypeVariableLocal;
302 else if (scope_str.compare ("parameter") == 0)
303 var_scope = eValueTypeVariableArgument;
304
305 if (var_scope != eValueTypeInvalid)
306 {
307 lldb_private::VariableList variable_list;
308 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
309
310 SBBlock block = sc.GetBlock();
311 if (block.IsValid())
312 block.AppendVariables (true, true, &variable_list);
313
314 const uint32_t num_variables = variable_list.GetSize();
315
316 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000317 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000318 {
319 var_sp = variable_list.GetVariableAtIndex(i);
320 if (var_sp
321 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
322 && var_sp.get()->GetScope() == var_scope)
323 found = true;
324 }
325 if (!found)
326 var_sp.reset();
327 }
328 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000329
330 if (var_sp)
331 {
332 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
333 return sb_value;
334 }
335
336 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000337 return sb_value;
338}
339
340bool
341SBFrame::operator == (const SBFrame &rhs) const
342{
Greg Clayton63094e02010-06-23 01:19:29 +0000343 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000344}
345
346bool
347SBFrame::operator != (const SBFrame &rhs) const
348{
Greg Clayton63094e02010-06-23 01:19:29 +0000349 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000350}
351
352lldb_private::StackFrame *
353SBFrame::operator->() const
354{
Greg Clayton63094e02010-06-23 01:19:29 +0000355 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000356}
357
358lldb_private::StackFrame *
359SBFrame::get() const
360{
Greg Clayton63094e02010-06-23 01:19:29 +0000361 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000362}
363
364
365SBThread
366SBFrame::GetThread () const
367{
Caroline Tice7826c882010-10-26 03:11:13 +0000368 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
369
370 if (log)
371 log->Printf ("SBFrame::GetThread ()");
372
Greg Clayton63094e02010-06-23 01:19:29 +0000373 SBThread sb_thread (m_opaque_sp->GetThread().GetSP());
Caroline Tice7826c882010-10-26 03:11:13 +0000374
375 if (log)
376 log->Printf ("SBFrame::GetThread ==> SBThread (this = %p)", &sb_thread);
377
Chris Lattner24943d22010-06-08 16:52:24 +0000378 return sb_thread;
379}
380
381const char *
382SBFrame::Disassemble () const
383{
Caroline Tice7826c882010-10-26 03:11:13 +0000384 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
385 Log *verbose_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
386
387 if (verbose_log)
388 verbose_log->Printf ("SBFrame::Disassemble () ==> %s", m_opaque_sp->Disassemble());
389 else if (log)
390 log->Printf ("SBFrame::Disassemble ()");
391
Greg Clayton63094e02010-06-23 01:19:29 +0000392 if (m_opaque_sp)
393 return m_opaque_sp->Disassemble();
Chris Lattner24943d22010-06-08 16:52:24 +0000394 return NULL;
395}
396
397
398
399lldb_private::StackFrame *
400SBFrame::GetLLDBObjectPtr ()
401{
Greg Clayton63094e02010-06-23 01:19:29 +0000402 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000403}
404
405SBValueList
406SBFrame::GetVariables (bool arguments,
407 bool locals,
408 bool statics,
409 bool in_scope_only)
410{
Caroline Tice7826c882010-10-26 03:11:13 +0000411 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
412
413 if (log)
414 {
415 log->Printf ("SBFrame::GetVariables (bool arguments, bool locals, bool statics, bool in_scope_only)");
416 log->Printf (" arguments = %s, locals = %s, statics = %s, in_scope_only = %s",
417 (arguments ? "true" : "false"),
418 (locals ? "true" : "false"),
419 (statics ? "true" : "false"),
420 (in_scope_only ? "true" : "false"));
421 }
422
Chris Lattner24943d22010-06-08 16:52:24 +0000423 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000424 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000425 {
426 size_t i;
Greg Clayton17dae082010-09-02 02:59:18 +0000427 VariableList *variable_list = m_opaque_sp->GetVariableList(true);
Chris Lattner24943d22010-06-08 16:52:24 +0000428 if (variable_list)
429 {
430 const size_t num_variables = variable_list->GetSize();
431 if (num_variables)
432 {
433 for (i = 0; i < num_variables; ++i)
434 {
435 VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
436 if (variable_sp)
437 {
438 bool add_variable = false;
439 switch (variable_sp->GetScope())
440 {
441 case eValueTypeVariableGlobal:
442 case eValueTypeVariableStatic:
443 add_variable = statics;
444 break;
445
446 case eValueTypeVariableArgument:
447 add_variable = arguments;
448 break;
449
450 case eValueTypeVariableLocal:
451 add_variable = locals;
452 break;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000453
454 default:
455 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000456 }
457 if (add_variable)
458 {
Greg Clayton63094e02010-06-23 01:19:29 +0000459 if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get()))
Chris Lattner24943d22010-06-08 16:52:24 +0000460 continue;
461
Greg Clayton17dae082010-09-02 02:59:18 +0000462 value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp));
Chris Lattner24943d22010-06-08 16:52:24 +0000463 }
464 }
465 }
466 }
Greg Clayton17dae082010-09-02 02:59:18 +0000467 }
Chris Lattner24943d22010-06-08 16:52:24 +0000468 }
Caroline Tice7826c882010-10-26 03:11:13 +0000469
470 if (log)
471 {
472 log->Printf ("SBFrame::GetVariables ==> SBValueList (this = %p)", &value_list);
473 //uint32_t num_vars = value_list.GetSize();
474 //for (uint32_t i = 0; i < num_vars; ++i)
475 //{
476 // SBValue value = value_list.GetValueAtIndex (i);
477 // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this));
478 //}
479 }
480
Chris Lattner24943d22010-06-08 16:52:24 +0000481 return value_list;
482}
483
484lldb::SBValueList
485SBFrame::GetRegisters ()
486{
Caroline Tice7826c882010-10-26 03:11:13 +0000487 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
488
489 if (log)
490 log->Printf ("SBFrame::GetRegisters ()");
491
Chris Lattner24943d22010-06-08 16:52:24 +0000492 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000493 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000494 {
Greg Clayton63094e02010-06-23 01:19:29 +0000495 RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000496 if (reg_ctx)
497 {
498 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
499 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
500 {
Greg Claytonbf8e42b2010-10-14 22:52:14 +0000501 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx)));
Chris Lattner24943d22010-06-08 16:52:24 +0000502 }
503 }
504 }
Caroline Tice7826c882010-10-26 03:11:13 +0000505
506 if (log)
507 {
508 log->Printf ("SBFrame::Registers ==> SBValueList (this = %p)", &value_list );
509 //uint32_t num_vars = value_list.GetSize();
510 //for (uint32_t i = 0; i < num_vars; ++i)
511 //{
512 // SBValue value = value_list.GetValueAtIndex (i);
513 // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this));
514 //}
515 }
516
Chris Lattner24943d22010-06-08 16:52:24 +0000517 return value_list;
518}
519
Caroline Tice98f930f2010-09-20 05:20:02 +0000520bool
521SBFrame::GetDescription (SBStream &description)
522{
523 if (m_opaque_sp)
524 {
Greg Claytond8c62532010-10-07 04:19:01 +0000525 description.Printf("SBFrame: idx = %u", m_opaque_sp->GetFrameIndex());
Caroline Tice98f930f2010-09-20 05:20:02 +0000526 }
527 else
528 description.Printf ("No value");
529
530 return true;
531}
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000532
533lldb::SBValue
534SBFrame::EvaluateExpression (const char *expr)
535{
536 lldb::SBValue expr_result_value;
537 if (m_opaque_sp)
538 {
Greg Claytond1719722010-10-05 03:13:51 +0000539 ExecutionContext exe_ctx;
540 m_opaque_sp->CalculateExecutionContext (exe_ctx);
541 *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr);
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000542 }
543 return expr_result_value;
544}