<div dir="ltr">Hi Michael,<div><br></div><div>This has some std::move calls in it. Does they need to be conditionalized on LLVM_HAS_RVALUE_REFERENCES? Currently this doesn't compile on C++03.</div><div><br></div>
<div>- Lang.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Oct 18, 2013 at 3:38 PM, Michael J. Spencer <span dir="ltr"><<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mspencer<br>
Date: Fri Oct 18 17:38:04 2013<br>
New Revision: 193004<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=193004&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=193004&view=rev</a><br>
Log:<br>
[Support][YAML] Add support for accessing tags and tag handle substitution.<br>
<br>
Modified:<br>
llvm/trunk/include/llvm/Support/YAMLParser.h<br>
llvm/trunk/lib/Support/YAMLParser.cpp<br>
llvm/trunk/test/YAMLParser/spec-02-24.data<br>
llvm/trunk/test/YAMLParser/spec-07-04.data<br>
llvm/trunk/test/YAMLParser/yaml.data<br>
llvm/trunk/utils/yaml-bench/YAMLBench.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Support/YAMLParser.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLParser.h?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLParser.h?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Support/YAMLParser.h (original)<br>
+++ llvm/trunk/include/llvm/Support/YAMLParser.h Fri Oct 18 17:38:04 2013<br>
@@ -43,6 +43,8 @@<br>
#include "llvm/ADT/StringRef.h"<br>
#include "llvm/Support/Allocator.h"<br>
#include "llvm/Support/SMLoc.h"<br>
+<br>
+#include <map><br>
#include <limits><br>
#include <utility><br>
<br>
@@ -99,9 +101,6 @@ private:<br>
OwningPtr<Document> CurrentDoc;<br>
<br>
friend class Document;<br>
-<br>
- /// @brief Validate a %YAML x.x directive.<br>
- void handleYAMLDirective(const Token &);<br>
};<br>
<br>
/// @brief Abstract base class for all Nodes.<br>
@@ -116,12 +115,21 @@ public:<br>
NK_Alias<br>
};<br>
<br>
- Node(unsigned int Type, OwningPtr<Document>&, StringRef Anchor);<br>
+ Node(unsigned int Type, OwningPtr<Document> &, StringRef Anchor,<br>
+ StringRef Tag);<br>
<br>
/// @brief Get the value of the anchor attached to this node. If it does not<br>
/// have one, getAnchor().size() will be 0.<br>
StringRef getAnchor() const { return Anchor; }<br>
<br>
+ /// \brief Get the tag as it was written in the document. This does not<br>
+ /// perform tag resolution.<br>
+ StringRef getRawTag() const { return Tag; }<br>
+<br>
+ /// \brief Get the verbatium tag for a given Node. This performs tag resoluton<br>
+ /// and substitution.<br>
+ std::string getVerbatimTag() const;<br>
+<br>
SMRange getSourceRange() const { return SourceRange; }<br>
void setSourceRange(SMRange SR) { SourceRange = SR; }<br>
<br>
@@ -158,6 +166,8 @@ protected:<br>
private:<br>
unsigned int TypeID;<br>
StringRef Anchor;<br>
+ /// \brief The tag as typed in the document.<br>
+ StringRef Tag;<br>
};<br>
<br>
/// @brief A null value.<br>
@@ -166,7 +176,8 @@ private:<br>
/// !!null null<br>
class NullNode : public Node {<br>
public:<br>
- NullNode(OwningPtr<Document> &D) : Node(NK_Null, D, StringRef()) {}<br>
+ NullNode(OwningPtr<Document> &D)<br>
+ : Node(NK_Null, D, StringRef(), StringRef()) {}<br>
<br>
static inline bool classof(const Node *N) {<br>
return N->getType() == NK_Null;<br>
@@ -180,9 +191,9 @@ public:<br>
/// Adena<br>
class ScalarNode : public Node {<br>
public:<br>
- ScalarNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Val)<br>
- : Node(NK_Scalar, D, Anchor)<br>
- , Value(Val) {<br>
+ ScalarNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+ StringRef Val)<br>
+ : Node(NK_Scalar, D, Anchor, Tag), Value(Val) {<br>
SMLoc Start = SMLoc::getFromPointer(Val.begin());<br>
SMLoc End = SMLoc::getFromPointer(Val.end());<br>
SourceRange = SMRange(Start, End);<br>
@@ -222,7 +233,7 @@ private:<br>
class KeyValueNode : public Node {<br>
public:<br>
KeyValueNode(OwningPtr<Document> &D)<br>
- : Node(NK_KeyValue, D, StringRef())<br>
+ : Node(NK_KeyValue, D, StringRef(), StringRef())<br>
, Key(0)<br>
, Value(0)<br>
{}<br>
@@ -338,13 +349,10 @@ public:<br>
MT_Inline ///< An inline mapping node is used for "[key: value]".<br>
};<br>
<br>
- MappingNode(OwningPtr<Document> &D, StringRef Anchor, MappingType MT)<br>
- : Node(NK_Mapping, D, Anchor)<br>
- , Type(MT)<br>
- , IsAtBeginning(true)<br>
- , IsAtEnd(false)<br>
- , CurrentEntry(0)<br>
- {}<br>
+ MappingNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+ MappingType MT)<br>
+ : Node(NK_Mapping, D, Anchor, Tag), Type(MT), IsAtBeginning(true),<br>
+ IsAtEnd(false), CurrentEntry(0) {}<br>
<br>
friend class basic_collection_iterator<MappingNode, KeyValueNode>;<br>
typedef basic_collection_iterator<MappingNode, KeyValueNode> iterator;<br>
@@ -397,14 +405,12 @@ public:<br>
ST_Indentless<br>
};<br>
<br>
- SequenceNode(OwningPtr<Document> &D, StringRef Anchor, SequenceType ST)<br>
- : Node(NK_Sequence, D, Anchor)<br>
- , SeqType(ST)<br>
- , IsAtBeginning(true)<br>
- , IsAtEnd(false)<br>
- , WasPreviousTokenFlowEntry(true) // Start with an imaginary ','.<br>
- , CurrentEntry(0)<br>
- {}<br>
+ SequenceNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+ SequenceType ST)<br>
+ : Node(NK_Sequence, D, Anchor, Tag), SeqType(ST), IsAtBeginning(true),<br>
+ IsAtEnd(false),<br>
+ WasPreviousTokenFlowEntry(true), // Start with an imaginary ','.<br>
+ CurrentEntry(0) {}<br>
<br>
friend class basic_collection_iterator<SequenceNode, Node>;<br>
typedef basic_collection_iterator<SequenceNode, Node> iterator;<br>
@@ -442,7 +448,7 @@ private:<br>
class AliasNode : public Node {<br>
public:<br>
AliasNode(OwningPtr<Document> &D, StringRef Val)<br>
- : Node(NK_Alias, D, StringRef()), Name(Val) {}<br>
+ : Node(NK_Alias, D, StringRef(), StringRef()), Name(Val) {}<br>
<br>
StringRef getName() const { return Name; }<br>
Node *getTarget();<br>
@@ -475,6 +481,10 @@ public:<br>
return Root = parseBlockNode();<br>
}<br>
<br>
+ const std::map<StringRef, StringRef> &getTagMap() const {<br>
+ return TagMap;<br>
+ }<br>
+<br>
private:<br>
friend class Node;<br>
friend class document_iterator;<br>
@@ -490,18 +500,23 @@ private:<br>
/// document.<br>
Node *Root;<br>
<br>
+ /// \brief Maps tag prefixes to their expansion.<br>
+ std::map<StringRef, StringRef> TagMap;<br>
+<br>
Token &peekNext();<br>
Token getNext();<br>
void setError(const Twine &Message, Token &Location) const;<br>
bool failed() const;<br>
<br>
- void handleTagDirective(const Token &Tag) {<br>
- // TODO: Track tags.<br>
- }<br>
-<br>
/// @brief Parse %BLAH directives and return true if any were encountered.<br>
bool parseDirectives();<br>
<br>
+ /// \brief Parse %YAML<br>
+ void parseYAMLDirective();<br>
+<br>
+ /// \brief Parse %TAG<br>
+ void parseTAGDirective();<br>
+<br>
/// @brief Consume the next token and error if it is not \a TK.<br>
bool expectToken(int TK);<br>
};<br>
<br>
Modified: llvm/trunk/lib/Support/YAMLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLParser.cpp?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLParser.cpp?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/YAMLParser.cpp (original)<br>
+++ llvm/trunk/lib/Support/YAMLParser.cpp Fri Oct 18 17:38:04 2013<br>
@@ -1070,14 +1070,22 @@ bool Scanner::scanDirective() {<br>
Current = skip_while(&Scanner::skip_ns_char, Current);<br>
StringRef Name(NameStart, Current - NameStart);<br>
Current = skip_while(&Scanner::skip_s_white, Current);<br>
-<br>
+<br>
+ Token T;<br>
if (Name == "YAML") {<br>
Current = skip_while(&Scanner::skip_ns_char, Current);<br>
- Token T;<br>
T.Kind = Token::TK_VersionDirective;<br>
T.Range = StringRef(Start, Current - Start);<br>
TokenQueue.push_back(T);<br>
return true;<br>
+ } else if(Name == "TAG") {<br>
+ Current = skip_while(&Scanner::skip_ns_char, Current);<br>
+ Current = skip_while(&Scanner::skip_s_white, Current);<br>
+ Current = skip_while(&Scanner::skip_ns_char, Current);<br>
+ T.Kind = Token::TK_TagDirective;<br>
+ T.Range = StringRef(Start, Current - Start);<br>
+ TokenQueue.push_back(T);<br>
+ return true;<br>
}<br>
return false;<br>
}<br>
@@ -1564,10 +1572,6 @@ void Stream::printError(Node *N, const T<br>
, Ranges);<br>
}<br>
<br>
-void Stream::handleYAMLDirective(const Token &t) {<br>
- // TODO: Ensure version is 1.x.<br>
-}<br>
-<br>
document_iterator Stream::begin() {<br>
if (CurrentDoc)<br>
report_fatal_error("Can only iterate over the stream once");<br>
@@ -1588,14 +1592,59 @@ void Stream::skip() {<br>
i->skip();<br>
}<br>
<br>
-Node::Node(unsigned int Type, OwningPtr<Document> &D, StringRef A)<br>
+Node::Node(unsigned int Type, OwningPtr<Document> &D, StringRef A, StringRef T)<br>
: Doc(D)<br>
, TypeID(Type)<br>
- , Anchor(A) {<br>
+ , Anchor(A)<br>
+ , Tag(T) {<br>
SMLoc Start = SMLoc::getFromPointer(peekNext().Range.begin());<br>
SourceRange = SMRange(Start, Start);<br>
}<br>
<br>
+std::string Node::getVerbatimTag() const {<br>
+ StringRef Raw = getRawTag();<br>
+ if (!Raw.empty() && Raw != "!") {<br>
+ std::string Ret;<br>
+ if (Raw.find_last_of('!') == 0) {<br>
+ Ret = Doc->getTagMap().find("!")->second;<br>
+ Ret += Raw.substr(1);<br>
+ return std::move(Ret);<br>
+ } else if (Raw.startswith("!!")) {<br>
+ Ret = Doc->getTagMap().find("!!")->second;<br>
+ Ret += Raw.substr(2);<br>
+ return std::move(Ret);<br>
+ } else {<br>
+ StringRef TagHandle = Raw.substr(0, Raw.find_last_of('!') + 1);<br>
+ std::map<StringRef, StringRef>::const_iterator It =<br>
+ Doc->getTagMap().find(TagHandle);<br>
+ if (It != Doc->getTagMap().end())<br>
+ Ret = It->second;<br>
+ else {<br>
+ Token T;<br>
+ T.Kind = Token::TK_Tag;<br>
+ T.Range = TagHandle;<br>
+ setError(Twine("Unknown tag handle ") + TagHandle, T);<br>
+ }<br>
+ Ret += Raw.substr(Raw.find_last_of('!') + 1);<br>
+ return std::move(Ret);<br>
+ }<br>
+ }<br>
+<br>
+ switch (getType()) {<br>
+ case NK_Null:<br>
+ return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:null";<br>
+ case NK_Scalar:<br>
+ // TODO: Tag resolution.<br>
+ return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:str";<br>
+ case NK_Mapping:<br>
+ return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:map";<br>
+ case NK_Sequence:<br>
+ return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:seq";<br>
+ }<br>
+<br>
+ return "";<br>
+}<br>
+<br>
Token &Node::peekNext() {<br>
return Doc->peekNext();<br>
}<br>
@@ -1999,6 +2048,10 @@ void SequenceNode::increment() {<br>
}<br>
<br>
Document::Document(Stream &S) : stream(S), Root(0) {<br>
+ // Tag maps starts with two default mappings.<br>
+ TagMap["!"] = "!";<br>
+ TagMap["!!"] = "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:";<br>
+<br>
if (parseDirectives())<br>
expectToken(Token::TK_DocumentStart);<br>
Token &T = peekNext();<br>
@@ -2042,6 +2095,7 @@ Node *Document::parseBlockNode() {<br>
Token T = peekNext();<br>
// Handle properties.<br>
Token AnchorInfo;<br>
+ Token TagInfo;<br>
parse_property:<br>
switch (T.Kind) {<br>
case Token::TK_Alias:<br>
@@ -2056,7 +2110,11 @@ parse_property:<br>
T = peekNext();<br>
goto parse_property;<br>
case Token::TK_Tag:<br>
- getNext(); // Skip TK_Tag.<br>
+ if (TagInfo.Kind == Token::TK_Tag) {<br>
+ setError("Already encountered a tag for this node!", T);<br>
+ return 0;<br>
+ }<br>
+ TagInfo = getNext(); // Consume TK_Tag.<br>
T = peekNext();<br>
goto parse_property;<br>
default:<br>
@@ -2070,42 +2128,49 @@ parse_property:<br>
// Don't eat the TK_BlockEntry, SequenceNode needs it.<br>
return new (NodeAllocator) SequenceNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, SequenceNode::ST_Indentless);<br>
case Token::TK_BlockSequenceStart:<br>
getNext();<br>
return new (NodeAllocator)<br>
SequenceNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, SequenceNode::ST_Block);<br>
case Token::TK_BlockMappingStart:<br>
getNext();<br>
return new (NodeAllocator)<br>
MappingNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, MappingNode::MT_Block);<br>
case Token::TK_FlowSequenceStart:<br>
getNext();<br>
return new (NodeAllocator)<br>
SequenceNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, SequenceNode::ST_Flow);<br>
case Token::TK_FlowMappingStart:<br>
getNext();<br>
return new (NodeAllocator)<br>
MappingNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, MappingNode::MT_Flow);<br>
case Token::TK_Scalar:<br>
getNext();<br>
return new (NodeAllocator)<br>
ScalarNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, T.Range);<br>
case Token::TK_Key:<br>
// Don't eat the TK_Key, KeyValueNode expects it.<br>
return new (NodeAllocator)<br>
MappingNode( stream.CurrentDoc<br>
, AnchorInfo.Range.substr(1)<br>
+ , TagInfo.Range<br>
, MappingNode::MT_Inline);<br>
case Token::TK_DocumentStart:<br>
case Token::TK_DocumentEnd:<br>
@@ -2126,10 +2191,10 @@ bool Document::parseDirectives() {<br>
while (true) {<br>
Token T = peekNext();<br>
if (T.Kind == Token::TK_TagDirective) {<br>
- handleTagDirective(getNext());<br>
+ parseTAGDirective();<br>
isDirective = true;<br>
} else if (T.Kind == Token::TK_VersionDirective) {<br>
- stream.handleYAMLDirective(getNext());<br>
+ parseYAMLDirective();<br>
isDirective = true;<br>
} else<br>
break;<br>
@@ -2137,6 +2202,21 @@ bool Document::parseDirectives() {<br>
return isDirective;<br>
}<br>
<br>
+void Document::parseYAMLDirective() {<br>
+ getNext(); // Eat %YAML <version><br>
+}<br>
+<br>
+void Document::parseTAGDirective() {<br>
+ Token Tag = getNext(); // %TAG <handle> <prefix><br>
+ StringRef T = Tag.Range;<br>
+ // Strip %TAG<br>
+ T = T.substr(T.find_first_of(" \t")).ltrim(" \t");<br>
+ std::size_t HandleEnd = T.find_first_of(" \t");<br>
+ StringRef TagHandle = T.substr(0, HandleEnd);<br>
+ StringRef TagPrefix = T.substr(HandleEnd).ltrim(" \t");<br>
+ TagMap[TagHandle] = TagPrefix;<br>
+}<br>
+<br>
bool Document::expectToken(int TK) {<br>
Token T = getNext();<br>
if (T.Kind != TK) {<br>
<br>
Modified: llvm/trunk/test/YAMLParser/spec-02-24.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-02-24.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-02-24.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/YAMLParser/spec-02-24.data (original)<br>
+++ llvm/trunk/test/YAMLParser/spec-02-24.data Fri Oct 18 17:38:04 2013<br>
@@ -1,4 +1,4 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
%TAG ! tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:<br>
--- !shape<br>
@@ -14,3 +14,8 @@<br>
start: *ORIGIN<br>
color: 0xFFEEBB<br>
text: Pretty vector drawing.<br>
+<br>
+#CHECK: !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:shape><br>
+#CHECK: !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:circle><br>
+#CHECK: !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:line><br>
+#CHECK: !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:label><br>
<br>
Modified: llvm/trunk/test/YAMLParser/spec-07-04.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-07-04.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-07-04.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/YAMLParser/spec-07-04.data (original)<br>
+++ llvm/trunk/test/YAMLParser/spec-07-04.data Fri Oct 18 17:38:04 2013<br>
@@ -1,5 +1,7 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
%TAG !yaml! tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:<br>
---<br>
!yaml!str "foo"<br>
+<br>
+#CHECK: !!str "foo"<br>
<br>
Modified: llvm/trunk/test/YAMLParser/yaml.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/yaml.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/yaml.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/YAMLParser/yaml.data (original)<br>
+++ llvm/trunk/test/YAMLParser/yaml.data Fri Oct 18 17:38:04 2013<br>
@@ -1,5 +1,11 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
- !!yaml '!'<br>
- !!yaml '&'<br>
- !!yaml '*'<br>
+<br>
+# CHECK: !!seq [<br>
+# CHECK: !!yaml "!",<br>
+# CHECK: !!yaml "&",<br>
+# CHECK: !!yaml "*",<br>
+# CHECK: ]<br>
<br>
Modified: llvm/trunk/utils/yaml-bench/YAMLBench.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/yaml-bench/YAMLBench.cpp?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/yaml-bench/YAMLBench.cpp?rev=193004&r1=193003&r2=193004&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/yaml-bench/YAMLBench.cpp (original)<br>
+++ llvm/trunk/utils/yaml-bench/YAMLBench.cpp Fri Oct 18 17:38:04 2013<br>
@@ -63,6 +63,20 @@ static raw_ostream &operator <<(raw_ostr<br>
return os;<br>
}<br>
<br>
+/// \brief Pretty print a tag by replacing tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002: with !!.<br>
+static std::string prettyTag(yaml::Node *N) {<br>
+ std::string Tag = N->getVerbatimTag();<br>
+ if (StringRef(Tag).startswith("tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:")) {<br>
+ std::string Ret = "!!";<br>
+ Ret += StringRef(Tag).substr(18);<br>
+ return std::move(Ret);<br>
+ }<br>
+ std::string Ret = "!<";<br>
+ Ret += Tag;<br>
+ Ret += ">";<br>
+ return Ret;<br>
+}<br>
+<br>
static void dumpNode( yaml::Node *n<br>
, unsigned Indent = 0<br>
, bool SuppressFirstIndent = false) {<br>
@@ -76,9 +90,9 @@ static void dumpNode( yaml::Node *n<br>
if (yaml::ScalarNode *sn = dyn_cast<yaml::ScalarNode>(n)) {<br>
SmallString<32> Storage;<br>
StringRef Val = sn->getValue(Storage);<br>
- outs() << "!!str \"" << yaml::escape(Val) << "\"";<br>
+ outs() << prettyTag(n) << " \"" << yaml::escape(Val) << "\"";<br>
} else if (yaml::SequenceNode *sn = dyn_cast<yaml::SequenceNode>(n)) {<br>
- outs() << "!!seq [\n";<br>
+ outs() << prettyTag(n) << " [\n";<br>
++Indent;<br>
for (yaml::SequenceNode::iterator i = sn->begin(), e = sn->end();<br>
i != e; ++i) {<br>
@@ -88,7 +102,7 @@ static void dumpNode( yaml::Node *n<br>
--Indent;<br>
outs() << indent(Indent) << "]";<br>
} else if (yaml::MappingNode *mn = dyn_cast<yaml::MappingNode>(n)) {<br>
- outs() << "!!map {\n";<br>
+ outs() << prettyTag(n) << " {\n";<br>
++Indent;<br>
for (yaml::MappingNode::iterator i = mn->begin(), e = mn->end();<br>
i != e; ++i) {<br>
@@ -104,7 +118,7 @@ static void dumpNode( yaml::Node *n<br>
} else if (yaml::AliasNode *an = dyn_cast<yaml::AliasNode>(n)){<br>
outs() << "*" << an->getName();<br>
} else if (dyn_cast<yaml::NullNode>(n)) {<br>
- outs() << "!!null null";<br>
+ outs() << prettyTag(n) << " null";<br>
}<br>
}<br>
<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>