diff --git a/binding_generator.py b/binding_generator.py index 9c6b00af..54c56f2d 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -346,7 +346,7 @@ def generate_class_implementation(icalls, used_classes, c): if is_enum(method["return_type"]): return_statement += "return (" + remove_enum_prefix(method["return_type"]) + ") " elif is_reference_type(method["return_type"]): - return_statement += "return Ref<" + strip_name(method["return_type"]) + ">("; + return_statement += "return Ref<" + strip_name(method["return_type"]) + ">::__internal_constructor("; else: return_statement += "return " + ("(" + strip_name(method["return_type"]) + " *) " if is_class_type(method["return_type"]) else "") else: @@ -414,7 +414,7 @@ def generate_class_implementation(icalls, used_classes, c): cast = "" if is_class_type(method["return_type"]): if is_reference_type(method["return_type"]): - cast += "Ref<" + stip_name(method["return_type"]) + ">::__internal_constructor(__result);" + cast += "Ref<" + strip_name(method["return_type"]) + ">::__internal_constructor(__result);" else: cast += "(" + strip_name(method["return_type"]) + " *) (Object *) __result;" else: diff --git a/include/core/Ref.hpp b/include/core/Ref.hpp index 3d06e758..f81dbbeb 100644 --- a/include/core/Ref.hpp +++ b/include/core/Ref.hpp @@ -199,6 +199,15 @@ public: unref(); } + + // Used exclusively in the bindings to recreate the Ref Godot encapsulates in return values, + // without adding to the refcount. + inline static Ref __internal_constructor(Object *obj) + { + Ref r; + r.reference = (T*)obj; + return r; + } }; }