aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2011-12-20 10:42:52 +0000
committerManuel Klimek <klimek@google.com>2011-12-20 10:42:52 +0000
commit9ce6937701cd28fb2aafdd3ec950fb0e70bae8cd (patch)
tree54ed908c66011d97e46acab0f5234416f317af2a /lib/Support
parent2c777c8f865bf0e9773be1d5735bd2ae49c6790b (diff)
downloadexternal_llvm-9ce6937701cd28fb2aafdd3ec950fb0e70bae8cd.zip
external_llvm-9ce6937701cd28fb2aafdd3ec950fb0e70bae8cd.tar.gz
external_llvm-9ce6937701cd28fb2aafdd3ec950fb0e70bae8cd.tar.bz2
Pulls the implementation of skip() into JSONParser.
This is the first step towards migrating more of the parser implementation into the parser class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146971 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/JSONParser.cpp35
1 files changed, 24 insertions, 11 deletions
diff --git a/lib/Support/JSONParser.cpp b/lib/Support/JSONParser.cpp
index 36da12d..0218740 100644
--- a/lib/Support/JSONParser.cpp
+++ b/lib/Support/JSONParser.cpp
@@ -40,7 +40,30 @@ JSONValue *JSONParser::parseRoot() {
}
bool JSONParser::validate() {
- return parseRoot()->skip();
+ return skip(*parseRoot());
+}
+
+template <typename ContainerT>
+bool JSONParser::skipContainer(const ContainerT &Container) {
+ for (typename ContainerT::const_iterator I = Container.current(),
+ E = Container.end();
+ I != E; ++I) {
+ assert(*I != 0);
+ if (!skip(**I))
+ return false;
+ }
+ return !failed();
+}
+
+bool JSONParser::skip(const JSONAtom &Atom) {
+ switch(Atom.getKind()) {
+ case JSONAtom::JK_Array: return skipContainer(*cast<JSONArray>(&Atom));
+ case JSONAtom::JK_Object: return skipContainer(*cast<JSONObject>(&Atom));
+ case JSONAtom::JK_String: return true;
+ case JSONAtom::JK_KeyValuePair:
+ return skip(*cast<JSONKeyValuePair>(&Atom)->Value);
+ }
+ llvm_unreachable("Impossible enum value.");
}
// Sets the current error to:
@@ -159,16 +182,6 @@ std::string JSONParser::getErrorMessage() const {
return ErrorMessage;
}
-bool JSONAtom::skip() const {
- switch (MyKind) {
- case JK_Array: return cast<JSONArray>(this)->skip();
- case JK_Object: return cast<JSONObject>(this)->skip();
- case JK_String: return cast<JSONString>(this)->skip();
- case JK_KeyValuePair: return cast<JSONKeyValuePair>(this)->skip();
- }
- llvm_unreachable("Impossible enum value.");
-}
-
// Parses a JSONValue, assuming that the current position is at the first
// character of the value.
JSONValue *JSONParser::parseValue() {