[Lldb-commits] [lldb] r243383 - Support escapes and quotes in string and character values.

Ilia K ki.stfu at gmail.com
Mon Jul 27 22:43:47 PDT 2015


Author: ki.stfu
Date: Tue Jul 28 00:43:47 2015
New Revision: 243383

URL: http://llvm.org/viewvc/llvm-project?rev=243383&view=rev
Log:
Support escapes and quotes in string and character values.

Summary:
Escape characters in strings and strings containing quotes were not appearing correctly in expression values.

Patch from paulmay at microsoft.com

Reviewers: abidh, ChuckR, paulmaybee

Subscribers: greggm, lldb-commits

Differential Revision: http://reviews.llvm.org/D11371

Modified:
    lldb/trunk/test/tools/lldb-mi/variable/TestMiGdbSetShowPrint.py
    lldb/trunk/test/tools/lldb-mi/variable/main.cpp
    lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
    lldb/trunk/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp
    lldb/trunk/tools/lldb-mi/MIUtilString.cpp
    lldb/trunk/tools/lldb-mi/MIUtilString.h

Modified: lldb/trunk/test/tools/lldb-mi/variable/TestMiGdbSetShowPrint.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/variable/TestMiGdbSetShowPrint.py?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/variable/TestMiGdbSetShowPrint.py (original)
+++ lldb/trunk/test/tools/lldb-mi/variable/TestMiGdbSetShowPrint.py Tue Jul 28 00:43:47 2015
@@ -37,27 +37,27 @@ class MiGdbSetShowTestCase(lldbmi_testca
 
         # Test that an char* is expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * cp")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ \\\\\\\"hello\\\\\\\"\",type=\"const char \*\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ \\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char \*\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that an char[] isn't expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * ca")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"\[6\]\",type=\"const char \[6\]\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"\[10\]\",type=\"const char \[10\]\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that an char16_t* is expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * u16p")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ u\\\\\\\"hello\\\\\\\"\",type=\"const char16_t \*\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ u\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char16_t \*\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that an char16_t[] isn't expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * u16a")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"\[6\]\",type=\"const char16_t \[6\]\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"\[10\]\",type=\"const char16_t \[10\]\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that an char32_t* is expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * u32p")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ U\\\\\\\"hello\\\\\\\"\",type=\"const char32_t \*\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ U\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char32_t \*\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that an char32_t[] isn't expanded to string when print char-array-as-string is "off"
         self.runCmd("-var-create - * u32a")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"\[6\]\",type=\"const char32_t \[6\]\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"\[10\]\",type=\"const char32_t \[10\]\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that -gdb-set can set print char-array-as-string flag
         self.runCmd("-gdb-set print char-array-as-string on")
@@ -67,29 +67,29 @@ class MiGdbSetShowTestCase(lldbmi_testca
         self.runCmd("-gdb-show print char-array-as-string")
         self.expect("\^done,value=\"on\"")
 
-        # Test that an char* is expanded to string when print char-array-as-string is "on"
+        # Test that an char* with escape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * cp")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ \\\\\\\"hello\\\\\\\"\",type=\"const char \*\",thread-id=\"1\",has_more=\"0\"")
-
-        # Test that an char[] isn't expanded to string when print char-array-as-string is "on"
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ \\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char \*\",thread-id=\"1\",has_more=\"0\"")
+        
+        # Test that an char[] with escape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * ca")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"\\\\\\\"hello\\\\\\\"\",type=\"const char \[6\]\",thread-id=\"1\",has_more=\"0\"")
-
-        # Test that an char16_t* is expanded to string when print char-array-as-string is "on"
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char \[10\]\",thread-id=\"1\",has_more=\"0\"")
+        
+        # Test that an char16_t* with esc1ape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * u16p")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ u\\\\\\\"hello\\\\\\\"\",type=\"const char16_t \*\",thread-id=\"1\",has_more=\"0\"")
-
-        # Test that an char16_t[] isn't expanded to string when print char-array-as-string is "on"
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ u\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char16_t \*\",thread-id=\"1\",has_more=\"0\"")
+        
+        # Test that an char16_t[] with escape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * u16a")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"u\\\\\\\"hello\\\\\\\"\",type=\"const char16_t \[6\]\",thread-id=\"1\",has_more=\"0\"")
-
-        # Test that an char32_t* is expanded to string when print char-array-as-string is "on"
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"u\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char16_t \[10\]\",thread-id=\"1\",has_more=\"0\"")
+        
+        # Test that an char32_t* with escape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * u32p")
-        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ U\\\\\\\"hello\\\\\\\"\",type=\"const char32_t \*\",thread-id=\"1\",has_more=\"0\"")
-
-        # Test that an char32_t[] isn't expanded to string when print char-array-as-string is "on"
+        self.expect("\^done,name=\"var\d+\",numchild=\"1\",value=\"0x[0-9a-f]+ U\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char32_t \*\",thread-id=\"1\",has_more=\"0\"")
+        
+        # Test that an char32_t[] with escape chars is expanded to string when print char-array-as-string is "on"
         self.runCmd("-var-create - * u32a")
