From faef8022296301131b56b492b0da7154118f42ee Mon Sep 17 00:00:00 2001 From: Dan Klishch Date: Tue, 14 Nov 2023 00:49:41 -0500 Subject: [PATCH] AK+GMLCompiler: Remove JsonValue::as_double() Replace its single (non-test) usage with newly created as_number(), which does not leak information about internal integer storage type. --- AK/JsonValue.h | 20 ++++++++++++++++--- .../Tools/CodeGenerators/GMLCompiler/main.cpp | 14 ++++++------- Tests/AK/TestJSON.cpp | 6 +++--- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/AK/JsonValue.h b/AK/JsonValue.h index efb7a35a32..b123e59beb 100644 --- a/AK/JsonValue.h +++ b/AK/JsonValue.h @@ -154,10 +154,24 @@ public: return *m_value.as_array; } - double as_double() const + Variant as_number() const { - VERIFY(is_double()); - return m_value.as_double; + VERIFY(is_number()); + + switch (m_type) { + case Type::Int32: + return static_cast(m_value.as_i32); + case Type::UnsignedInt32: + return static_cast(m_value.as_u32); + case Type::Int64: + return m_value.as_i64; + case Type::UnsignedInt64: + return m_value.as_u64; + case Type::Double: + return m_value.as_double; + default: + VERIFY_NOT_REACHED(); + } } Type type() const diff --git a/Meta/Lagom/Tools/CodeGenerators/GMLCompiler/main.cpp b/Meta/Lagom/Tools/CodeGenerators/GMLCompiler/main.cpp index 0e786b0312..2c19ce3f67 100644 --- a/Meta/Lagom/Tools/CodeGenerators/GMLCompiler/main.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/GMLCompiler/main.cpp @@ -210,15 +210,15 @@ static ErrorOr generate_initializer_for(Optional property_na return String::formatted(R"~~~("{}"_string)~~~", TRY(escape_string(value))); } - // No need to handle the smaller integer types separately. - if (value.is_integer()) - return String::formatted("static_cast({})", value.as_integer()); - if (value.is_integer()) - return String::formatted("static_cast({})", value.as_integer()); if (value.is_bool()) return String::formatted("{}", value.as_bool()); - if (value.is_double()) - return String::formatted("static_cast({})", value.as_double()); + if (value.is_number()) { + return value.as_number().visit( + // NOTE: Passing by mutable reference here in order to disallow implicit casts. + [](u64& value) { return String::formatted("static_cast({})", value); }, + [](i64& value) { return String::formatted("static_cast({})", value); }, + [](double& value) { return String::formatted("static_cast({})", value); }); + } if (value.is_array()) { auto const& array = value.as_array(); auto child_type = Optional {}; diff --git a/Tests/AK/TestJSON.cpp b/Tests/AK/TestJSON.cpp index 26097e4613..9c059d2183 100644 --- a/Tests/AK/TestJSON.cpp +++ b/Tests/AK/TestJSON.cpp @@ -133,16 +133,16 @@ TEST_CASE(json_parse_empty_string) TEST_CASE(json_parse_long_decimals) { auto value = JsonValue::from_string("1644452550.6489999294281"sv); - EXPECT_EQ(value.value().as_double(), 1644452550.6489999294281); + EXPECT_EQ(value.value().to_number(), 1644452550.6489999294281); } TEST_CASE(json_parse_number_with_exponent) { auto value_without_fraction = JsonValue::from_string("10e5"sv); - EXPECT_EQ(value_without_fraction.value().as_double(), 1000000.0); + EXPECT_EQ(value_without_fraction.value().to_number(), 1000000.0); auto value_with_fraction = JsonValue::from_string("10.5e5"sv); - EXPECT_EQ(value_with_fraction.value().as_double(), 1050000.0); + EXPECT_EQ(value_with_fraction.value().to_number(), 1050000.0); } TEST_CASE(json_parse_special_numbers)