summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Expression/UserExpression.h4
-rw-r--r--lldb/include/lldb/lldb-enumerations.h3
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/no-result/Makefile6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py45
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/no-result/main.c9
-rw-r--r--lldb/source/Commands/CommandObjectExpression.cpp2
-rw-r--r--lldb/source/Expression/ExpressionSourceCode.cpp2
-rw-r--r--lldb/source/Expression/REPL.cpp2
-rw-r--r--lldb/source/Expression/UserExpression.cpp9
-rw-r--r--lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp2
10 files changed, 73 insertions, 11 deletions
diff --git a/lldb/include/lldb/Expression/UserExpression.h b/lldb/include/lldb/Expression/UserExpression.h
index f734940d61f..3876a12848f 100644
--- a/lldb/include/lldb/Expression/UserExpression.h
+++ b/lldb/include/lldb/Expression/UserExpression.h
@@ -288,10 +288,6 @@ public:
uint32_t line_offset = 0, std::string *fixed_expression = nullptr,
lldb::ModuleSP *jit_module_sp_ptr = nullptr);
- static const Status::ValueType kNoResult =
- 0x1001; ///< ValueObject::GetError() returns this if there is no result
- /// from the expression.
-
const char *GetFixedText() {
if (m_fixed_text.empty())
return nullptr;
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index 8a7cff4b8ea..dc1877c5cc6 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -254,7 +254,8 @@ enum ExpressionResults {
eExpressionHitBreakpoint,
eExpressionTimedOut,
eExpressionResultUnavailable,
- eExpressionStoppedForDebug
+ eExpressionStoppedForDebug,
+ eExpressionProducedNoResult
};
enum SearchDepth {
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/no-result/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/Makefile
new file mode 100644
index 00000000000..50d4ab65a6e
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -std=c99
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py
new file mode 100644
index 00000000000..363b30e4de5
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py
@@ -0,0 +1,45 @@
+"""
+Test that an expression that returns no result returns a sensible error.
+"""
+
+from __future__ import print_function
+
+
+import os
+import time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class TestExprNoResult(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # If your test case doesn't stress debug info, the
+ # set this to true. That way it won't be run once for
+ # each debug info format.
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def test_no_result(self):
+ """Run an expression that has no result, check the error."""
+ self.build()
+ self.main_source_file = lldb.SBFileSpec("main.c")
+ self.sample_test()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ def sample_test(self):
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+ "Set a breakpoint here", self.main_source_file)
+
+ frame = thread.GetFrameAtIndex(0)
+ result = frame.EvaluateExpression("int $x = 10")
+ # No result expressions are considered to fail:
+ self.assertTrue(result.GetError().Fail(), "An expression with no result is a failure.")
+ # But the reason should be eExpressionProducedNoResult
+ self.assertEqual(result.GetError().GetError(), lldb.eExpressionProducedNoResult,
+ "But the right kind of failure")
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/no-result/main.c b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/main.c
new file mode 100644
index 00000000000..8d4e0c4f7be
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/no-result/main.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+int
+main()
+{
+ int test_var = 10;
+ printf ("Set a breakpoint here: %d.\n", test_var);
+ return 0;
+}
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index ac440ef0af5..f6e40075f9e 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -487,7 +487,7 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
}
} else {
if (result_valobj_sp->GetError().GetError() ==
- UserExpression::kNoResult) {
+ lldb::eExpressionProducedNoResult) {
if (format != eFormatVoid &&
m_interpreter.GetDebugger().GetNotifyVoid()) {
error_stream->PutCString("(void)\n");
diff --git a/lldb/source/Expression/ExpressionSourceCode.cpp b/lldb/source/Expression/ExpressionSourceCode.cpp
index abbb332fac4..2c8f77bb2df 100644
--- a/lldb/source/Expression/ExpressionSourceCode.cpp
+++ b/lldb/source/Expression/ExpressionSourceCode.cpp
@@ -256,7 +256,7 @@ bool ExpressionSourceCode::GetText(std::string &text,
}
ConstString object_name;
- if (Language::LanguageIsCPlusPlus(frame->GetLanguage())) {
+ if (1 /* Language::LanguageIsCPlusPlus(frame->GetLanguage())*/) {
if (target->GetInjectLocalVariables(&exe_ctx)) {
lldb::VariableListSP var_list_sp =
frame->GetInScopeVariableList(false, true);
diff --git a/lldb/source/Expression/REPL.cpp b/lldb/source/Expression/REPL.cpp
index 50d4a09b636..c29004c8252 100644
--- a/lldb/source/Expression/REPL.cpp
+++ b/lldb/source/Expression/REPL.cpp
@@ -325,7 +325,7 @@ void REPL::IOHandlerInputComplete(IOHandler &io_handler, std::string &code) {
if (result_valobj_sp->GetError().Success()) {
handled |= PrintOneVariable(debugger, output_sp, result_valobj_sp);
} else if (result_valobj_sp->GetError().GetError() ==
- UserExpression::kNoResult) {
+ lldb::eExpressionProducedNoResult) {
if (format != lldb::eFormatVoid && debugger.GetNotifyVoid()) {
error_sp->PutCString("(void)\n");
handled = true;
diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp
index 34945fdcbfa..1477bbdb660 100644
--- a/lldb/source/Expression/UserExpression.cpp
+++ b/lldb/source/Expression/UserExpression.cpp
@@ -151,6 +151,9 @@ lldb::ExpressionResults UserExpression::Evaluate(
? UserExpression::eResultTypeId
: UserExpression::eResultTypeAny;
lldb::ExpressionResults execution_results = lldb::eExpressionSetupError;
+
+ static const char *no_result_error = "Expression completed successfully "
+ "but had no result";
Target *target = exe_ctx.GetTargetPtr();
if (!target) {
@@ -304,7 +307,8 @@ lldb::ExpressionResults UserExpression::Evaluate(
error.SetExpressionError(lldb::eExpressionSetupError,
"expression needed to run but couldn't");
} else if (execution_policy == eExecutionPolicyTopLevel) {
- error.SetError(UserExpression::kNoResult, lldb::eErrorTypeGeneric);
+ error.SetExpressionError(lldb::eExpressionProducedNoResult,
+ no_result_error);
return lldb::eExpressionCompleted;
} else {
if (options.InvokeCancelCallback(lldb::eExpressionEvaluationExecution)) {
@@ -349,7 +353,8 @@ lldb::ExpressionResults UserExpression::Evaluate(
log->Printf("== [UserExpression::Evaluate] Execution completed "
"normally with no result ==");
- error.SetError(UserExpression::kNoResult, lldb::eErrorTypeGeneric);
+ error.SetExpressionError(lldb::eExpressionProducedNoResult,
+ no_result_error);
}
}
}
diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp
index 5961e6ab216..5e3ba245006 100644
--- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp
@@ -1758,7 +1758,7 @@ bool RenderScriptRuntime::EvalRSExpression(const char *expr,
if (!expr_result->GetError().Success()) {
Status err = expr_result->GetError();
// Expression returned is void, so this is actually a success
- if (err.GetError() == UserExpression::kNoResult) {
+ if (err.GetError() == lldb::eExpressionProducedNoResult) {
if (log)
log->Printf("%s - expression returned void.", __FUNCTION__);
OpenPOWER on IntegriCloud