From ac0679eb1a4e46225422c73f9c4752c5e7b3ad73 Mon Sep 17 00:00:00 2001 From: Marc Gilleron Date: Wed, 24 Jan 2018 23:16:00 +0100 Subject: [PATCH] Fix Ref leak when using Godot getters --- binding_generator.py | 4 ++-- include/core/Ref.hpp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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; + } }; }