-        self.expect("\^done,name=\"var\d+\",numchild=\"6\",value=\"U\\\\\\\"hello\\\\\\\"\",type=\"const char32_t \[6\]\",thread-id=\"1\",has_more=\"0\"")
+        self.expect("\^done,name=\"var\d+\",numchild=\"10\",value=\"U\\\\\\\"\\\\\\\\t\\\\\\\\\\\\\"hello\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\"\",type=\"const char32_t \[10\]\",thread-id=\"1\",has_more=\"0\"")
 
         # Test that -gdb-set print char-array-as-string fails if "on"/"off" isn't specified
         self.runCmd("-gdb-set print char-array-as-string")

Modified: lldb/trunk/test/tools/lldb-mi/variable/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/variable/main.cpp?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-mi/variable/main.cpp (original)
+++ lldb/trunk/test/tools/lldb-mi/variable/main.cpp Tue Jul 28 00:43:47 2015
@@ -57,12 +57,12 @@ var_list_children_test(void)
 void
 gdb_set_show_print_char_array_as_string_test(void)
 {
-    const char *cp = "hello";
-    const char ca[] = "hello";
-    const char16_t *u16p = u"hello";
-    const char16_t u16a[] = u"hello";
-    const char32_t *u32p = U"hello";
-    const char32_t u32a[] = U"hello";
+    const char *cp = "\t\"hello\"\n";
+    const char ca[] = "\t\"hello\"\n";
+    const char16_t *u16p = u"\t\"hello\"\n";
+    const char16_t u16a[] = u"\t\"hello\"\n";
+    const char32_t *u32p = U"\t\"hello\"\n";
+    const char32_t u32a[] = U"\t\"hello\"\n";
 
     // BP_gdb_set_show_print_char_array_as_string_test
 }

Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp Tue Jul 28 00:43:47 2015
@@ -285,7 +285,7 @@ CMICmnLLDBDebugSessionInfoVarObj::GetVal
         }
     }
 
-    return utilValue.GetValue().Escape().AddSlashes();
+    return utilValue.GetValue().AddSlashes();
 }
 
 //++ ------------------------------------------------------------------------------------

Modified: lldb/trunk/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp Tue Jul 28 00:43:47 2015
@@ -237,8 +237,7 @@ CMICmnLLDBUtilSBValue::GetSimpleValueCSt
         case lldb::eBasicTypeSignedChar:
         case lldb::eBasicTypeUnsignedChar:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char>(child).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char>(child));
             // Note code that has const in will not show the text suffix to the string pointer
             // i.e. const char * pMyStr = "blah"; ==> "0x00007000"" <-- Eclipse shows this
             // but        char * pMyStr = "blah"; ==> "0x00007000" "blah"" <-- Eclipse shows this
@@ -246,14 +245,12 @@ CMICmnLLDBUtilSBValue::GetSimpleValueCSt
         }
         case lldb::eBasicTypeChar16:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(child).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(child));
             return CMIUtilString::Format("%s u\"%s\"", value, prefix.c_str());
         }
         case lldb::eBasicTypeChar32:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(child).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(child));
             return CMIUtilString::Format("%s U\"%s\"", value, prefix.c_str());
         }
     }
@@ -280,22 +277,19 @@ CMICmnLLDBUtilSBValue::GetSimpleValueCSt
         case lldb::eBasicTypeSignedChar:
         case lldb::eBasicTypeUnsignedChar:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char>(m_rValue, nChildren).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char>(m_rValue, nChildren));
             // TODO: to match char* it should be the following
             //       return CMIUtilString::Format("[%u] \"%s\"", nChildren, prefix.c_str());
             return CMIUtilString::Format("\"%s\"", prefix.c_str());
         }
         case lldb::eBasicTypeChar16:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(m_rValue, nChildren).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(m_rValue, nChildren));
             return CMIUtilString::Format("u\"%s\"", prefix.c_str());
         }
         case lldb::eBasicTypeChar32:
         {
-            // FIXME Add slashes before double quotes
-            const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(m_rValue, nChildren).AddSlashes());
+            const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(m_rValue, nChildren));
             return CMIUtilString::Format("U\"%s\"", prefix.c_str());
         }
     }
@@ -472,7 +466,7 @@ CMICmnLLDBUtilSBValue::ReadCStringFromHo
             return m_pUnkwn;
         else if (ch == 0)
             break;
-        result.append(CMIUtilString::ConvertToPrintableASCII(ch));
+        result.append(CMIUtilString::ConvertToPrintableASCII(ch, true /* bEscapeQuotes */));
         addr += sizeof(ch);
     }
 

Modified: lldb/trunk/tools/lldb-mi/MIUtilString.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIUtilString.cpp?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MIUtilString.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MIUtilString.cpp Tue Jul 28 00:43:47 2015
@@ -895,7 +895,7 @@ CMIUtilString::StripSlashes(void) const
 }
 
 CMIUtilString
