[Lldb-commits] [lldb] r169927 - in /lldb/trunk: include/lldb/Interpreter/OptionValueString.h source/Interpreter/OptionGroupVariable.cpp source/Interpreter/OptionValueString.cpp test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py

Enrico Granata egranata at apple.com
Tue Dec 11 14:42:19 PST 2012


Author: enrico
Date: Tue Dec 11 16:42:19 2012
New Revision: 169927

URL: http://llvm.org/viewvc/llvm-project?rev=169927&view=rev
Log:
Adding a validation callback mechanism to OptionValueString (such a feature might theoretically be added to the general OptionValue base class should the need arise)
Using this mechanism, making sure that the options to pass a summary string or a named summary to frame variable do not have invalid values

<rdar://problem/11576143>


Modified:
    lldb/trunk/include/lldb/Interpreter/OptionValueString.h
    lldb/trunk/source/Interpreter/OptionGroupVariable.cpp
    lldb/trunk/source/Interpreter/OptionValueString.cpp
    lldb/trunk/test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py

Modified: lldb/trunk/include/lldb/Interpreter/OptionValueString.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/OptionValueString.h?rev=169927&r1=169926&r2=169927&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/OptionValueString.h (original)
+++ lldb/trunk/include/lldb/Interpreter/OptionValueString.h Tue Dec 11 16:42:19 2012
@@ -24,6 +24,10 @@
 class OptionValueString : public OptionValue
 {
 public:
+    
+    typedef Error (*ValidatorCallback) (const char* string,
+                                        void* baton);
+    
     enum Options
     {
         eOptionEncodeCharacterEscapeSequences = (1u << 0)
@@ -33,7 +37,20 @@
         OptionValue(),
         m_current_value (),
         m_default_value (),
-        m_options()
+        m_options(),
+        m_validator(),
+        m_validator_baton()
+    {
+    }
+    
+    OptionValueString (ValidatorCallback validator,
+                       void* baton = NULL) :
+        OptionValue(),
+        m_current_value (),
+        m_default_value (),
+        m_options(),
+        m_validator(validator),
+        m_validator_baton(baton)
     {
     }
 
@@ -41,7 +58,9 @@
         OptionValue(),
         m_current_value (),
         m_default_value (),
-        m_options()
+        m_options(),
+        m_validator(),
+        m_validator_baton()
     {
         if  (value && value[0])
         {
@@ -55,7 +74,9 @@
         OptionValue(),
         m_current_value (),
         m_default_value (),
-        m_options()
+        m_options(),
+        m_validator(),
+        m_validator_baton()
     {
         if  (current_value && current_value[0])
             m_current_value.assign (current_value);
@@ -63,7 +84,41 @@
             m_default_value.assign (default_value);
     }
     
-    virtual 
+    OptionValueString (const char *value,
+                       ValidatorCallback validator,
+                       void* baton = NULL) :
+    OptionValue(),
+    m_current_value (),
+    m_default_value (),
+    m_options(),
+    m_validator(validator),
+    m_validator_baton(baton)
+    {
+        if  (value && value[0])
+        {
+            m_current_value.assign (value);
+            m_default_value.assign (value);
+        }
+    }
+    
+    OptionValueString (const char *current_value,
+                       const char *default_value,
+                       ValidatorCallback validator,
+                       void* baton = NULL) :
+    OptionValue(),
+    m_current_value (),
+    m_default_value (),
+    m_options(),
+    m_validator(validator),
+    m_validator_baton(baton)
+    {
+        if  (current_value && current_value[0])
+            m_current_value.assign (current_value);
+        if  (default_value && default_value[0])
+            m_default_value.assign (default_value);
+    }
+    
+    virtual
     ~OptionValueString()
     {
     }
@@ -115,10 +170,7 @@
     const char *
     operator = (const char *value)
     {
-        if (value && value[0])
-            m_current_value.assign (value);
-        else
-            m_current_value.clear();
+        SetCurrentValue(value);
         return m_current_value.c_str();
     }
 
@@ -134,21 +186,11 @@
         return m_default_value.c_str();
     }
     
-    void
-    SetCurrentValue (const char *value)
-    {
-        if (value && value[0])
-            m_current_value.assign (value);
-        else
-            m_current_value.clear();
-    }
-
-    void
-    AppendToCurrentValue (const char *value)
-    {
-        if (value && value[0])
-            m_current_value.append (value);
-    }
+    Error
+    SetCurrentValue (const char *value);
+    
+    Error
+    AppendToCurrentValue (const char *value);
 
     void
     SetDefaultValue (const char *value)
@@ -176,6 +218,8 @@
     std::string m_current_value;
     std::string m_default_value;
     Flags m_options;
+    ValidatorCallback m_validator;
+    void* m_validator_baton;
 };
 
 } // namespace lldb_private

Modified: lldb/trunk/source/Interpreter/OptionGroupVariable.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionGroupVariable.cpp?rev=169927&r1=169926&r2=169927&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/OptionGroupVariable.cpp (original)
+++ lldb/trunk/source/Interpreter/OptionGroupVariable.cpp Tue Dec 11 16:42:19 2012
@@ -15,6 +15,8 @@
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
+#include "lldb/Core/DataVisualization.h"
+#include "lldb/Core/Error.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Utility/Utils.h"
@@ -39,7 +41,22 @@
 
 OptionGroupVariable::OptionGroupVariable (bool show_frame_options) :
     OptionGroup(),
-    include_frame_options (show_frame_options)
+    include_frame_options (show_frame_options),
+    summary([] (const char* str,void*)->Error
+            {
+                if (!str || !str[0])
+                    return Error("must specify a valid named summary");
+                TypeSummaryImplSP summary_sp;
+                if (DataVisualization::NamedSummaryFormats::GetSummaryFormat(ConstString(str), summary_sp) == false)
+                    return Error("must specify a valid named summary");
+                return Error();
+            }),
+    summary_string([] (const char* str, void*)->Error
+           {
+               if (!str || !str[0])
+                   return Error("must specify a non-empty summary string");
+               return Error();
+           })
 {
 }
 
@@ -67,10 +84,10 @@
             show_scope = true;
             break;
         case 'y':
-            summary.SetCurrentValue(option_arg);
+            error = summary.SetCurrentValue(option_arg);
             break;
         case 'z':
-            summary_string.SetCurrentValue(option_arg);
+            error = summary_string.SetCurrentValue(option_arg);
             break;
         default:
             error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option);

