1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

Fix crash on accessing jsonnode with different type in release builds

This commit is contained in:
Ivan Savenko 2023-12-23 18:12:18 +02:00
parent 12c69f8e04
commit 72980a3909

View File

@ -310,63 +310,73 @@ JsonMap & JsonNode::Struct()
const bool boolDefault = false; const bool boolDefault = false;
bool JsonNode::Bool() const bool JsonNode::Bool() const
{ {
if (getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_BOOL);
return boolDefault;
assert(getType() == JsonType::DATA_BOOL); if (getType() == JsonType::DATA_BOOL)
return std::get<bool>(data); return std::get<bool>(data);
return boolDefault;
} }
const double floatDefault = 0; const double floatDefault = 0;
double JsonNode::Float() const double JsonNode::Float() const
{ {
if(getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_INTEGER || getType() == JsonType::DATA_FLOAT);
return floatDefault;
if(getType() == JsonType::DATA_FLOAT)
return std::get<double>(data);
if(getType() == JsonType::DATA_INTEGER) if(getType() == JsonType::DATA_INTEGER)
return static_cast<double>(std::get<si64>(data)); return static_cast<double>(std::get<si64>(data));
assert(getType() == JsonType::DATA_FLOAT); return floatDefault;
return std::get<double>(data);
} }
const si64 integetDefault = 0; const si64 integerDefault = 0;
si64 JsonNode::Integer() const si64 JsonNode::Integer() const
{ {
if(getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_INTEGER || getType() == JsonType::DATA_FLOAT);
return integetDefault;
if(getType() == JsonType::DATA_INTEGER)
return std::get<si64>(data);
if(getType() == JsonType::DATA_FLOAT) if(getType() == JsonType::DATA_FLOAT)
return static_cast<si64>(std::get<double>(data)); return static_cast<si64>(std::get<double>(data));
assert(getType() == JsonType::DATA_INTEGER); return integerDefault;
return std::get<si64>(data);
} }
const std::string stringDefault = std::string(); const std::string stringDefault = std::string();
const std::string & JsonNode::String() const const std::string & JsonNode::String() const
{ {
if (getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_STRING);
return stringDefault;
assert(getType() == JsonType::DATA_STRING); if (getType() == JsonType::DATA_STRING)
return std::get<std::string>(data); return std::get<std::string>(data);
return stringDefault;
} }
const JsonVector vectorDefault = JsonVector(); const JsonVector vectorDefault = JsonVector();
const JsonVector & JsonNode::Vector() const const JsonVector & JsonNode::Vector() const
{ {
if (getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_VECTOR);
return vectorDefault;
assert(getType() == JsonType::DATA_VECTOR); if (getType() == JsonType::DATA_VECTOR)
return std::get<JsonVector>(data); return std::get<JsonVector>(data);
return vectorDefault;
} }
const JsonMap mapDefault = JsonMap(); const JsonMap mapDefault = JsonMap();
const JsonMap & JsonNode::Struct() const const JsonMap & JsonNode::Struct() const
{ {
if (getType() == JsonType::DATA_NULL) assert(getType() == JsonType::DATA_NULL || getType() == JsonType::DATA_STRUCT);
return mapDefault;
assert(getType() == JsonType::DATA_STRUCT); if (getType() == JsonType::DATA_STRUCT)
return std::get<JsonMap>(data); return std::get<JsonMap>(data);
return mapDefault;
} }
JsonNode & JsonNode::operator[](const std::string & child) JsonNode & JsonNode::operator[](const std::string & child)