GDScript: Fix crash when base of an attribute is invalid
In attribute expressions (`a.b`) it's possible that the base has an incorrect syntax and thus become a nullptr expression in the tree. This commit add the check for this case to fail gracefully instead of crashing.
This commit is contained in:
parent
c201b212c7
commit
9ed0f0384c
2 changed files with 7 additions and 1 deletions
|
@ -2065,6 +2065,12 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool is_awa
|
||||||
is_self = true;
|
is_self = true;
|
||||||
} else if (callee_type == GDScriptParser::Node::SUBSCRIPT) {
|
} else if (callee_type == GDScriptParser::Node::SUBSCRIPT) {
|
||||||
GDScriptParser::SubscriptNode *subscript = static_cast<GDScriptParser::SubscriptNode *>(p_call->callee);
|
GDScriptParser::SubscriptNode *subscript = static_cast<GDScriptParser::SubscriptNode *>(p_call->callee);
|
||||||
|
if (subscript->base == nullptr) {
|
||||||
|
// Invalid syntax, error already set on parser.
|
||||||
|
p_call->set_datatype(call_type);
|
||||||
|
mark_node_unsafe(p_call);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!subscript->is_attribute) {
|
if (!subscript->is_attribute) {
|
||||||
// Invalid call. Error already sent in parser.
|
// Invalid call. Error already sent in parser.
|
||||||
// TODO: Could check if Callable here.
|
// TODO: Could check if Callable here.
|
||||||
|
|
|
@ -2545,7 +2545,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_attribute(ExpressionNode *
|
||||||
|
|
||||||
if (for_completion) {
|
if (for_completion) {
|
||||||
bool is_builtin = false;
|
bool is_builtin = false;
|
||||||
if (p_previous_operand->type == Node::IDENTIFIER) {
|
if (p_previous_operand && p_previous_operand->type == Node::IDENTIFIER) {
|
||||||
const IdentifierNode *id = static_cast<const IdentifierNode *>(p_previous_operand);
|
const IdentifierNode *id = static_cast<const IdentifierNode *>(p_previous_operand);
|
||||||
Variant::Type builtin_type = get_builtin_type(id->name);
|
Variant::Type builtin_type = get_builtin_type(id->name);
|
||||||
if (builtin_type < Variant::VARIANT_MAX) {
|
if (builtin_type < Variant::VARIANT_MAX) {
|
||||||
|
|
Loading…
Reference in a new issue