[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