Core: add EOF check for json parser

Additionally reset parse result if error was found.

(cherry picked from commit a2676ff810)
This commit is contained in:
Sergey Minakov 2020-07-28 21:09:01 +03:00 committed by Rémi Verschelde
parent a3c67dd3fc
commit 78837f5c65
No known key found for this signature in database
GPG key ID: C3336907360768E1

View file

@ -310,7 +310,6 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
if (err)
return err;
value = d;
return OK;
} else if (token.type == TK_BRACKET_OPEN) {
Array a;
@ -318,8 +317,6 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
if (err)
return err;
value = a;
return OK;
} else if (token.type == TK_IDENTIFIER) {
String id = token.value;
@ -333,20 +330,18 @@ Error JSON::_parse_value(Variant &value, Token &token, const CharType *p_str, in
r_err_str = "Expected 'true','false' or 'null', got '" + id + "'.";
return ERR_PARSE_ERROR;
}
return OK;
} else if (token.type == TK_NUMBER) {
value = token.value;
return OK;
} else if (token.type == TK_STRING) {
value = token.value;
return OK;
} else {
r_err_str = "Expected value, got " + String(tk_name[token.type]) + ".";
return ERR_PARSE_ERROR;
}
return OK;
}
Error JSON::_parse_array(Array &array, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str) {
@ -473,5 +468,18 @@ Error JSON::parse(const String &p_json, Variant &r_ret, String &r_err_str, int &
err = _parse_value(r_ret, token, str, idx, len, r_err_line, r_err_str);
// Check if EOF is reached
// or it's a type of the next token.
if (err == OK && idx < len) {
err = _get_token(str, idx, len, token, r_err_line, r_err_str);
if (err || token.type != TK_EOF) {
r_err_str = "Expected 'EOF'";
// Reset return value to empty `Variant`
r_ret = Variant();
return ERR_PARSE_ERROR;
}
}
return err;
}