-CMIUtilString::ConvertToPrintableASCII(const char vChar)
+CMIUtilString::ConvertToPrintableASCII(const char vChar, bool bEscapeQuotes)
 {
     switch (vChar)
     {
@@ -917,6 +917,10 @@ CMIUtilString::ConvertToPrintableASCII(c
             return "\\e";
         case '\\':
             return "\\\\";
+        case '"':
+            if (bEscapeQuotes)
+                return "\\\"";
+            // fall thru
         default:
             if (::isprint(vChar))
                 return Format("%c", vChar);
@@ -926,24 +930,65 @@ CMIUtilString::ConvertToPrintableASCII(c
 }
 
 CMIUtilString
-CMIUtilString::ConvertToPrintableASCII(const char16_t vChar16)
+CMIUtilString::ConvertCharValueToPrintableASCII(char vChar, bool bEscapeQuotes)
 {
-    if (vChar16 == (char16_t)(char)vChar16 && ::isprint(vChar16))
+    switch (vChar)
+    {
+        case '\a':
+            return "\\a";
+        case '\b':
+            return "\\b";
+        case '\t':
+            return "\\t";
+        case '\n':
+            return "\\n";
+        case '\v':
+            return "\\v";
+        case '\f':
+            return "\\f";
+        case '\r':
+            return "\\r";
+        case '\033':
+            return "\\e";
+        case '\\':
+            return "\\\\";
+        case '"':
+            if (bEscapeQuotes)
+                return "\\\"";
+            // fall thru
+        default:
+            if (::isprint(vChar))
+                return Format("%c", vChar);
+            else
+                return CMIUtilString();
+    }
+}
+
+CMIUtilString
+CMIUtilString::ConvertToPrintableASCII(const char16_t vChar16, bool bEscapeQuotes)
+{
+    if (vChar16 == (char16_t)(char)vChar16)
+    {
         // Convert char16_t to char (if possible)
-        return Format("%c", vChar16);
-    else
-        return Format("\\u%02" PRIx8 "%02" PRIx8,
+        CMIUtilString str = ConvertCharValueToPrintableASCII((char)vChar16, bEscapeQuotes);
+        if (str.length() > 0)
+            return str;
+    }
+    return Format("\\u%02" PRIx8 "%02" PRIx8,
                       (vChar16 >> 8) & 0xff, vChar16 & 0xff);
 }
 
 CMIUtilString
-CMIUtilString::ConvertToPrintableASCII(const char32_t vChar32)
+CMIUtilString::ConvertToPrintableASCII(const char32_t vChar32, bool bEscapeQuotes)
 {
-    if (vChar32 == (char32_t)(char)vChar32 && ::isprint(vChar32))
+    if (vChar32 == (char32_t)(char)vChar32)
+    {
         // Convert char32_t to char (if possible)
-        return Format("%c", vChar32);
-    else
-        return Format("\\U%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8,
+        CMIUtilString str = ConvertCharValueToPrintableASCII((char)vChar32, bEscapeQuotes);
+        if (str.length() > 0)
+            return str;
+    }
+    return Format("\\U%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8,
                       (vChar32 >> 24) & 0xff, (vChar32 >> 16) & 0xff,
                       (vChar32 >> 8) & 0xff, vChar32 & 0xff);
 }

Modified: lldb/trunk/tools/lldb-mi/MIUtilString.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIUtilString.h?rev=243383&r1=243382&r2=243383&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MIUtilString.h (original)
+++ lldb/trunk/tools/lldb-mi/MIUtilString.h Tue Jul 28 00:43:47 2015
@@ -34,9 +34,9 @@ class CMIUtilString : public std::string
     static CMIUtilString FormatValist(const CMIUtilString &vrFormating, va_list vArgs);
     static bool IsAllValidAlphaAndNumeric(const char *vpText);
     static bool Compare(const CMIUtilString &vrLhs, const CMIUtilString &vrRhs);
-    static CMIUtilString ConvertToPrintableASCII(const char vChar);
-    static CMIUtilString ConvertToPrintableASCII(const char16_t vChar16);
-    static CMIUtilString ConvertToPrintableASCII(const char32_t vChar32);
+    static CMIUtilString ConvertToPrintableASCII(const char vChar, bool bEscapeQuotes = false);
+    static CMIUtilString ConvertToPrintableASCII(const char16_t vChar16, bool bEscapeQuotes = false);
+    static CMIUtilString ConvertToPrintableASCII(const char32_t vChar32, bool bEscapeQuotes = false);
 
     // Methods:
   public:
@@ -75,6 +75,7 @@ class CMIUtilString : public std::string
     // Static method:
   private:
     static CMIUtilString FormatPriv(const CMIUtilString &vrFormat, va_list vArgs);
+    static CMIUtilString ConvertCharValueToPrintableASCII(char vChar, bool bEscapeQuotes);
 
     // Methods:
   private:





More information about the lldb-commits mailing list