diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Utility/JSON.cpp')
-rw-r--r-- | contrib/llvm/tools/lldb/source/Utility/JSON.cpp | 89 |
1 files changed, 64 insertions, 25 deletions
diff --git a/contrib/llvm/tools/lldb/source/Utility/JSON.cpp b/contrib/llvm/tools/lldb/source/Utility/JSON.cpp index 1e16a5a..8b96a06 100644 --- a/contrib/llvm/tools/lldb/source/Utility/JSON.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/JSON.cpp @@ -12,6 +12,7 @@ #include <limits.h> #include "lldb/Core/StreamString.h" #include "lldb/Host/StringConvert.h" +#include "llvm/Support/ErrorHandling.h" using namespace lldb_private; @@ -60,38 +61,66 @@ JSONString::Write (Stream& s) s.Printf("\"%s\"", json_string_quote_metachars(m_data).c_str()); } -JSONNumber::JSONNumber () : - JSONValue(JSONValue::Kind::Number), - m_is_integer(true), - m_data(0), - m_double(0.0) +uint64_t +JSONNumber::GetAsUnsigned() const { + switch (m_data_type) + { + case DataType::Unsigned: + return m_data.m_unsigned; + case DataType::Signed: + return (uint64_t)m_data.m_signed; + case DataType::Double: + return (uint64_t)m_data.m_double; + } + llvm_unreachable("Unhandled data type"); } -JSONNumber::JSONNumber (uint64_t i) : - JSONValue(JSONValue::Kind::Number), - m_is_integer(true), - m_data(i), - m_double(0.0) +int64_t +JSONNumber::GetAsSigned() const { + switch (m_data_type) + { + case DataType::Unsigned: + return (int64_t)m_data.m_unsigned; + case DataType::Signed: + return m_data.m_signed; + case DataType::Double: + return (int64_t)m_data.m_double; + } + llvm_unreachable("Unhandled data type"); } - -JSONNumber::JSONNumber (double d) : - JSONValue(JSONValue::Kind::Number), - m_is_integer(false), - m_data(0), - m_double(d) +double +JSONNumber::GetAsDouble() const { + switch (m_data_type) + { + case DataType::Unsigned: + return (double)m_data.m_unsigned; + case DataType::Signed: + return (double)m_data.m_signed; + case DataType::Double: + return m_data.m_double; + } + llvm_unreachable("Unhandled data type"); } void JSONNumber::Write (Stream& s) { - if (m_is_integer) - s.Printf("%" PRIu64, m_data); - else - s.Printf("%g", m_double); + switch (m_data_type) + { + case DataType::Unsigned: + s.Printf("%" PRIu64, m_data.m_unsigned); + break; + case DataType::Signed: + s.Printf("%" PRId64, m_data.m_signed); + break; + case DataType::Double: + s.Printf("%g", m_data.m_double); + break; + } } JSONTrue::JSONTrue () : @@ -392,7 +421,7 @@ JSONParser::GetToken (std::string &value) case 'E': if (exp_index != 0) { - error.Printf("error: extra expenent character found at offset %" PRIu64, start_index); + error.Printf("error: extra exponent character found at offset %" PRIu64, start_index); value = std::move(error.GetString()); return Token::Error; } @@ -617,10 +646,20 @@ JSONParser::ParseJSONValue () case JSONParser::Token::Integer: { - bool success = false; - uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success); - if (success) - return JSONValue::SP(new JSONNumber(uval)); + if (value.front() == '-') + { + bool success = false; + int64_t sval = StringConvert::ToSInt64(value.c_str(), 0, 0, &success); + if (success) + return JSONValue::SP(new JSONNumber(sval)); + } + else + { + bool success = false; + uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success); + if (success) + return JSONValue::SP(new JSONNumber(uval)); + } } break; |