From e1f38654677acad1c929546e2724206bb225e7d1 Mon Sep 17 00:00:00 2001 From: Karroffel Date: Wed, 21 Jun 2017 02:14:54 +0200 Subject: [PATCH] Wohoo, Ref<>s are now working --- binding_generator.py | 4 ++-- include/core/Godot.hpp | 2 +- include/core/Ref.hpp | 15 ++++++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/binding_generator.py b/binding_generator.py index 398193e8..22c27890 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -306,7 +306,7 @@ def generate_class_implementation(icalls, used_classes, c): if method["return_type"] != "void": if is_class_type(method["return_type"]): if 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: @@ -372,7 +372,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"]) + ">(__result);" + cast += "Ref<" + stip_name(method["return_type"]) + ">::__internal_constructor(__result);" else: cast += "(" + strip_name(method["return_type"]) + " *) (Object *) __result;" else: diff --git a/include/core/Godot.hpp b/include/core/Godot.hpp index 49876cd6..8ad8b370 100644 --- a/include/core/Godot.hpp +++ b/include/core/Godot.hpp @@ -67,7 +67,7 @@ template struct _ArgCast { static T _arg_cast(Variant a) { - return a.operator T(); + return static_cast(a); } }; diff --git a/include/core/Ref.hpp b/include/core/Ref.hpp index 2cdbb259..78b1926c 100644 --- a/include/core/Ref.hpp +++ b/include/core/Ref.hpp @@ -108,7 +108,6 @@ public: operator Variant() const { - if (reference) reference->reference(); return Variant((Object *) reference); } @@ -130,10 +129,8 @@ public: Ref(T *r) { - if (r) - ref_pointer(r); - else - reference = nullptr; + r->reference(); + reference = r; } template @@ -153,6 +150,14 @@ public: ref(re); re.reference = nullptr; } + + template + static Ref __internal_constructor(T_Other *r) + { + Ref ref; + ref.reference = (T *) r; + return ref; + } inline bool is_valid() const { return reference != nullptr; }