Bläddra i källkod

Fix base script not initialized properly in some cases

Storing script references to pointer only in result.script_type could
lead to losing the last reference, causing further conversions from
Script* to Ref<Script> to fail.

Now result.script_type_ref is always set first, and then cleared in the
specific case of the script being the owner, to avoid cyclic reference
issues.

(cherry picked from commit 87d73faa668b8b76333b1728a3f91f1e0438f2fd)
PouleyKetchoupp 4 år sedan
förälder
incheckning
9d2c012f23
1 ändrade filer med 6 tillägg och 4 borttagningar
  1. 6 4
      modules/gdscript/gdscript_compiler.cpp

+ 6 - 4
modules/gdscript/gdscript_compiler.cpp

@@ -130,7 +130,8 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
 		} break;
 		case GDScriptParser::DataType::SCRIPT: {
 			result.kind = GDScriptDataType::SCRIPT;
-			result.script_type = Ref<Script>(p_datatype.script_type).ptr();
+			result.script_type_ref = Ref<Script>(p_datatype.script_type);
+			result.script_type = result.script_type_ref.ptr();
 			result.native_type = result.script_type->get_instance_base_type();
 		} break;
 		case GDScriptParser::DataType::GDSCRIPT: {
@@ -159,7 +160,8 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
 			}
 
 			result.kind = GDScriptDataType::GDSCRIPT;
-			result.script_type = Ref<Script>(script).ptr();
+			result.script_type_ref = Ref<Script>(script);
+			result.script_type = result.script_type_ref.ptr();
 			result.native_type = script->get_instance_base_type();
 		} break;
 		default: {
@@ -170,8 +172,8 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
 
 	// Only hold strong reference to the script if it's not the owner of the
 	// element qualified with this type, to avoid cyclic references (leaks).
-	if (result.script_type && result.script_type != p_owner) {
-		result.script_type_ref = Ref<Script>(result.script_type);
+	if (result.script_type && result.script_type == p_owner) {
+		result.script_type_ref = Ref<Script>();
 	}
 
 	return result;