Revert "Revert "YAMLIO: Encode ambiguous hex strings explicitly""
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 9 Apr 2014 17:04:27 +0000 (17:04 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 9 Apr 2014 17:04:27 +0000 (17:04 +0000)
Don't quote octal compatible strings if they are only two wide, they
aren't ambiguous.

This reverts commit r205857 which reverted r205857.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205914 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/YAMLTraits.cpp
test/Object/obj2yaml.test
unittests/Support/YAMLIOTest.cpp

index 38f3ec7c7f9cc77c1b3b4f73d6fe988fb7e7a729..005a8107748bc2a485b0415ed3dd95d49a1c3a9b 100644 (file)
@@ -561,8 +561,9 @@ void Output::scalarString(StringRef &S) {
     this->outputUpToEndOfLine("''");
     return;
   }
+  bool isOctalString = S.front() == '0' && S.size() > 2 && !S.startswith("0x");
   if (S.find_first_not_of(ScalarSafeChars) == StringRef::npos &&
-      !isspace(S.front()) && !isspace(S.back())) {
+      !isspace(S.front()) && !isspace(S.back()) && !isOctalString) {
     // If the string consists only of safe characters, print it out without
     // quotes.
     this->outputUpToEndOfLine(S);
index 5ab8a15224224f6ee958cddf2add4788c39cb6e6..bc11f35c1071753ac00ea55f8bb6fc4ac68c5331 100644 (file)
@@ -115,7 +115,7 @@ COFF-X86-64-NEXT:     SectionData: 48656C6C6F20576F726C642100
 COFF-X86-64:        - Name: '.CRT$XCU'
 COFF-X86-64-NEXT:     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
 COFF-X86-64-NEXT:     Alignment: 8
-COFF-X86-64-NEXT:     SectionData:  0000000000000000
+COFF-X86-64-NEXT:     SectionData:  '0000000000000000'
 
 COFF-X86-64:     Relocations:
 COFF-X86-64-NEXT:       - VirtualAddress: 0
index 52a8f6b88c243333e2ed26677ebcf6dc8ea02fe9..0f1951f4fcb3af3103473aa25b14e80e0a827156 100644 (file)
@@ -302,11 +302,13 @@ struct StringTypes {
   llvm::StringRef str3;
   llvm::StringRef str4;
   llvm::StringRef str5;
+  llvm::StringRef str6;
   std::string stdstr1;
   std::string stdstr2;
   std::string stdstr3;
   std::string stdstr4;
   std::string stdstr5;
+  std::string stdstr6;
 };
 
 namespace llvm {
@@ -319,11 +321,13 @@ namespace yaml {
       io.mapRequired("str3",      st.str3);
       io.mapRequired("str4",      st.str4);
       io.mapRequired("str5",      st.str5);
+      io.mapRequired("str6",      st.str6);
       io.mapRequired("stdstr1",   st.stdstr1);
       io.mapRequired("stdstr2",   st.stdstr2);
       io.mapRequired("stdstr3",   st.stdstr3);
       io.mapRequired("stdstr4",   st.stdstr4);
       io.mapRequired("stdstr5",   st.stdstr5);
+      io.mapRequired("stdstr6",   st.stdstr6);
     }
   };
 }
@@ -338,11 +342,13 @@ TEST(YAMLIO, TestReadWriteStringTypes) {
     map.str3 = "`ccc";
     map.str4 = "@ddd";
     map.str5 = "";
+    map.str6 = "0000000004000000";
     map.stdstr1 = "'eee";
     map.stdstr2 = "\"fff";
     map.stdstr3 = "`ggg";
     map.stdstr4 = "@hhh";
     map.stdstr5 = "";
+    map.stdstr6 = "0000000004000000";
 
     llvm::raw_string_ostream ostr(intermediate);
     Output yout(ostr);
@@ -355,11 +361,13 @@ TEST(YAMLIO, TestReadWriteStringTypes) {
   EXPECT_NE(llvm::StringRef::npos, flowOut.find("'`ccc'"));
   EXPECT_NE(llvm::StringRef::npos, flowOut.find("'@ddd'"));
   EXPECT_NE(llvm::StringRef::npos, flowOut.find("''\n"));
+  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'0000000004000000'\n"));
   EXPECT_NE(std::string::npos, flowOut.find("'''eee"));
   EXPECT_NE(std::string::npos, flowOut.find("'\"fff'"));
   EXPECT_NE(std::string::npos, flowOut.find("'`ggg'"));
   EXPECT_NE(std::string::npos, flowOut.find("'@hhh'"));
   EXPECT_NE(std::string::npos, flowOut.find("''\n"));
+  EXPECT_NE(std::string::npos, flowOut.find("'0000000004000000'\n"));
 
   {
     Input yin(intermediate);
@@ -372,11 +380,13 @@ TEST(YAMLIO, TestReadWriteStringTypes) {
     EXPECT_TRUE(map.str3.equals("`ccc"));
     EXPECT_TRUE(map.str4.equals("@ddd"));
     EXPECT_TRUE(map.str5.equals(""));
+    EXPECT_TRUE(map.str6.equals("0000000004000000"));
     EXPECT_TRUE(map.stdstr1 == "'eee");
     EXPECT_TRUE(map.stdstr2 == "\"fff");
     EXPECT_TRUE(map.stdstr3 == "`ggg");
     EXPECT_TRUE(map.stdstr4 == "@hhh");
     EXPECT_TRUE(map.stdstr5 == "");
+    EXPECT_TRUE(map.stdstr6 == "0000000004000000");
   }
 }