Modified: lldb/trunk/source/Interpreter/OptionValueString.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueString.cpp?rev=169927&r1=169926&r2=169927&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/OptionValueString.cpp (original)
+++ lldb/trunk/source/Interpreter/OptionValueString.cpp Tue Dec 11 16:42:19 2012
@@ -61,20 +61,36 @@
     case eVarSetOperationInsertBefore:
     case eVarSetOperationInsertAfter:
     case eVarSetOperationRemove:
+        if (m_validator)
+        {
+            error = m_validator(value_cstr,m_validator_baton);
+            if (error.Fail())
+                return error;
+        }
         error = OptionValue::SetValueFromCString (value_cstr, op);
         break;
 
     case eVarSetOperationAppend:
+        {
+        std::string new_value(m_current_value);
         if (value_cstr && value_cstr[0])
         {
             if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
             {
                 std::string str;
                 Args::EncodeEscapeSequences (value_cstr, str);
-                m_current_value += str;
+                new_value.append(str);
             }
             else
-                m_current_value += value_cstr;
+                new_value.append(value_cstr);
+        }
+        if (m_validator)
+        {
+            error = m_validator(new_value.c_str(),m_validator_baton);
+            if (error.Fail())
+                return error;
+        }
+        m_current_value.assign(new_value);
         }
         break;
 
@@ -84,6 +100,12 @@
 
     case eVarSetOperationReplace:
     case eVarSetOperationAssign:
+        if (m_validator)
+        {
+            error = m_validator(value_cstr,m_validator_baton);
+            if (error.Fail())
+                return error;
+        }
         m_value_was_set = true;
         if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
         {
@@ -104,3 +126,39 @@
 {
     return OptionValueSP(new OptionValueString(*this));
 }
+
+Error
+OptionValueString::SetCurrentValue (const char *value)
+{
+    if (m_validator)
+    {
+        Error error(m_validator(value,m_validator_baton));
+        if (error.Fail())
+            return error;
+    }
+    if (value && value[0])
+        m_current_value.assign (value);
+    else
+        m_current_value.clear();
+    return Error();
+}
+
+Error
+OptionValueString::AppendToCurrentValue (const char *value)
+{
+    if (value && value[0])
+    {
+        if (m_validator)
+        {
+            std::string new_value(m_current_value);
+            new_value.append(value);
+            Error error(m_validator(value,m_validator_baton));
+            if (error.Fail())
+                return error;
+            m_current_value.assign(new_value);
+        }
+        else
+            m_current_value.append (value);
+    }
+    return Error();
+}

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py?rev=169927&r1=169926&r2=169927&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-named-summaries/TestDataFormatterNamedSummaries.py Tue Dec 11 16:42:19 2012
@@ -94,9 +94,10 @@
             substrs = ['Second: x=65',
                         'y=0x'])
                     
-        self.expect("frame variable second --summary NoSuchSummary",
-            substrs = ['Second: x=65',
-                        'y=0x'])
+        # <rdar://problem/11576143> decided that invalid summaries will raise an error
+        # instead of just defaulting to the base summary
+        self.expect("frame variable second --summary NoSuchSummary",error=True,
+            substrs = ['must specify a valid named summary'])
                     
         self.runCmd("thread step-over")
                     





More information about the lldb-commits mailing list