diff options
Diffstat (limited to 'lldb/source/Core/StructuredData.cpp')
-rw-r--r-- | lldb/source/Core/StructuredData.cpp | 469 |
1 files changed, 202 insertions, 267 deletions
diff --git a/lldb/source/Core/StructuredData.cpp b/lldb/source/Core/StructuredData.cpp index 95bdeb518bc..6e544c1d537 100644 --- a/lldb/source/Core/StructuredData.cpp +++ b/lldb/source/Core/StructuredData.cpp @@ -1,4 +1,5 @@ -//===---------------------StructuredData.cpp ---------------------*- C++ -*-===// +//===---------------------StructuredData.cpp ---------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -10,8 +11,8 @@ #include "lldb/Core/StructuredData.h" #include <errno.h> -#include <stdlib.h> #include <inttypes.h> +#include <stdlib.h> #include "lldb/Core/StreamString.h" #include "lldb/Host/StringConvert.h" @@ -19,313 +20,247 @@ using namespace lldb_private; - //---------------------------------------------------------------------- // Functions that use a JSONParser to parse JSON into StructuredData //---------------------------------------------------------------------- -static StructuredData::ObjectSP ParseJSONValue (JSONParser &json_parser); -static StructuredData::ObjectSP ParseJSONObject (JSONParser &json_parser); -static StructuredData::ObjectSP ParseJSONArray (JSONParser &json_parser); - -static StructuredData::ObjectSP -ParseJSONObject (JSONParser &json_parser) -{ - // The "JSONParser::Token::ObjectStart" token should have already been consumed - // by the time this function is called - std::unique_ptr<StructuredData::Dictionary> dict_up(new StructuredData::Dictionary()); - - std::string value; - std::string key; - while (1) - { - JSONParser::Token token = json_parser.GetToken(value); - - if (token == JSONParser::Token::String) - { - key.swap(value); - token = json_parser.GetToken(value); - if (token == JSONParser::Token::Colon) - { - StructuredData::ObjectSP value_sp = ParseJSONValue(json_parser); - if (value_sp) - dict_up->AddItem(key, value_sp); - else - break; - } - } - else if (token == JSONParser::Token::ObjectEnd) - { - return StructuredData::ObjectSP(dict_up.release()); - } - else if (token == JSONParser::Token::Comma) - { - continue; - } - else - { - break; - } - } - return StructuredData::ObjectSP(); -} - -static StructuredData::ObjectSP -ParseJSONArray (JSONParser &json_parser) -{ - // The "JSONParser::Token::ObjectStart" token should have already been consumed - // by the time this function is called - std::unique_ptr<StructuredData::Array> array_up(new StructuredData::Array()); - - std::string value; - std::string key; - while (1) - { +static StructuredData::ObjectSP ParseJSONValue(JSONParser &json_parser); +static StructuredData::ObjectSP ParseJSONObject(JSONParser &json_parser); +static StructuredData::ObjectSP ParseJSONArray(JSONParser &json_parser); + +static StructuredData::ObjectSP ParseJSONObject(JSONParser &json_parser) { + // The "JSONParser::Token::ObjectStart" token should have already been + // consumed + // by the time this function is called + std::unique_ptr<StructuredData::Dictionary> dict_up( + new StructuredData::Dictionary()); + + std::string value; + std::string key; + while (1) { + JSONParser::Token token = json_parser.GetToken(value); + + if (token == JSONParser::Token::String) { + key.swap(value); + token = json_parser.GetToken(value); + if (token == JSONParser::Token::Colon) { StructuredData::ObjectSP value_sp = ParseJSONValue(json_parser); if (value_sp) - array_up->AddItem(value_sp); + dict_up->AddItem(key, value_sp); else - break; - - JSONParser::Token token = json_parser.GetToken(value); - if (token == JSONParser::Token::Comma) - { - continue; - } - else if (token == JSONParser::Token::ArrayEnd) - { - return StructuredData::ObjectSP(array_up.release()); - } - else - { - break; - } + break; + } + } else if (token == JSONParser::Token::ObjectEnd) { + return StructuredData::ObjectSP(dict_up.release()); + } else if (token == JSONParser::Token::Comma) { + continue; + } else { + break; } - return StructuredData::ObjectSP(); + } + return StructuredData::ObjectSP(); } -static StructuredData::ObjectSP -ParseJSONValue (JSONParser &json_parser) -{ - std::string value; - const JSONParser::Token token = json_parser.GetToken(value); - switch (token) - { - case JSONParser::Token::ObjectStart: - return ParseJSONObject(json_parser); - - case JSONParser::Token::ArrayStart: - return ParseJSONArray(json_parser); - - case JSONParser::Token::Integer: - { - bool success = false; - uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success); - if (success) - return StructuredData::ObjectSP(new StructuredData::Integer(uval)); - } - break; - - case JSONParser::Token::Float: - { - bool success = false; - double val = StringConvert::ToDouble(value.c_str(), 0.0, &success); - if (success) - return StructuredData::ObjectSP(new StructuredData::Float(val)); - } - break; - - case JSONParser::Token::String: - return StructuredData::ObjectSP(new StructuredData::String(value)); - - case JSONParser::Token::True: - case JSONParser::Token::False: - return StructuredData::ObjectSP(new StructuredData::Boolean(token == JSONParser::Token::True)); - - case JSONParser::Token::Null: - return StructuredData::ObjectSP(new StructuredData::Null()); - - default: - break; +static StructuredData::ObjectSP ParseJSONArray(JSONParser &json_parser) { + // The "JSONParser::Token::ObjectStart" token should have already been + // consumed + // by the time this function is called + std::unique_ptr<StructuredData::Array> array_up(new StructuredData::Array()); + + std::string value; + std::string key; + while (1) { + StructuredData::ObjectSP value_sp = ParseJSONValue(json_parser); + if (value_sp) + array_up->AddItem(value_sp); + else + break; + + JSONParser::Token token = json_parser.GetToken(value); + if (token == JSONParser::Token::Comma) { + continue; + } else if (token == JSONParser::Token::ArrayEnd) { + return StructuredData::ObjectSP(array_up.release()); + } else { + break; } - return StructuredData::ObjectSP(); + } + return StructuredData::ObjectSP(); +} +static StructuredData::ObjectSP ParseJSONValue(JSONParser &json_parser) { + std::string value; + const JSONParser::Token token = json_parser.GetToken(value); + switch (token) { + case JSONParser::Token::ObjectStart: + return ParseJSONObject(json_parser); + + case JSONParser::Token::ArrayStart: + return ParseJSONArray(json_parser); + + case JSONParser::Token::Integer: { + bool success = false; + uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success); + if (success) + return StructuredData::ObjectSP(new StructuredData::Integer(uval)); + } break; + + case JSONParser::Token::Float: { + bool success = false; + double val = StringConvert::ToDouble(value.c_str(), 0.0, &success); + if (success) + return StructuredData::ObjectSP(new StructuredData::Float(val)); + } break; + + case JSONParser::Token::String: + return StructuredData::ObjectSP(new StructuredData::String(value)); + + case JSONParser::Token::True: + case JSONParser::Token::False: + return StructuredData::ObjectSP( + new StructuredData::Boolean(token == JSONParser::Token::True)); + + case JSONParser::Token::Null: + return StructuredData::ObjectSP(new StructuredData::Null()); + + default: + break; + } + return StructuredData::ObjectSP(); } -StructuredData::ObjectSP -StructuredData::ParseJSON (std::string json_text) -{ - JSONParser json_parser(json_text.c_str()); - StructuredData::ObjectSP object_sp = ParseJSONValue(json_parser); - return object_sp; +StructuredData::ObjectSP StructuredData::ParseJSON(std::string json_text) { + JSONParser json_parser(json_text.c_str()); + StructuredData::ObjectSP object_sp = ParseJSONValue(json_parser); + return object_sp; } StructuredData::ObjectSP -StructuredData::Object::GetObjectForDotSeparatedPath (llvm::StringRef path) -{ - if (this->GetType() == Type::eTypeDictionary) - { - std::pair<llvm::StringRef, llvm::StringRef> match = path.split('.'); - std::string key = match.first.str(); - ObjectSP value = this->GetAsDictionary()->GetValueForKey (key.c_str()); - if (value.get()) - { - // Do we have additional words to descend? If not, return the - // value we're at right now. - if (match.second.empty()) - { - return value; - } - else - { - return value->GetObjectForDotSeparatedPath (match.second); - } - } - return ObjectSP(); +StructuredData::Object::GetObjectForDotSeparatedPath(llvm::StringRef path) { + if (this->GetType() == Type::eTypeDictionary) { + std::pair<llvm::StringRef, llvm::StringRef> match = path.split('.'); + std::string key = match.first.str(); + ObjectSP value = this->GetAsDictionary()->GetValueForKey(key.c_str()); + if (value.get()) { + // Do we have additional words to descend? If not, return the + // value we're at right now. + if (match.second.empty()) { + return value; + } else { + return value->GetObjectForDotSeparatedPath(match.second); + } } + return ObjectSP(); + } - if (this->GetType() == Type::eTypeArray) - { - std::pair<llvm::StringRef, llvm::StringRef> match = path.split('['); - if (match.second.size() == 0) - { - return this->shared_from_this(); - } - errno = 0; - uint64_t val = strtoul (match.second.str().c_str(), NULL, 10); - if (errno == 0) - { - return this->GetAsArray()->GetItemAtIndex(val); - } - return ObjectSP(); + if (this->GetType() == Type::eTypeArray) { + std::pair<llvm::StringRef, llvm::StringRef> match = path.split('['); + if (match.second.size() == 0) { + return this->shared_from_this(); + } + errno = 0; + uint64_t val = strtoul(match.second.str().c_str(), NULL, 10); + if (errno == 0) { + return this->GetAsArray()->GetItemAtIndex(val); } + return ObjectSP(); + } - return this->shared_from_this(); + return this->shared_from_this(); } -void -StructuredData::Object::DumpToStdout(bool pretty_print) const -{ - StreamString stream; - Dump(stream, pretty_print); - printf("%s\n", stream.GetString().c_str()); +void StructuredData::Object::DumpToStdout(bool pretty_print) const { + StreamString stream; + Dump(stream, pretty_print); + printf("%s\n", stream.GetString().c_str()); } -void -StructuredData::Array::Dump(Stream &s, bool pretty_print) const -{ - bool first = true; - s << "["; - if (pretty_print) - { +void StructuredData::Array::Dump(Stream &s, bool pretty_print) const { + bool first = true; + s << "["; + if (pretty_print) { + s << "\n"; + s.IndentMore(); + } + for (const auto &item_sp : m_items) { + if (first) { + first = false; + } else { + s << ","; + if (pretty_print) s << "\n"; - s.IndentMore(); - } - for (const auto &item_sp : m_items) - { - if (first) - { - first = false; - } - else - { - s << ","; - if (pretty_print) - s << "\n"; - } - - if (pretty_print) - s.Indent(); - item_sp->Dump(s, pretty_print); } + if (pretty_print) - { - s.IndentLess(); - s.EOL(); - s.Indent(); - } - s << "]"; + s.Indent(); + item_sp->Dump(s, pretty_print); + } + if (pretty_print) { + s.IndentLess(); + s.EOL(); + s.Indent(); + } + s << "]"; } -void -StructuredData::Integer::Dump (Stream &s, bool pretty_print) const -{ - s.Printf ("%" PRIu64, m_value); +void StructuredData::Integer::Dump(Stream &s, bool pretty_print) const { + s.Printf("%" PRIu64, m_value); } - -void -StructuredData::Float::Dump (Stream &s, bool pretty_print) const -{ - s.Printf ("%lg", m_value); +void StructuredData::Float::Dump(Stream &s, bool pretty_print) const { + s.Printf("%lg", m_value); } -void -StructuredData::Boolean::Dump (Stream &s, bool pretty_print) const -{ - if (m_value == true) - s.PutCString ("true"); - else - s.PutCString ("false"); +void StructuredData::Boolean::Dump(Stream &s, bool pretty_print) const { + if (m_value == true) + s.PutCString("true"); + else + s.PutCString("false"); } - -void -StructuredData::String::Dump (Stream &s, bool pretty_print) const -{ - std::string quoted; - const size_t strsize = m_value.size(); - for (size_t i = 0; i < strsize ; ++i) - { - char ch = m_value[i]; - if (ch == '"') - quoted.push_back ('\\'); - quoted.push_back (ch); - } - s.Printf ("\"%s\"", quoted.c_str()); +void StructuredData::String::Dump(Stream &s, bool pretty_print) const { + std::string quoted; + const size_t strsize = m_value.size(); + for (size_t i = 0; i < strsize; ++i) { + char ch = m_value[i]; + if (ch == '"') + quoted.push_back('\\'); + quoted.push_back(ch); + } + s.Printf("\"%s\"", quoted.c_str()); } -void -StructuredData::Dictionary::Dump (Stream &s, bool pretty_print) const -{ - bool first = true; - s << "{"; - if (pretty_print) - { +void StructuredData::Dictionary::Dump(Stream &s, bool pretty_print) const { + bool first = true; + s << "{"; + if (pretty_print) { + s << "\n"; + s.IndentMore(); + } + for (const auto &pair : m_dict) { + if (first) + first = false; + else { + s << ","; + if (pretty_print) s << "\n"; - s.IndentMore(); - } - for (const auto &pair : m_dict) - { - if (first) - first = false; - else - { - s << ","; - if (pretty_print) - s << "\n"; - } - if (pretty_print) - s.Indent(); - s << "\"" << pair.first.AsCString() << "\" : "; - pair.second->Dump(s, pretty_print); } if (pretty_print) - { - s.IndentLess(); - s.EOL(); - s.Indent(); - } - s << "}"; + s.Indent(); + s << "\"" << pair.first.AsCString() << "\" : "; + pair.second->Dump(s, pretty_print); + } + if (pretty_print) { + s.IndentLess(); + s.EOL(); + s.Indent(); + } + s << "}"; } -void -StructuredData::Null::Dump (Stream &s, bool pretty_print) const -{ - s << "null"; +void StructuredData::Null::Dump(Stream &s, bool pretty_print) const { + s << "null"; } -void -StructuredData::Generic::Dump(Stream &s, bool pretty_print) const -{ - s << "0x" << m_object; +void StructuredData::Generic::Dump(Stream &s, bool pretty_print) const { + s << "0x" << m_object; } |