Browse Source

NaN, INF read/write bug fixed

Fix: #40589
Thakee Nathees 5 years ago
parent
commit
91be2b4407
1 changed files with 53 additions and 21 deletions
  1. 53 21
      core/variant_parser.cpp

+ 53 - 21
core/variant_parser.cpp

@@ -87,6 +87,17 @@ const char *VariantParser::tk_name[TK_MAX] = {
 	"ERROR"
 	"ERROR"
 };
 };
 
 
+static double stor_fix(const String &p_str) {
+	if (p_str == "inf") {
+		return Math_INF;
+	} else if (p_str == "inf_neg") {
+		return -Math_INF;
+	} else if (p_str == "nan") {
+		return Math_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) {
 	while (true) {
 	while (true) {
 		CharType cchar;
 		CharType cchar;
@@ -451,8 +462,19 @@ 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) {
-			r_err_str = "Expected float in constructor";
-			return ERR_PARSE_ERROR;
+			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";
+				return ERR_PARSE_ERROR;
+			}
 		}
 		}
 
 
 		r_construct.push_back(token.value);
 		r_construct.push_back(token.value);
@@ -489,6 +511,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 = Math_INF;
 			value = Math_INF;
+		} else if (id == "inf_neg") {
+			value = -Math_INF;
 		} else if (id == "nan") {
 		} else if (id == "nan") {
 			value = Math_NAN;
 			value = Math_NAN;
 		} else if (id == "Vector2") {
 		} else if (id == "Vector2") {
@@ -1494,11 +1518,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);
 	}
 	}
@@ -1516,8 +1548,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::REAL: {
 		case Variant::REAL: {
-			String s = rtosfix(p_variant.operator real_t());
-			if (s != "inf" && s != "nan") {
+			String s = rtos_fix(p_variant.operator real_t());
+			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";
 				}
 				}
@@ -1532,30 +1564,30 @@ 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::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::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::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::QUAT: {
 		case Variant::QUAT: {
 			Quat quat = p_variant;
 			Quat quat = p_variant;
-			p_store_string_func(p_store_string_ud, "Quat( " + rtosfix(quat.x) + ", " + rtosfix(quat.y) + ", " + rtosfix(quat.z) + ", " + rtosfix(quat.w) + " )");
+			p_store_string_func(p_store_string_ud, "Quat( " + rtos_fix(quat.x) + ", " + rtos_fix(quat.y) + ", " + rtos_fix(quat.z) + ", " + rtos_fix(quat.w) + " )");
 
 
 		} break;
 		} break;
 		case Variant::TRANSFORM2D: {
 		case Variant::TRANSFORM2D: {
@@ -1566,7 +1598,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]);
 				}
 				}
 			}
 			}
 
 
@@ -1581,7 +1613,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]);
 				}
 				}
 			}
 			}
 
 
@@ -1597,11 +1629,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;
@@ -1609,7 +1641,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::NODE_PATH: {
 		case Variant::NODE_PATH: {
@@ -1765,7 +1797,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, " )");
@@ -1802,7 +1834,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, " )");
@@ -1819,7 +1851,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, " )");
@@ -1838,7 +1870,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, " )");