Merge pull request #51094 from RandomShaper/error_cast_freed_object

Complain if casting a freed object in a debug session
This commit is contained in:
Rémi Verschelde 2021-09-14 21:48:10 +02:00 committed by GitHub
commit 1c7aec9d9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 0 deletions

View File

@ -1232,6 +1232,13 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(to_type < 0 || to_type >= Variant::VARIANT_MAX); GD_ERR_BREAK(to_type < 0 || to_type >= Variant::VARIANT_MAX);
#ifdef DEBUG_ENABLED
if (src->get_type() == Variant::OBJECT && !src->operator ObjectID().is_ref_counted() && ObjectDB::get_instance(src->operator ObjectID()) == nullptr) {
err_text = "Trying to cast a freed object.";
OPCODE_BREAK;
}
#endif
Callable::CallError err; Callable::CallError err;
Variant::construct(to_type, *dst, (const Variant **)&src, 1, err); Variant::construct(to_type, *dst, (const Variant **)&src, 1, err);
@ -1256,6 +1263,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(!nc); GD_ERR_BREAK(!nc);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (src->get_type() == Variant::OBJECT && !src->operator ObjectID().is_ref_counted() && ObjectDB::get_instance(src->operator ObjectID()) == nullptr) {
err_text = "Trying to cast a freed object.";
OPCODE_BREAK;
}
if (src->get_type() != Variant::OBJECT && src->get_type() != Variant::NIL) { if (src->get_type() != Variant::OBJECT && src->get_type() != Variant::NIL) {
err_text = "Invalid cast: can't convert a non-object value to an object type."; err_text = "Invalid cast: can't convert a non-object value to an object type.";
OPCODE_BREAK; OPCODE_BREAK;
@ -1284,6 +1295,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(!base_type); GD_ERR_BREAK(!base_type);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (src->get_type() == Variant::OBJECT && !src->operator ObjectID().is_ref_counted() && ObjectDB::get_instance(src->operator ObjectID()) == nullptr) {
err_text = "Trying to cast a freed object.";
OPCODE_BREAK;
}
if (src->get_type() != Variant::OBJECT && src->get_type() != Variant::NIL) { if (src->get_type() != Variant::OBJECT && src->get_type() != Variant::NIL) {
err_text = "Trying to assign a non-object value to a variable of type '" + base_type->get_path().get_file() + "'."; err_text = "Trying to assign a non-object value to a variable of type '" + base_type->get_path().get_file() + "'.";
OPCODE_BREAK; OPCODE_BREAK;