<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>This is a stepping stone to supporting some semantic level checking which is only relevant when doing input.    Yes, I cringe too when the Input/Output symmetry is broken.  </div><div><br></div><div>In particular, I’m working on a way to encode mach-o as yaml for test cases.  I need to handle semantic errors like an invalid symbol index in a relocation.  I’ll need to only do the checks when inputting and then set an error_code just as if there had been a syntax error in the yaml.</div><div><br></div><div>-Nick</div><br><div><div>On Nov 13, 2013, at 7:30 PM, Sean Silva <<a href="mailto:silvas@purdue.edu">silvas@purdue.edu</a>> wrote:</div><blockquote type="cite"><div dir="ltr">Out of curiousity what is use case for this? One of the things I like about YAMLIO is that both input and output "work from a single point of truth"; being able to distinguish when we are inputting from when we are outputting seems like it could be problematic as it circumvents that property of the interface.<div>
<br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Nov 13, 2013 at 9:38 PM, Nick Kledzik <span dir="ltr"><<a href="mailto:kledzik@apple.com" target="_blank">kledzik@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kledzik<br>
Date: Wed Nov 13 20:38:07 2013<br>
New Revision: 194655<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=194655&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=194655&view=rev</a><br>
Log:<br>
Add dyn_cast<> support to YAML I/O's IO class<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Support/YAMLTraits.h<br>
    llvm/trunk/lib/Support/YAMLTraits.cpp<br>
    llvm/trunk/unittests/Support/YAMLIOTest.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=194655&r1=194654&r2=194655&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=194655&r1=194654&r2=194655&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)<br>
+++ llvm/trunk/include/llvm/Support/YAMLTraits.h Wed Nov 13 20:38:07 2013<br>
@@ -18,6 +18,7 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/ADT/Twine.h"<br>
+#include "llvm/Support/Casting.h"<br>
 #include "llvm/Support/Compiler.h"<br>
 #include "llvm/Support/SourceMgr.h"<br>
 #include "llvm/Support/YAMLParser.h"<br>
@@ -317,7 +318,7 @@ public:<br>
   IO(void *Ctxt=NULL);<br>
   virtual ~IO();<br>
<br>
-  virtual bool outputting() = 0;<br>
+  virtual bool outputting() const = 0;<br>
<br>
   virtual unsigned beginSequence() = 0;<br>
   virtual bool preflightElement(unsigned, void *&) = 0;<br>
@@ -694,8 +695,10 @@ public:<br>
   // To set alternate error reporting.<br>
   void setDiagHandler(llvm::SourceMgr::DiagHandlerTy Handler, void *Ctxt = 0);<br>
<br>
+  static bool classof(const IO *io) { return !io->outputting(); }<br>
+<br>
 private:<br>
-  virtual bool outputting();<br>
+  virtual bool outputting() const;<br>
   virtual bool mapTag(StringRef, bool);<br>
   virtual void beginMapping();<br>
   virtual void endMapping();<br>
@@ -819,7 +822,9 @@ public:<br>
   Output(llvm::raw_ostream &, void *Ctxt=NULL);<br>
   virtual ~Output();<br>
<br>
-  virtual bool outputting();<br>
+  static bool classof(const IO *io) { return io->outputting(); }<br>
+<br>
+  virtual bool outputting() const;<br>
   virtual bool mapTag(StringRef, bool);<br>
   virtual void beginMapping();<br>
   virtual void endMapping();<br>
<br>
Modified: llvm/trunk/lib/Support/YAMLTraits.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=194655&r1=194654&r2=194655&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=194655&r1=194654&r2=194655&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/YAMLTraits.cpp (original)<br>
+++ llvm/trunk/lib/Support/YAMLTraits.cpp Wed Nov 13 20:38:07 2013<br>
@@ -59,7 +59,7 @@ void Input::setDiagHandler(SourceMgr::Di<br>
   SrcMgr.setDiagHandler(Handler, Ctxt);<br>
 }<br>
<br>
-bool Input::outputting() {<br>
+bool Input::outputting() const {<br>
   return false;<br>
 }<br>
<br>
@@ -382,7 +382,7 @@ Output::Output(raw_ostream &yout, void *<br>
 Output::~Output() {<br>
 }<br>
<br>
-bool Output::outputting() {<br>
+bool Output::outputting() const {<br>
   return true;<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/unittests/Support/YAMLIOTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/YAMLIOTest.cpp?rev=194655&r1=194654&r2=194655&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/YAMLIOTest.cpp?rev=194655&r1=194654&r2=194655&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/unittests/Support/YAMLIOTest.cpp (original)<br>
+++ llvm/trunk/unittests/Support/YAMLIOTest.cpp Wed Nov 13 20:38:07 2013<br>
@@ -1074,6 +1074,76 @@ TEST(YAMLIO, TestTaggedDocumentsWriteAnd<br>
 }<br>
<br>
<br>
+//===----------------------------------------------------------------------===//<br>
+//  Test dyn_cast<> on IO object<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+struct DynCast {<br>
+  int value;<br>
+};<br>
+typedef std::vector<DynCast> DynCastSequence;<br>
+<br>
+LLVM_YAML_IS_SEQUENCE_VECTOR(DynCast)<br>
+<br>
+namespace llvm {<br>
+namespace yaml {<br>
+  template <><br>
+  struct MappingTraits<DynCast> {<br>
+    static void mapping(IO &io, DynCast& info) {<br>
+      // Change 10 to 13 when writing yaml.<br>
+      if (Output *output = dyn_cast<Output>(&io)) {<br>
+        (void)output;<br>
+        if (info.value == 10)<br>
+          info.value = 13;<br>
+      }<br>
+      io.mapRequired("value", info.value);<br>
+      // Change 20 to 23 when parsing yaml.<br>
+      if (Input *input = dyn_cast<Input>(&io)) {<br>
+        (void)input;<br>
+        if (info.value == 20)<br>
+          info.value = 23;<br>
+      }<br>
+    }<br>
+  };<br>
+}<br>
+}<br>
+<br>
+//<br>
+// Test writing then reading back a sequence of mappings<br>
+//<br>
+TEST(YAMLIO, TestDynCast) {<br>
+  std::string intermediate;<br>
+  {<br>
+    DynCast entry1;<br>
+    entry1.value = 10;<br>
+    DynCast entry2;<br>
+    entry2.value = 20;<br>
+    DynCast entry3;<br>
+    entry3.value = 30;<br>
+    DynCastSequence seq;<br>
+    seq.push_back(entry1);<br>
+    seq.push_back(entry2);<br>
+    seq.push_back(entry3);<br>
+<br>
+    llvm::raw_string_ostream ostr(intermediate);<br>
+    Output yout(ostr);<br>
+    yout << seq;<br>
+  }<br>
+<br>
+  {<br>
+    Input yin(intermediate);<br>
+    DynCastSequence seq2;<br>
+    yin >> seq2;<br>
+<br>
+    EXPECT_FALSE(yin.error());<br>
+    EXPECT_EQ(seq2.size(), 3UL);<br>
+    EXPECT_EQ(seq2[0].value, 13);   // Verify changed to 13.<br>
+    EXPECT_EQ(seq2[1].value, 23);   // Verify changed to 23.<br>
+    EXPECT_EQ(seq2[2].value, 30);   // Verify stays same.<br>
+  }<br>
+}<br>
+<br>
+<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 //  Test error handling<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</blockquote></div><br></body></html>