[llvm] r194655 - Add dyn_cast<> support to YAML I/O's IO class
Nick Kledzik
kledzik at apple.com
Wed Nov 13 19:41:51 PST 2013
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.
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.
-Nick
On Nov 13, 2013, at 7:30 PM, Sean Silva <silvas at purdue.edu> wrote:
> 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.
>
> -- Sean Silva
>
>
> On Wed, Nov 13, 2013 at 9:38 PM, Nick Kledzik <kledzik at apple.com> wrote:
> Author: kledzik
> Date: Wed Nov 13 20:38:07 2013
> New Revision: 194655
>
> URL: http://llvm.org/viewvc/llvm-project?rev=194655&view=rev
> Log:
> Add dyn_cast<> support to YAML I/O's IO class
>
> Modified:
> llvm/trunk/include/llvm/Support/YAMLTraits.h
> llvm/trunk/lib/Support/YAMLTraits.cpp
> llvm/trunk/unittests/Support/YAMLIOTest.cpp
>
> Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=194655&r1=194654&r2=194655&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)
> +++ llvm/trunk/include/llvm/Support/YAMLTraits.h Wed Nov 13 20:38:07 2013
> @@ -18,6 +18,7 @@
> #include "llvm/ADT/StringRef.h"
> #include "llvm/ADT/StringSwitch.h"
> #include "llvm/ADT/Twine.h"
> +#include "llvm/Support/Casting.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/SourceMgr.h"
> #include "llvm/Support/YAMLParser.h"
> @@ -317,7 +318,7 @@ public:
> IO(void *Ctxt=NULL);
> virtual ~IO();
>
> - virtual bool outputting() = 0;
> + virtual bool outputting() const = 0;
>
> virtual unsigned beginSequence() = 0;
> virtual bool preflightElement(unsigned, void *&) = 0;
> @@ -694,8 +695,10 @@ public:
> // To set alternate error reporting.
> void setDiagHandler(llvm::SourceMgr::DiagHandlerTy Handler, void *Ctxt = 0);
>
> + static bool classof(const IO *io) { return !io->outputting(); }
> +
> private:
> - virtual bool outputting();
> + virtual bool outputting() const;
> virtual bool mapTag(StringRef, bool);
> virtual void beginMapping();
> virtual void endMapping();
> @@ -819,7 +822,9 @@ public:
> Output(llvm::raw_ostream &, void *Ctxt=NULL);
> virtual ~Output();
>
> - virtual bool outputting();
> + static bool classof(const IO *io) { return io->outputting(); }
> +
> + virtual bool outputting() const;
> virtual bool mapTag(StringRef, bool);
> virtual void beginMapping();
> virtual void endMapping();
>
> Modified: llvm/trunk/lib/Support/YAMLTraits.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLTraits.cpp?rev=194655&r1=194654&r2=194655&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/YAMLTraits.cpp (original)
> +++ llvm/trunk/lib/Support/YAMLTraits.cpp Wed Nov 13 20:38:07 2013
> @@ -59,7 +59,7 @@ void Input::setDiagHandler(SourceMgr::Di
> SrcMgr.setDiagHandler(Handler, Ctxt);
> }
>
> -bool Input::outputting() {
> +bool Input::outputting() const {
> return false;
> }
>
> @@ -382,7 +382,7 @@ Output::Output(raw_ostream &yout, void *
> Output::~Output() {
> }
>
> -bool Output::outputting() {
> +bool Output::outputting() const {
> return true;
> }
>
>
> Modified: llvm/trunk/unittests/Support/YAMLIOTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/YAMLIOTest.cpp?rev=194655&r1=194654&r2=194655&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/YAMLIOTest.cpp (original)
> +++ llvm/trunk/unittests/Support/YAMLIOTest.cpp Wed Nov 13 20:38:07 2013
> @@ -1074,6 +1074,76 @@ TEST(YAMLIO, TestTaggedDocumentsWriteAnd
> }
>
>
> +//===----------------------------------------------------------------------===//
> +// Test dyn_cast<> on IO object
> +//===----------------------------------------------------------------------===//
> +
> +struct DynCast {
> + int value;
> +};
> +typedef std::vector<DynCast> DynCastSequence;
> +
> +LLVM_YAML_IS_SEQUENCE_VECTOR(DynCast)
> +
> +namespace llvm {
> +namespace yaml {
> + template <>
> + struct MappingTraits<DynCast> {
> + static void mapping(IO &io, DynCast& info) {
> + // Change 10 to 13 when writing yaml.
> + if (Output *output = dyn_cast<Output>(&io)) {
> + (void)output;
> + if (info.value == 10)
> + info.value = 13;
> + }
> + io.mapRequired("value", info.value);
> + // Change 20 to 23 when parsing yaml.
> + if (Input *input = dyn_cast<Input>(&io)) {
> + (void)input;
> + if (info.value == 20)
> + info.value = 23;
> + }
> + }
> + };
> +}
> +}
> +
> +//
> +// Test writing then reading back a sequence of mappings
> +//
> +TEST(YAMLIO, TestDynCast) {
> + std::string intermediate;
> + {
> + DynCast entry1;
> + entry1.value = 10;
> + DynCast entry2;
> + entry2.value = 20;
> + DynCast entry3;
> + entry3.value = 30;
> + DynCastSequence seq;
> + seq.push_back(entry1);
> + seq.push_back(entry2);
> + seq.push_back(entry3);
> +
> + llvm::raw_string_ostream ostr(intermediate);
> + Output yout(ostr);
> + yout << seq;
> + }
> +
> + {
> + Input yin(intermediate);
> + DynCastSequence seq2;
> + yin >> seq2;
> +
> + EXPECT_FALSE(yin.error());
> + EXPECT_EQ(seq2.size(), 3UL);
> + EXPECT_EQ(seq2[0].value, 13); // Verify changed to 13.
> + EXPECT_EQ(seq2[1].value, 23); // Verify changed to 23.
> + EXPECT_EQ(seq2[2].value, 30); // Verify stays same.
> + }
> +}
> +
> +
>
> //===----------------------------------------------------------------------===//
> // Test error handling
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131113/1446948e/attachment.html>
More information about the llvm-commits
mailing list