diff --git a/llvm/lib/Support/JSONParser.cpp b/llvm/lib/Support/JSONParser.cpp
index 36da12d..0218740 100644
--- a/llvm/lib/Support/JSONParser.cpp
+++ b/llvm/lib/Support/JSONParser.cpp
@@ -40,7 +40,30 @@
 }
 
 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 @@
   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() {
