[llvm] r190469 - YAMLIO: Fix string quoting logic.

Hans Wennborg hans at chromium.org
Tue Sep 10 19:03:11 PDT 2013


Hi Rui,

I reverted this in r190480 as it was turning the bots red.

Example error output:
http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-75/builds/8663/steps/check-all/logs/Clang%20Tools%3A%3Amain.cpp
http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-75/builds/8663/steps/check-all/logs/Clang-Unit%3A%3AReplacementsYamlTest.serializesReplacements

 - Hans

On Tue, Sep 10, 2013 at 5:45 PM, Rui Ueyama <ruiu at google.com> wrote:
> Author: ruiu
> Date: Tue Sep 10 19:45:48 2013
> New Revision: 190469
>
> URL: http://llvm.org/viewvc/llvm-project?rev=190469&view=rev
> Log:
> YAMLIO: Fix string quoting logic.
>
> YAMLIO printed a string as is without quotes unless it contains a newline
> character. That did not suffice. We also need to quote a string if it starts
> with a backquote, quote, double quote or atsign, or it's the empty string.
>
> Modified:
>     llvm/trunk/lib/Support/YAMLTraits.cpp
>     llvm/trunk/unittests/Support/YAMLIOTest.cpp
>
> Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=190469&r1=190468&r2=190469&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
> +++ llvm/trunk/lib/Support/YAMLTraits.cpp Tue Sep 10 19:45:48 2013
> @@ -510,8 +510,16 @@ void Output::endBitSetScalar() {
>
>  void Output::scalarString(StringRef &S) {
>    this->newLineCheck();
> -  if (S.find('\n') == StringRef::npos) {
> -    // No embedded new-line chars, just print string.
> +
> +  if (S.empty()) {
> +    // Print '' for the empty string because leaving the field empty is not
> +    // allowed.
> +    this->outputUpToEndOfLine("''");
> +    return;
> +  }
> +  if (!strchr("'`@\"", S.front()) && S.find('\n') == StringRef::npos) {
> +    // Plain string cannot start with double quote or single quote. Backquote
> +    // and atsign are reserved characters. Newline is not allowed.
>      this->outputUpToEndOfLine(S);
>      return;
>    }
>
> Modified: llvm/trunk/unittests/Support/YAMLIOTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/YAMLIOTest.cpp?rev=190469&r1=190468&r2=190469&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/YAMLIOTest.cpp (original)
> +++ llvm/trunk/unittests/Support/YAMLIOTest.cpp Tue Sep 10 19:45:48 2013
> @@ -273,7 +273,64 @@ TEST(YAMLIO, TestReadWriteBuiltInTypes)
>    }
>  }
>
> +struct StringTypes {
> +  llvm::StringRef str1;
> +  llvm::StringRef str2;
> +  llvm::StringRef str3;
> +  llvm::StringRef str4;
> +  llvm::StringRef str5;
> +};
>
> +namespace llvm {
> +namespace yaml {
> +  template <>
> +  struct MappingTraits<StringTypes> {
> +    static void mapping(IO &io, StringTypes& st) {
> +      io.mapRequired("str1",      st.str1);
> +      io.mapRequired("str2",      st.str2);
> +      io.mapRequired("str3",      st.str3);
> +      io.mapRequired("str4",      st.str4);
> +      io.mapRequired("str5",      st.str5);
> +    }
> +  };
> +}
> +}
> +
> +TEST(YAMLIO, TestReadWriteStringTypes) {
> +  std::string intermediate;
> +  {
> +    StringTypes map;
> +    map.str1 = "'aaa";
> +    map.str2 = "\"bbb";
> +    map.str3 = "`ccc";
> +    map.str4 = "@ddd";
> +    map.str5 = "";
> +
> +    llvm::raw_string_ostream ostr(intermediate);
> +    Output yout(ostr);
> +    yout << map;
> +  }
> +
> +  llvm::StringRef flowOut(intermediate);
> +  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'''aaa"));
> +  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'\"bbb'"));
> +  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'`ccc'"));
> +  EXPECT_NE(llvm::StringRef::npos, flowOut.find("'@ddd'"));
> +  EXPECT_NE(llvm::StringRef::npos, flowOut.find("''\n"));
> +
> +  {
> +    Input yin(intermediate);
> +    StringTypes map;
> +    yin >> map;
> +
> +    EXPECT_FALSE(yin.error());
> +    EXPECT_TRUE(map.str1.equals("'aaa"));
> +    EXPECT_TRUE(map.str2.equals("\"bbb"));
> +    EXPECT_TRUE(map.str3.equals("`ccc"));
> +    EXPECT_TRUE(map.str4.equals("@ddd"));
> +    EXPECT_TRUE(map.str5.equals(""));
> +  }
> +}
>
>  //===----------------------------------------------------------------------===//
>  //  Test ScalarEnumerationTraits
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list