mirror of
https://github.com/nlohmann/json.git
synced 2026-11-03 03:15:34 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
379756e92e |
No files matched your search
@@ -1168,20 +1168,20 @@ indent_done:
|
|||||||
if (negative)
|
if (negative)
|
||||||
{
|
{
|
||||||
++p;
|
++p;
|
||||||
if (NLOHMANN_VIEW_UNLIKELY(cur() < '0' || cur() > '9'))
|
|
||||||
{
|
|
||||||
return fail(error_code::number_after_minus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const unsigned char* const int_start = p;
|
const unsigned char* const int_start = p;
|
||||||
if (cur() == '0')
|
if (cur() == '0')
|
||||||
{
|
{
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
else if (!negative || NLOHMANN_VIEW_LIKELY(cur() >= '1' && cur() <= '9'))
|
||||||
|
{
|
||||||
|
// (without a sign, the dispatch saw a digit)
|
||||||
|
p = skip_digits(p + 1, e);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// (a digit: the dispatch or the check after the sign saw it)
|
return fail(error_code::number_after_minus);
|
||||||
p = skip_digits(p + 1, e);
|
|
||||||
}
|
}
|
||||||
const auto int_digits = static_cast<std::size_t>(p - int_start);
|
const auto int_digits = static_cast<std::size_t>(p - int_start);
|
||||||
std::size_t frac_digits = 0;
|
std::size_t frac_digits = 0;
|
||||||
|
|||||||
@@ -230,7 +230,8 @@ void value_range(const document_data& d, const node* n, std::size_t& start, std:
|
|||||||
|
|
||||||
/// the context basic_json puts in front of the message of an exception about
|
/// the context basic_json puts in front of the message of an exception about
|
||||||
/// a value: "(/path) " with JSON_DIAGNOSTICS (none for the root), then
|
/// a value: "(/path) " with JSON_DIAGNOSTICS (none for the root), then
|
||||||
/// "(bytes a-b) " with JSON_DIAGNOSTIC_POSITIONS (also for the root)
|
/// "(bytes a-b) " with JSON_DIAGNOSTIC_POSITIONS (also for the root); with
|
||||||
|
/// JSON_DIAGNOSTICS, nothing for a value that is no longer part of the document
|
||||||
///
|
///
|
||||||
/// This and the throw helpers that take an error_site are templates, so that
|
/// This and the throw helpers that take an error_site are templates, so that
|
||||||
/// the path and range code is instantiated only where an exception can be
|
/// the path and range code is instantiated only where an exception can be
|
||||||
@@ -251,10 +252,12 @@ std::string diagnostics(const error_site site)
|
|||||||
std::string context;
|
std::string context;
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
std::vector<std::string> tokens;
|
std::vector<std::string> tokens;
|
||||||
|
// a value that is no longer part of the document has no path, and its
|
||||||
|
// node still holds the bytes it had in the source: no context at all
|
||||||
const bool found = edited ? value_path<true>(d, site.value(), tokens) : value_path<false>(d, site.value(), tokens);
|
const bool found = edited ? value_path<true>(d, site.value(), tokens) : value_path<false>(d, site.value(), tokens);
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
// a value that is not found has no path, and with it no bytes
|
// context is still empty; returning it keeps the copy elided (-Wnrvo)
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
if (!tokens.empty())
|
if (!tokens.empty())
|
||||||
|
|||||||
Generated
+11
-8
@@ -2473,20 +2473,20 @@ indent_done:
|
|||||||
if (negative)
|
if (negative)
|
||||||
{
|
{
|
||||||
++p;
|
++p;
|
||||||
if (NLOHMANN_VIEW_UNLIKELY(cur() < '0' || cur() > '9'))
|
|
||||||
{
|
|
||||||
return fail(error_code::number_after_minus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const unsigned char* const int_start = p;
|
const unsigned char* const int_start = p;
|
||||||
if (cur() == '0')
|
if (cur() == '0')
|
||||||
{
|
{
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
else if (!negative || NLOHMANN_VIEW_LIKELY(cur() >= '1' && cur() <= '9'))
|
||||||
|
{
|
||||||
|
// (without a sign, the dispatch saw a digit)
|
||||||
|
p = skip_digits(p + 1, e);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// (a digit: the dispatch or the check after the sign saw it)
|
return fail(error_code::number_after_minus);
|
||||||
p = skip_digits(p + 1, e);
|
|
||||||
}
|
}
|
||||||
const auto int_digits = static_cast<std::size_t>(p - int_start);
|
const auto int_digits = static_cast<std::size_t>(p - int_start);
|
||||||
std::size_t frac_digits = 0;
|
std::size_t frac_digits = 0;
|
||||||
@@ -5059,7 +5059,8 @@ void value_range(const document_data& d, const node* n, std::size_t& start, std:
|
|||||||
|
|
||||||
/// the context basic_json puts in front of the message of an exception about
|
/// the context basic_json puts in front of the message of an exception about
|
||||||
/// a value: "(/path) " with JSON_DIAGNOSTICS (none for the root), then
|
/// a value: "(/path) " with JSON_DIAGNOSTICS (none for the root), then
|
||||||
/// "(bytes a-b) " with JSON_DIAGNOSTIC_POSITIONS (also for the root)
|
/// "(bytes a-b) " with JSON_DIAGNOSTIC_POSITIONS (also for the root); with
|
||||||
|
/// JSON_DIAGNOSTICS, nothing for a value that is no longer part of the document
|
||||||
///
|
///
|
||||||
/// This and the throw helpers that take an error_site are templates, so that
|
/// This and the throw helpers that take an error_site are templates, so that
|
||||||
/// the path and range code is instantiated only where an exception can be
|
/// the path and range code is instantiated only where an exception can be
|
||||||
@@ -5080,10 +5081,12 @@ std::string diagnostics(const error_site site)
|
|||||||
std::string context;
|
std::string context;
|
||||||
#if JSON_DIAGNOSTICS
|
#if JSON_DIAGNOSTICS
|
||||||
std::vector<std::string> tokens;
|
std::vector<std::string> tokens;
|
||||||
|
// a value that is no longer part of the document has no path, and its
|
||||||
|
// node still holds the bytes it had in the source: no context at all
|
||||||
const bool found = edited ? value_path<true>(d, site.value(), tokens) : value_path<false>(d, site.value(), tokens);
|
const bool found = edited ? value_path<true>(d, site.value(), tokens) : value_path<false>(d, site.value(), tokens);
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
// a value that is not found has no path, and with it no bytes
|
// context is still empty; returning it keeps the copy elided (-Wnrvo)
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
if (!tokens.empty())
|
if (!tokens.empty())
|
||||||
|
|||||||
@@ -1038,14 +1038,6 @@ template<class T>
|
|||||||
struct sweep_allocator
|
struct sweep_allocator
|
||||||
{
|
{
|
||||||
using value_type = T;
|
using value_type = T;
|
||||||
// GCC 4.8's std::map takes these from the allocator instead of from
|
|
||||||
// std::allocator_traits
|
|
||||||
using pointer = T*;
|
|
||||||
using const_pointer = const T*;
|
|
||||||
using reference = T&;
|
|
||||||
using const_reference = const T&;
|
|
||||||
using size_type = std::size_t;
|
|
||||||
using difference_type = std::ptrdiff_t;
|
|
||||||
|
|
||||||
sweep_allocator() = default;
|
sweep_allocator() = default;
|
||||||
template<class U> sweep_allocator(const sweep_allocator<U>& /*unused*/) noexcept {}
|
template<class U> sweep_allocator(const sweep_allocator<U>& /*unused*/) noexcept {}
|
||||||
@@ -1163,9 +1155,8 @@ TEST_CASE("parse() survives a failing allocation at every point (#5985)")
|
|||||||
|
|
||||||
// With iterator debugging (MSVC STL debug builds, also used by clang-cl),
|
// With iterator debugging (MSVC STL debug builds, also used by clang-cl),
|
||||||
// containers allocate a debug proxy through the allocator inside their
|
// containers allocate a debug proxy through the allocator inside their
|
||||||
// noexcept default and move constructors, so failing that allocation
|
// noexcept move constructors, so failing that allocation terminates the
|
||||||
// terminates the program instead of throwing std::bad_alloc. Nothing to
|
// program instead of throwing std::bad_alloc. Nothing to check there.
|
||||||
// check there.
|
|
||||||
#if !(defined(_ITERATOR_DEBUG_LEVEL) && _ITERATOR_DEBUG_LEVEL > 0)
|
#if !(defined(_ITERATOR_DEBUG_LEVEL) && _ITERATOR_DEBUG_LEVEL > 0)
|
||||||
SECTION("parser callback")
|
SECTION("parser callback")
|
||||||
{
|
{
|
||||||
@@ -1187,6 +1178,7 @@ TEST_CASE("parse() survives a failing allocation at every point (#5985)")
|
|||||||
return sweep_json::parse(text, drop_d);
|
return sweep_json::parse(text, drop_d);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SECTION("sax_parse into an existing value")
|
SECTION("sax_parse into an existing value")
|
||||||
{
|
{
|
||||||
@@ -1200,6 +1192,5 @@ TEST_CASE("parse() survives a failing allocation at every point (#5985)")
|
|||||||
return value;
|
return value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2222,10 +2222,9 @@ TEST_CASE("serialization of short strings")
|
|||||||
{
|
{
|
||||||
CAPTURE(s)
|
CAPTURE(s)
|
||||||
const json j = s;
|
const json j = s;
|
||||||
const std::string quoted = "\"" + s + "\""; // NOLINT(performance-inefficient-string-concatenation)
|
CHECK(j.dump() == "\"" + s + "\"");
|
||||||
CHECK(j.dump() == quoted);
|
CHECK(j.dump(-1, ' ', true) == "\"" + s + "\"");
|
||||||
CHECK(j.dump(-1, ' ', true) == quoted);
|
CHECK(json({{s, s}}).dump() == "{\"" + s + "\":\"" + s + "\"}");
|
||||||
CHECK(json({{s, s}}).dump() == "{" + quoted + ":" + quoted + "}"); // NOLINT(performance-inefficient-string-concatenation)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// a character that needs an escape
|
// a character that needs an escape
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ struct failing_allocator
|
|||||||
template<typename U>
|
template<typename U>
|
||||||
explicit failing_allocator(const failing_allocator<U>& /*other*/) noexcept {}
|
explicit failing_allocator(const failing_allocator<U>& /*other*/) noexcept {}
|
||||||
|
|
||||||
[[noreturn]] T* allocate(std::size_t /*n*/) // NOLINT(readability-convert-member-functions-to-static)
|
T* allocate(std::size_t /*n*/) // NOLINT(readability-convert-member-functions-to-static)
|
||||||
{
|
{
|
||||||
throw std::bad_alloc();
|
throw std::bad_alloc();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -505,8 +505,8 @@ struct locale_switching_token
|
|||||||
{
|
{
|
||||||
using value_type = char;
|
using value_type = char;
|
||||||
|
|
||||||
locale_switching_token(std::string text_, std::string switch_to_)
|
locale_switching_token(std::string text_, const char* switch_to_)
|
||||||
: text(std::move(text_)), switch_to(std::move(switch_to_))
|
: text(std::move(text_)), switch_to(switch_to_)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
std::size_t size() const
|
std::size_t size() const
|
||||||
@@ -523,13 +523,13 @@ struct locale_switching_token
|
|||||||
{
|
{
|
||||||
if (!switched)
|
if (!switched)
|
||||||
{
|
{
|
||||||
switched = std::setlocale(LC_NUMERIC, switch_to.c_str()) != nullptr;
|
switched = std::setlocale(LC_NUMERIC, switch_to) != nullptr;
|
||||||
}
|
}
|
||||||
return &text[0];
|
return &text[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string text;
|
std::string text;
|
||||||
std::string switch_to;
|
const char* switch_to;
|
||||||
bool switched = false;
|
bool switched = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -122,8 +122,7 @@ TEST_CASE("JSON text with std::byte")
|
|||||||
SECTION("invalid text")
|
SECTION("invalid text")
|
||||||
{
|
{
|
||||||
CHECK_FALSE(json::accept(to_bytes("[1,\n2,")));
|
CHECK_FALSE(json::accept(to_bytes("[1,\n2,")));
|
||||||
json _;
|
CHECK_THROWS_WITH_AS(json::parse(to_bytes("[1,\n2,")),
|
||||||
CHECK_THROWS_WITH_AS(_ = json::parse(to_bytes("[1,\n2,")),
|
|
||||||
"[json.exception.parse_error.101] parse error at line 2, column 3: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal", json::parse_error&);
|
"[json.exception.parse_error.101] parse error at line 2, column 3: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal", json::parse_error&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user