Promote object validity checks to release builds
Extra: - Optimized the debug-only check about why the object is null to determine if it's because it has been deleted (the RC is enough; no need to check the ObjectDB). - Because of the previous point. the debugger being attached is not required anymore for giving the "Object was deleted" error; from now, it only matters that it's a debug build. - `is_instance_valid()` is now trustworthy. It will return `true` if, and only if, the last object assigned to a `Variant` is still alive (and not if a new object happened to be created at the same memory address of the old one). - Replacements of `instance_validate()` are used where possible `Variant::is_invalid_object()` is introduced to help with that. (GDScript's `is_instance_valid()` is good.)
This commit is contained in:
@ -1162,9 +1162,9 @@ void Variant::call_ptr(const StringName &p_method, const Variant **p_args, int p
|
||||
if (type == Variant::OBJECT) {
|
||||
//call object
|
||||
Object *obj = _OBJ_PTR(*this);
|
||||
if (!obj) {
|
||||
if (unlikely(!obj)) {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (ScriptDebugger::get_singleton() && _get_obj().rc && !ObjectDB::get_instance(_get_obj().rc->instance_id)) {
|
||||
if (_get_obj().rc) {
|
||||
ERR_PRINT("Attempted method call on a deleted object.");
|
||||
}
|
||||
#endif
|
||||
@ -1374,9 +1374,9 @@ Variant Variant::construct(const Variant::Type p_type, const Variant **p_args, i
|
||||
bool Variant::has_method(const StringName &p_method) const {
|
||||
if (type == OBJECT) {
|
||||
Object *obj = _OBJ_PTR(*this);
|
||||
if (!obj) {
|
||||
if (unlikely(!obj)) {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (ScriptDebugger::get_singleton() && _get_obj().rc && !ObjectDB::get_instance(_get_obj().rc->instance_id)) {
|
||||
if (_get_obj().rc) {
|
||||
ERR_PRINT("Attempted method check on a deleted object.");
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user