Parcourir la source

GDScript: Check for missing exponent when parsing numbers

Also forbid multiple underscores in a row as numeric separator.
George Marques il y a 5 ans
Parent
commit
164cc8705b
1 fichiers modifiés avec 32 ajouts et 0 suppressions
  1. 32 0
      modules/gdscript/gdscript_tokenizer.cpp

+ 32 - 0
modules/gdscript/gdscript_tokenizer.cpp

@@ -621,7 +621,19 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 	}
 
 	// Allow '_' to be used in a number, for readability.
+	bool previous_was_underscore = false;
 	while (digit_check_func(_peek()) || _peek() == '_') {
+		if (_peek() == '_') {
+			if (previous_was_underscore) {
+				Token error = make_error(R"(Only one underscore can be used as a numeric separator.)");
+				error.start_column = column;
+				error.leftmost_column = column;
+				error.end_column = column + 1;
+				error.rightmost_column = column + 1;
+				push_error(error);
+			}
+			previous_was_underscore = true;
+		}
 		_advance();
 	}
 
@@ -672,7 +684,27 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 				_advance();
 			}
 			// Consume exponent digits.
+			if (!_is_digit(_peek())) {
+				Token error = make_error(R"(Expected exponent value after "e".)");
+				error.start_column = column;
+				error.leftmost_column = column;
+				error.end_column = column + 1;
+				error.rightmost_column = column + 1;
+				push_error(error);
+			}
+			previous_was_underscore = false;
 			while (_is_digit(_peek()) || _peek() == '_') {
+				if (_peek() == '_') {
+					if (previous_was_underscore) {
+						Token error = make_error(R"(Only one underscore can be used as a numeric separator.)");
+						error.start_column = column;
+						error.leftmost_column = column;
+						error.end_column = column + 1;
+						error.rightmost_column = column + 1;
+						push_error(error);
+					}
+					previous_was_underscore = true;
+				}
 				_advance();
 			}
 		}