aboutsummaryrefslogtreecommitdiff
path: root/source/Utility/JSON.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Utility/JSON.cpp')
-rw-r--r--source/Utility/JSON.cpp89
1 files changed, 64 insertions, 25 deletions
diff --git a/source/Utility/JSON.cpp b/source/Utility/JSON.cpp
index 1e16a5ac9952..8b96a06e08e8 100644
--- a/source/Utility/JSON.cpp
+++ b/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;