Merge pull request #34918 from vnen/gdscript-assign-op
GDScript: enable type checks on release mode
This commit is contained in:
commit
c456d87ee6
3 changed files with 38 additions and 9 deletions
|
@ -670,6 +670,30 @@ static void _disassemble_class(const Ref<GDScript> &p_class, const Vector<String
|
||||||
txt += "= false";
|
txt += "= false";
|
||||||
incr += 2;
|
incr += 2;
|
||||||
|
|
||||||
|
} break;
|
||||||
|
case GDScriptFunction::OPCODE_ASSIGN_TYPED_BUILTIN: {
|
||||||
|
|
||||||
|
txt += " assign typed builtin (";
|
||||||
|
txt += Variant::get_type_name((Variant::Type)code[ip + 1]);
|
||||||
|
txt += ") ";
|
||||||
|
txt += DADDR(2);
|
||||||
|
txt += " = ";
|
||||||
|
txt += DADDR(3);
|
||||||
|
incr += 4;
|
||||||
|
|
||||||
|
} break;
|
||||||
|
case GDScriptFunction::OPCODE_ASSIGN_TYPED_NATIVE: {
|
||||||
|
Variant className = func.get_constant(code[ip + 1]);
|
||||||
|
GDScriptNativeClass *nc = Object::cast_to<GDScriptNativeClass>(className.operator Object *());
|
||||||
|
|
||||||
|
txt += " assign typed native (";
|
||||||
|
txt += nc->get_name().operator String();
|
||||||
|
txt += ") ";
|
||||||
|
txt += DADDR(2);
|
||||||
|
txt += " = ";
|
||||||
|
txt += DADDR(3);
|
||||||
|
incr += 4;
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case GDScriptFunction::OPCODE_CAST_TO_SCRIPT: {
|
case GDScriptFunction::OPCODE_CAST_TO_SCRIPT: {
|
||||||
|
|
||||||
|
|
|
@ -2057,12 +2057,13 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
|
||||||
mi.return_val.type = Variant::BOOL;
|
mi.return_val.type = Variant::BOOL;
|
||||||
return mi;
|
return mi;
|
||||||
} break;
|
} break;
|
||||||
case FUNC_MAX: {
|
default: {
|
||||||
|
|
||||||
ERR_FAIL_V(MethodInfo());
|
ERR_FAIL_V(MethodInfo());
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
MethodInfo mi;
|
||||||
return MethodInfo();
|
mi.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
|
||||||
|
return mi;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8192,11 +8192,14 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
|
||||||
if (lh_type.has_type && rh_type.may_yield && op->arguments[1]->type == Node::TYPE_OPERATOR) {
|
if (lh_type.has_type && rh_type.may_yield && op->arguments[1]->type == Node::TYPE_OPERATOR) {
|
||||||
_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, op->line, _find_function_name(static_cast<OperatorNode *>(op->arguments[1])));
|
_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, op->line, _find_function_name(static_cast<OperatorNode *>(op->arguments[1])));
|
||||||
}
|
}
|
||||||
#endif // DEBUG_ENABLED
|
|
||||||
|
|
||||||
bool type_match = check_types;
|
bool type_match = check_types;
|
||||||
|
#endif // DEBUG_ENABLED
|
||||||
if (check_types && !_is_type_compatible(lh_type, rh_type)) {
|
if (check_types && !_is_type_compatible(lh_type, rh_type)) {
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
type_match = false;
|
type_match = false;
|
||||||
|
#endif // DEBUG_ENABLED
|
||||||
|
|
||||||
// Try supertype test
|
// Try supertype test
|
||||||
if (_is_type_compatible(rh_type, lh_type)) {
|
if (_is_type_compatible(rh_type, lh_type)) {
|
||||||
_mark_line_as_unsafe(op->line);
|
_mark_line_as_unsafe(op->line);
|
||||||
|
@ -8227,7 +8230,9 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
|
||||||
|
|
||||||
op->arguments.write[1] = convert_call;
|
op->arguments.write[1] = convert_call;
|
||||||
|
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
type_match = true; // Since we are converting, the type is matching
|
type_match = true; // Since we are converting, the type is matching
|
||||||
|
#endif // DEBUG_ENABLED
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (lh_type.builtin_type == Variant::INT && rh_type.builtin_type == Variant::REAL) {
|
if (lh_type.builtin_type == Variant::INT && rh_type.builtin_type == Variant::REAL) {
|
||||||
|
@ -8240,8 +8245,10 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
|
||||||
if (!rh_type.has_type && (op->op != OperatorNode::OP_ASSIGN || lh_type.has_type || op->arguments[0]->type == Node::TYPE_OPERATOR)) {
|
if (!rh_type.has_type && (op->op != OperatorNode::OP_ASSIGN || lh_type.has_type || op->arguments[0]->type == Node::TYPE_OPERATOR)) {
|
||||||
_mark_line_as_unsafe(op->line);
|
_mark_line_as_unsafe(op->line);
|
||||||
}
|
}
|
||||||
#endif // DEBUG_ENABLED
|
|
||||||
op->datatype.has_type = type_match;
|
op->datatype.has_type = type_match;
|
||||||
|
#else
|
||||||
|
op->datatype.has_type = false;
|
||||||
|
#endif // DEBUG_ENABLED
|
||||||
} break;
|
} break;
|
||||||
case OperatorNode::OP_CALL:
|
case OperatorNode::OP_CALL:
|
||||||
case OperatorNode::OP_PARENT_CALL: {
|
case OperatorNode::OP_PARENT_CALL: {
|
||||||
|
@ -8484,11 +8491,8 @@ Error GDScriptParser::_parse(const String &p_base_path) {
|
||||||
current_class = main_class;
|
current_class = main_class;
|
||||||
current_function = NULL;
|
current_function = NULL;
|
||||||
current_block = NULL;
|
current_block = NULL;
|
||||||
#ifdef DEBUG_ENABLED
|
|
||||||
if (for_completion) check_types = false;
|
if (for_completion) check_types = false;
|
||||||
#else
|
|
||||||
check_types = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Resolve all class-level stuff before getting into function blocks
|
// Resolve all class-level stuff before getting into function blocks
|
||||||
_check_class_level_types(main_class);
|
_check_class_level_types(main_class);
|
||||||
|
|
Loading…
Reference in a new issue