[Lldb-commits] [lldb] r344647 - Return a named error in the result object of an expression with no result

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Tue Oct 16 14:58:40 PDT 2018


Author: jingham
Date: Tue Oct 16 14:58:40 2018
New Revision: 344647

URL: http://llvm.org/viewvc/llvm-project?rev=344647&view=rev
Log:
Return a named error in the result object of an expression with no result

Before we returned an error that was not exposed in the SB API and no useful
error message.  This change returns eExpressionProducedNoResult and an
appropriate error string.

<rdar://problem/44539514>

Differential Revision: https://reviews.llvm.org/D53309

Added:
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/main.c
Modified:
    lldb/trunk/include/lldb/Expression/UserExpression.h
    lldb/trunk/include/lldb/lldb-enumerations.h
    lldb/trunk/source/Commands/CommandObjectExpression.cpp
    lldb/trunk/source/Expression/ExpressionSourceCode.cpp
    lldb/trunk/source/Expression/REPL.cpp
    lldb/trunk/source/Expression/UserExpression.cpp
    lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp

Modified: lldb/trunk/include/lldb/Expression/UserExpression.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/UserExpression.h?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/UserExpression.h (original)
+++ lldb/trunk/include/lldb/Expression/UserExpression.h Tue Oct 16 14:58:40 2018
@@ -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;

Modified: lldb/trunk/include/lldb/lldb-enumerations.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-enumerations.h?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-enumerations.h (original)
+++ lldb/trunk/include/lldb/lldb-enumerations.h Tue Oct 16 14:58:40 2018
@@ -254,7 +254,8 @@ enum ExpressionResults {
   eExpressionHitBreakpoint,
   eExpressionTimedOut,
   eExpressionResultUnavailable,
-  eExpressionStoppedForDebug
+  eExpressionStoppedForDebug,
+  eExpressionProducedNoResult
 };
 
 enum SearchDepth {

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/Makefile?rev=344647&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/Makefile Tue Oct 16 14:58:40 2018
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -std=c99
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py?rev=344647&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/TestNoResult.py Tue Oct 16 14:58:40 2018
@@ -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")

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/main.c?rev=344647&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/main.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/no-result/main.c Tue Oct 16 14:58:40 2018
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+int
+main()
+{
+  int test_var = 10;
+  printf ("Set a breakpoint here: %d.\n", test_var);
+  return 0;
+}

Modified: lldb/trunk/source/Commands/CommandObjectExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectExpression.cpp?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectExpression.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectExpression.cpp Tue Oct 16 14:58:40 2018
@@ -487,7 +487,7 @@ bool CommandObjectExpression::EvaluateEx
         }
       } else {
         if (result_valobj_sp->GetError().GetError() ==
-            UserExpression::kNoResult) {
+            lldb::eExpressionProducedNoResult) {
           if (format != eFormatVoid &&
               m_interpreter.GetDebugger().GetNotifyVoid()) {
             error_stream->PutCString("(void)\n");

Modified: lldb/trunk/source/Expression/ExpressionSourceCode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ExpressionSourceCode.cpp?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ExpressionSourceCode.cpp (original)
+++ lldb/trunk/source/Expression/ExpressionSourceCode.cpp Tue Oct 16 14:58:40 2018
@@ -256,7 +256,7 @@ bool ExpressionSourceCode::GetText(std::
     }
 
     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);

Modified: lldb/trunk/source/Expression/REPL.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/REPL.cpp?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/source/Expression/REPL.cpp (original)
+++ lldb/trunk/source/Expression/REPL.cpp Tue Oct 16 14:58:40 2018
@@ -325,7 +325,7 @@ void REPL::IOHandlerInputComplete(IOHand
           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;

Modified: lldb/trunk/source/Expression/UserExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/UserExpression.cpp?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/source/Expression/UserExpression.cpp (original)
+++ lldb/trunk/source/Expression/UserExpression.cpp Tue Oct 16 14:58:40 2018
@@ -151,6 +151,9 @@ lldb::ExpressionResults UserExpression::
                                       ? 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::
         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::
             log->Printf("== [UserExpression::Evaluate] Execution completed "
                         "normally with no result ==");
 
-          error.SetError(UserExpression::kNoResult, lldb::eErrorTypeGeneric);
+          error.SetExpressionError(lldb::eExpressionProducedNoResult,
+                                   no_result_error);
         }
       }
     }

Modified: lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp?rev=344647&r1=344646&r2=344647&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp Tue Oct 16 14:58:40 2018
@@ -1758,7 +1758,7 @@ bool RenderScriptRuntime::EvalRSExpressi
   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__);
 




More information about the lldb-commits mailing list