Merge pull request #47497 from briansemrau/nan-inf-tscn-parsing-bug
This commit is contained in:
commit
a603b2d7c7
|
@ -90,6 +90,17 @@ const char *VariantParser::tk_name[TK_MAX] = {
|
||||||
"ERROR"
|
"ERROR"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static double stor_fix(const String &p_str) {
|
||||||
|
if (p_str == "inf") {
|
||||||
|
return INFINITY;
|
||||||
|
} else if (p_str == "inf_neg") {
|
||||||
|
return -INFINITY;
|
||||||
|
} else if (p_str == "nan") {
|
||||||
|
return NAN;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, String &r_err_str) {
|
Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, String &r_err_str) {
|
||||||
bool string_name = false;
|
bool string_name = false;
|
||||||
|
|
||||||
|
@ -469,9 +480,20 @@ Error VariantParser::_parse_construct(Stream *p_stream, Vector<T> &r_construct,
|
||||||
if (first && token.type == TK_PARENTHESIS_CLOSE) {
|
if (first && token.type == TK_PARENTHESIS_CLOSE) {
|
||||||
break;
|
break;
|
||||||
} else if (token.type != TK_NUMBER) {
|
} else if (token.type != TK_NUMBER) {
|
||||||
|
bool valid = false;
|
||||||
|
if (token.type == TK_IDENTIFIER) {
|
||||||
|
double real = stor_fix(token.value);
|
||||||
|
if (real != -1) {
|
||||||
|
token.type = TK_NUMBER;
|
||||||
|
token.value = real;
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!valid) {
|
||||||
r_err_str = "Expected float in constructor";
|
r_err_str = "Expected float in constructor";
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
r_construct.push_back(token.value);
|
r_construct.push_back(token.value);
|
||||||
first = false;
|
first = false;
|
||||||
|
@ -507,6 +529,8 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream,
|
||||||
value = Variant();
|
value = Variant();
|
||||||
} else if (id == "inf") {
|
} else if (id == "inf") {
|
||||||
value = INFINITY;
|
value = INFINITY;
|
||||||
|
} else if (id == "inf_neg") {
|
||||||
|
value = -INFINITY;
|
||||||
} else if (id == "nan") {
|
} else if (id == "nan") {
|
||||||
value = NAN;
|
value = NAN;
|
||||||
} else if (id == "Vector2") {
|
} else if (id == "Vector2") {
|
||||||
|
@ -1401,11 +1425,19 @@ Error VariantParser::parse(Stream *p_stream, Variant &r_ret, String &r_err_str,
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static String rtosfix(double p_value) {
|
static String rtos_fix(double p_value) {
|
||||||
if (p_value == 0.0) {
|
if (p_value == 0.0) {
|
||||||
return "0"; //avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist.
|
return "0"; //avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist.
|
||||||
|
} else if (isnan(p_value)) {
|
||||||
|
return "nan";
|
||||||
|
} else if (isinf(p_value)) {
|
||||||
|
if (p_value > 0) {
|
||||||
|
return "inf";
|
||||||
|
} else {
|
||||||
|
return "inf_neg";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return rtoss(p_value);
|
return rtoss(p_value);
|
||||||
}
|
}
|
||||||
|
@ -1423,8 +1455,8 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
p_store_string_func(p_store_string_ud, itos(p_variant.operator int64_t()));
|
p_store_string_func(p_store_string_ud, itos(p_variant.operator int64_t()));
|
||||||
} break;
|
} break;
|
||||||
case Variant::FLOAT: {
|
case Variant::FLOAT: {
|
||||||
String s = rtosfix(p_variant.operator double());
|
String s = rtos_fix(p_variant.operator double());
|
||||||
if (s != "inf" && s != "nan") {
|
if (s != "inf" && s != "inf_neg" && s != "nan") {
|
||||||
if (s.find(".") == -1 && s.find("e") == -1) {
|
if (s.find(".") == -1 && s.find("e") == -1) {
|
||||||
s += ".0";
|
s += ".0";
|
||||||
}
|
}
|
||||||
|
@ -1439,7 +1471,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
} break;
|
} break;
|
||||||
case Variant::VECTOR2: {
|
case Variant::VECTOR2: {
|
||||||
Vector2 v = p_variant;
|
Vector2 v = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Vector2(" + rtosfix(v.x) + ", " + rtosfix(v.y) + ")");
|
p_store_string_func(p_store_string_ud, "Vector2(" + rtos_fix(v.x) + ", " + rtos_fix(v.y) + ")");
|
||||||
} break;
|
} break;
|
||||||
case Variant::VECTOR2I: {
|
case Variant::VECTOR2I: {
|
||||||
Vector2i v = p_variant;
|
Vector2i v = p_variant;
|
||||||
|
@ -1447,7 +1479,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
} break;
|
} break;
|
||||||
case Variant::RECT2: {
|
case Variant::RECT2: {
|
||||||
Rect2 aabb = p_variant;
|
Rect2 aabb = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Rect2(" + rtosfix(aabb.position.x) + ", " + rtosfix(aabb.position.y) + ", " + rtosfix(aabb.size.x) + ", " + rtosfix(aabb.size.y) + ")");
|
p_store_string_func(p_store_string_ud, "Rect2(" + rtos_fix(aabb.position.x) + ", " + rtos_fix(aabb.position.y) + ", " + rtos_fix(aabb.size.x) + ", " + rtos_fix(aabb.size.y) + ")");
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case Variant::RECT2I: {
|
case Variant::RECT2I: {
|
||||||
|
@ -1457,7 +1489,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
} break;
|
} break;
|
||||||
case Variant::VECTOR3: {
|
case Variant::VECTOR3: {
|
||||||
Vector3 v = p_variant;
|
Vector3 v = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Vector3(" + rtosfix(v.x) + ", " + rtosfix(v.y) + ", " + rtosfix(v.z) + ")");
|
p_store_string_func(p_store_string_ud, "Vector3(" + rtos_fix(v.x) + ", " + rtos_fix(v.y) + ", " + rtos_fix(v.z) + ")");
|
||||||
} break;
|
} break;
|
||||||
case Variant::VECTOR3I: {
|
case Variant::VECTOR3I: {
|
||||||
Vector3i v = p_variant;
|
Vector3i v = p_variant;
|
||||||
|
@ -1465,17 +1497,17 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
} break;
|
} break;
|
||||||
case Variant::PLANE: {
|
case Variant::PLANE: {
|
||||||
Plane p = p_variant;
|
Plane p = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Plane(" + rtosfix(p.normal.x) + ", " + rtosfix(p.normal.y) + ", " + rtosfix(p.normal.z) + ", " + rtosfix(p.d) + ")");
|
p_store_string_func(p_store_string_ud, "Plane(" + rtos_fix(p.normal.x) + ", " + rtos_fix(p.normal.y) + ", " + rtos_fix(p.normal.z) + ", " + rtos_fix(p.d) + ")");
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case Variant::AABB: {
|
case Variant::AABB: {
|
||||||
AABB aabb = p_variant;
|
AABB aabb = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "AABB(" + rtosfix(aabb.position.x) + ", " + rtosfix(aabb.position.y) + ", " + rtosfix(aabb.position.z) + ", " + rtosfix(aabb.size.x) + ", " + rtosfix(aabb.size.y) + ", " + rtosfix(aabb.size.z) + ")");
|
p_store_string_func(p_store_string_ud, "AABB(" + rtos_fix(aabb.position.x) + ", " + rtos_fix(aabb.position.y) + ", " + rtos_fix(aabb.position.z) + ", " + rtos_fix(aabb.size.x) + ", " + rtos_fix(aabb.size.y) + ", " + rtos_fix(aabb.size.z) + ")");
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case Variant::QUATERNION: {
|
case Variant::QUATERNION: {
|
||||||
Quaternion quaternion = p_variant;
|
Quaternion quaternion = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Quaternion(" + rtosfix(quaternion.x) + ", " + rtosfix(quaternion.y) + ", " + rtosfix(quaternion.z) + ", " + rtosfix(quaternion.w) + ")");
|
p_store_string_func(p_store_string_ud, "Quaternion(" + rtos_fix(quaternion.x) + ", " + rtos_fix(quaternion.y) + ", " + rtos_fix(quaternion.z) + ", " + rtos_fix(quaternion.w) + ")");
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case Variant::TRANSFORM2D: {
|
case Variant::TRANSFORM2D: {
|
||||||
|
@ -1486,7 +1518,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i != 0 || j != 0) {
|
if (i != 0 || j != 0) {
|
||||||
s += ", ";
|
s += ", ";
|
||||||
}
|
}
|
||||||
s += rtosfix(m3.elements[i][j]);
|
s += rtos_fix(m3.elements[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1501,7 +1533,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i != 0 || j != 0) {
|
if (i != 0 || j != 0) {
|
||||||
s += ", ";
|
s += ", ";
|
||||||
}
|
}
|
||||||
s += rtosfix(m3.elements[i][j]);
|
s += rtos_fix(m3.elements[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1517,11 +1549,11 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i != 0 || j != 0) {
|
if (i != 0 || j != 0) {
|
||||||
s += ", ";
|
s += ", ";
|
||||||
}
|
}
|
||||||
s += rtosfix(m3.elements[i][j]);
|
s += rtos_fix(m3.elements[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s = s + ", " + rtosfix(t.origin.x) + ", " + rtosfix(t.origin.y) + ", " + rtosfix(t.origin.z);
|
s = s + ", " + rtos_fix(t.origin.x) + ", " + rtos_fix(t.origin.y) + ", " + rtos_fix(t.origin.z);
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, s + ")");
|
p_store_string_func(p_store_string_ud, s + ")");
|
||||||
} break;
|
} break;
|
||||||
|
@ -1529,7 +1561,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
// misc types
|
// misc types
|
||||||
case Variant::COLOR: {
|
case Variant::COLOR: {
|
||||||
Color c = p_variant;
|
Color c = p_variant;
|
||||||
p_store_string_func(p_store_string_ud, "Color(" + rtosfix(c.r) + ", " + rtosfix(c.g) + ", " + rtosfix(c.b) + ", " + rtosfix(c.a) + ")");
|
p_store_string_func(p_store_string_ud, "Color(" + rtos_fix(c.r) + ", " + rtos_fix(c.g) + ", " + rtos_fix(c.b) + ", " + rtos_fix(c.a) + ")");
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case Variant::STRING_NAME: {
|
case Variant::STRING_NAME: {
|
||||||
|
@ -1707,7 +1739,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
p_store_string_func(p_store_string_ud, ", ");
|
p_store_string_func(p_store_string_ud, ", ");
|
||||||
}
|
}
|
||||||
p_store_string_func(p_store_string_ud, rtosfix(ptr[i]));
|
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, ")");
|
p_store_string_func(p_store_string_ud, ")");
|
||||||
|
@ -1723,7 +1755,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
p_store_string_func(p_store_string_ud, ", ");
|
p_store_string_func(p_store_string_ud, ", ");
|
||||||
}
|
}
|
||||||
p_store_string_func(p_store_string_ud, rtosfix(ptr[i]));
|
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, ")");
|
p_store_string_func(p_store_string_ud, ")");
|
||||||
|
@ -1759,7 +1791,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
p_store_string_func(p_store_string_ud, ", ");
|
p_store_string_func(p_store_string_ud, ", ");
|
||||||
}
|
}
|
||||||
p_store_string_func(p_store_string_ud, rtosfix(ptr[i].x) + ", " + rtosfix(ptr[i].y));
|
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x) + ", " + rtos_fix(ptr[i].y));
|
||||||
}
|
}
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, ")");
|
p_store_string_func(p_store_string_ud, ")");
|
||||||
|
@ -1775,7 +1807,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
p_store_string_func(p_store_string_ud, ", ");
|
p_store_string_func(p_store_string_ud, ", ");
|
||||||
}
|
}
|
||||||
p_store_string_func(p_store_string_ud, rtosfix(ptr[i].x) + ", " + rtosfix(ptr[i].y) + ", " + rtosfix(ptr[i].z));
|
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x) + ", " + rtos_fix(ptr[i].y) + ", " + rtos_fix(ptr[i].z));
|
||||||
}
|
}
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, ")");
|
p_store_string_func(p_store_string_ud, ")");
|
||||||
|
@ -1792,7 +1824,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
|
||||||
p_store_string_func(p_store_string_ud, ", ");
|
p_store_string_func(p_store_string_ud, ", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
p_store_string_func(p_store_string_ud, rtosfix(ptr[i].r) + ", " + rtosfix(ptr[i].g) + ", " + rtosfix(ptr[i].b) + ", " + rtosfix(ptr[i].a));
|
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].r) + ", " + rtos_fix(ptr[i].g) + ", " + rtos_fix(ptr[i].b) + ", " + rtos_fix(ptr[i].a));
|
||||||
}
|
}
|
||||||
p_store_string_func(p_store_string_ud, ")");
|
p_store_string_func(p_store_string_ud, ")");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue