mirror of
https://github.com/nlohmann/json.git
synced 2026-11-01 18:35:34 +00:00
json_view: keep GCC's inlining of view walks with the diagnostics macros
Measured on GCC 13 (x86-64) with JSON_DIAGNOSTICS or JSON_DIAGNOSTIC_POSITIONS, a recursive walk over a view took 2.7 to 2.9 times the instructions: GCC no longer inlined the walk into itself. The cause was not the walk's code but that the path and range code of errors.hpp was instantiated in every translation unit (the non-template throw helpers referenced it), which changed GCC's early inlining of unrelated view functions. diagnostics() and the throw helpers that take an error_site are now templates, so that code is instantiated only where an exception can be thrown; the walks have the instruction counts of develop again. Iterators no longer keep their container: with it, one walk was still 1.1 % slower. key() of an iterator over an array or a primitive value (invalid_iterator.207) is therefore thrown without a context, as documented. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
7 files changed
+73
-81
No files matched your search
@@ -970,7 +970,8 @@ TEST_CASE("json_view element access and iteration")
|
||||
CHECK(exception_of([&] { static_cast<void>(v.at(5)); }) == exception_of([&] { static_cast<void>(j.at(5)); }));
|
||||
if (!(j.is_object() && j.empty())) // (key() of an end iterator)
|
||||
{
|
||||
CHECK(exception_of([&] { static_cast<void>(v.begin().key()); }) == exception_of([&] { static_cast<void>(j.begin().key()); }));
|
||||
// (without the context of basic_json: view iterators do not know the value they iterate over)
|
||||
CHECK(exception_of([&] { static_cast<void>(v.begin().key()); }) == (j.is_object() ? "" : "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators"));
|
||||
}
|
||||
if (!j.empty() || j.is_null())
|
||||
{
|
||||
|
||||
@@ -113,7 +113,8 @@ void check_exceptions(const View& v, const json& j)
|
||||
if (!v.is_object())
|
||||
{
|
||||
CHECK(exception_of_call([&] { static_cast<void>(v["k"]); }) == exception_of_call([&] { static_cast<void>(j["k"]); }));
|
||||
CHECK(exception_of_call([&] { static_cast<void>(v.begin().key()); }) == exception_of_call([&] { static_cast<void>(j.begin().key()); }));
|
||||
// (without the context of basic_json: view iterators do not know the value they iterate over)
|
||||
CHECK(exception_of_call([&] { static_cast<void>(v.begin().key()); }) == "[json.exception.invalid_iterator.207] cannot use key() for non-object iterators");
|
||||
}
|
||||
if (!v.is_array())
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user