summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/ValueObject.h12
-rw-r--r--lldb/include/lldb/Core/ValueObjectConstResult.h3
-rw-r--r--lldb/include/lldb/Expression/ClangUserExpression.h6
-rw-r--r--lldb/include/lldb/lldb-forward.h1
-rw-r--r--lldb/source/API/SBFrame.cpp4
-rw-r--r--lldb/source/Commands/CommandObjectExpression.cpp13
-rw-r--r--lldb/source/Core/ValueObject.cpp5
-rw-r--r--lldb/source/Core/ValueObjectConstResult.cpp10
-rw-r--r--lldb/source/Expression/ClangUserExpression.cpp13
9 files changed, 50 insertions, 17 deletions
diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h
index 592d6ab21a8..2d1b43a0a6f 100644
--- a/lldb/include/lldb/Core/ValueObject.h
+++ b/lldb/include/lldb/Core/ValueObject.h
@@ -201,6 +201,18 @@ public:
bool use_objc,
bool scope_already_checked);
+ bool
+ GetIsConstant () const
+ {
+ return m_update_id == LLDB_INVALID_UID;
+ }
+
+ void
+ SetIsConstant ()
+ {
+ m_update_id = LLDB_INVALID_UID;
+ }
+
protected:
//------------------------------------------------------------------
// Classes that inherit from ValueObject can see and modify these
diff --git a/lldb/include/lldb/Core/ValueObjectConstResult.h b/lldb/include/lldb/Core/ValueObjectConstResult.h
index c1e82920f72..f1e1c3ebcde 100644
--- a/lldb/include/lldb/Core/ValueObjectConstResult.h
+++ b/lldb/include/lldb/Core/ValueObjectConstResult.h
@@ -32,6 +32,9 @@ public:
uint8_t addr_size);
+ // When an expression fails to evaluate, we return an error
+ ValueObjectConstResult (const Error& error);
+
virtual ~ValueObjectConstResult();
virtual size_t
diff --git a/lldb/include/lldb/Expression/ClangUserExpression.h b/lldb/include/lldb/Expression/ClangUserExpression.h
index ab97f107264..f193446b8a8 100644
--- a/lldb/include/lldb/Expression/ClangUserExpression.h
+++ b/lldb/include/lldb/Expression/ClangUserExpression.h
@@ -172,10 +172,8 @@ public:
}
- static Error
- Evaluate (ExecutionContext &exe_ctx,
- const char *expr_cstr,
- lldb::ValueObjectSP &result_valobj_sp);
+ static lldb::ValueObjectSP
+ Evaluate (ExecutionContext &exe_ctx, const char *expr_cstr);
private:
//------------------------------------------------------------------
diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h
index 82b45215caa..61137098ab8 100644
--- a/lldb/include/lldb/lldb-forward.h
+++ b/lldb/include/lldb/lldb-forward.h
@@ -43,6 +43,7 @@ class CPPLanguageRuntime;
class ClangASTContext;
class ClangExpression;
class ClangExpressionDeclMap;
+class ClangExpressionVariable;
class ClangExpressionVariableList;
class ClangExpressionVariableStore;
class CommandInterpreter;
diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp
index 0b2db3328dd..9ca92fc9b6b 100644
--- a/lldb/source/API/SBFrame.cpp
+++ b/lldb/source/API/SBFrame.cpp
@@ -20,6 +20,7 @@
#include "lldb/Core/StreamFile.h"
#include "lldb/Core/ValueObjectRegister.h"
#include "lldb/Core/ValueObjectVariable.h"
+#include "lldb/Expression/ClangUserExpression.h"
#include "lldb/Symbol/Block.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/VariableList.h"
@@ -416,6 +417,9 @@ SBFrame::EvaluateExpression (const char *expr)
lldb::SBValue expr_result_value;
if (m_opaque_sp)
{
+ ExecutionContext exe_ctx;
+ m_opaque_sp->CalculateExecutionContext (exe_ctx);
+ *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr);
}
return expr_result_value;
}
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index a02451ceb46..1f6c3de1903 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -233,13 +233,10 @@ CommandObjectExpression::EvaluateExpression
m_exe_ctx.process->SetDynamicCheckers(dynamic_checkers);
}
- lldb::ValueObjectSP result_valobj_sp;
-
- Error expr_error (ClangUserExpression::Evaluate (m_exe_ctx, expr, result_valobj_sp));
-
- if (expr_error.Success())
+ lldb::ValueObjectSP result_valobj_sp (ClangUserExpression::Evaluate (m_exe_ctx, expr));
+ assert (result_valobj_sp.get());
+ if (result_valobj_sp->GetError().Success())
{
- assert (result_valobj_sp.get() != NULL);
ValueObject::DumpValueObject (output_stream,
m_exe_ctx.GetBestExecutionContextScope(),
result_valobj_sp.get(), // Variable object to dump
@@ -257,9 +254,9 @@ CommandObjectExpression::EvaluateExpression
}
else
{
- error_stream.PutCString(expr_error.AsCString());
+ error_stream.PutCString(result_valobj_sp->GetError().AsCString());
if (result)
- result->SetStatus (eReturnStatusSuccessFinishNoResult);
+ result->SetStatus (eReturnStatusFailed);
}
return true;
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 4b7f0d70807..cc7f40887b8 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -79,6 +79,11 @@ ValueObject::GetUpdateID() const
bool
ValueObject::UpdateValueIfNeeded (ExecutionContextScope *exe_scope)
{
+ // If this is a constant value, then our success is predicated on whether
+ // we have an error or not
+ if (GetIsConstant())
+ return m_error.Success();
+
if (exe_scope)
{
Process *process = exe_scope->CalculateProcess();
diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp
index d2317dfde41..103edadddbe 100644
--- a/lldb/source/Core/ValueObjectConstResult.cpp
+++ b/lldb/source/Core/ValueObjectConstResult.cpp
@@ -46,6 +46,16 @@ ValueObjectConstResult::ValueObjectConstResult
m_value.SetValueType(Value::eValueTypeHostAddress);
m_value.SetContext(Value::eContextTypeOpaqueClangQualType, clang_type);
m_name = name;
+ SetIsConstant ();
+}
+
+ValueObjectConstResult::ValueObjectConstResult (const Error& error) :
+ ValueObject (),
+ m_clang_ast (NULL),
+ m_type_name ()
+{
+ m_error = error;
+ SetIsConstant ();
}
ValueObjectConstResult::~ValueObjectConstResult()
diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp
index ed50ea0d0a1..888a2666679 100644
--- a/lldb/source/Expression/ClangUserExpression.cpp
+++ b/lldb/source/Expression/ClangUserExpression.cpp
@@ -21,6 +21,7 @@
#include "lldb/Core/ConstString.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/StreamString.h"
+#include "lldb/Core/ValueObjectConstResult.h"
#include "lldb/Expression/ClangExpressionDeclMap.h"
#include "lldb/Expression/ClangExpressionParser.h"
#include "lldb/Expression/ClangFunction.h"
@@ -338,12 +339,11 @@ ClangUserExpression::DwarfOpcodeStream ()
}
-Error
-ClangUserExpression::Evaluate (ExecutionContext &exe_ctx, const char *expr_cstr, lldb::ValueObjectSP &result_valobj_sp)
+lldb::ValueObjectSP
+ClangUserExpression::Evaluate (ExecutionContext &exe_ctx, const char *expr_cstr)
{
Error error;
- result_valobj_sp.reset();
-
+ lldb::ValueObjectSP result_valobj_sp;
ClangUserExpression user_expression (expr_cstr);
StreamString error_stream;
@@ -385,6 +385,9 @@ ClangUserExpression::Evaluate (ExecutionContext &exe_ctx, const char *expr_cstr,
}
}
}
- return error;
+ if (result_valobj_sp.get() == NULL)
+ result_valobj_sp.reset (new ValueObjectConstResult (error));
+
+ return result_valobj_sp;
} \ No newline at end of file
OpenPOWER on IntegriCloud