Browse Source

Add C conversion constructors to fix leak of default-constructed empty arrays

sheepandshepherd 5 years ago
parent
commit
66c671b59d
3 changed files with 12 additions and 4 deletions
  1. 5 0
      include/core/Array.hpp
  2. 5 0
      include/core/Dictionary.hpp
  3. 2 4
      src/core/Variant.cpp

+ 5 - 0
include/core/Array.hpp

@@ -57,6 +57,11 @@ class Object;
 class Array {
 class Array {
 	godot_array _godot_array;
 	godot_array _godot_array;
 
 
+	friend class Variant;
+	inline explicit Array(const godot_array &other) {
+		_godot_array = other;
+	}
+
 public:
 public:
 	Array();
 	Array();
 	Array(const Array &other);
 	Array(const Array &other);

+ 5 - 0
include/core/Dictionary.hpp

@@ -12,6 +12,11 @@ namespace godot {
 class Dictionary {
 class Dictionary {
 	godot_dictionary _godot_dictionary;
 	godot_dictionary _godot_dictionary;
 
 
+	friend Variant::operator Dictionary() const;
+	inline explicit Dictionary(const godot_dictionary &other) {
+		_godot_dictionary = other;
+	}
+
 public:
 public:
 	Dictionary();
 	Dictionary();
 	Dictionary(const Dictionary &other);
 	Dictionary(const Dictionary &other);

+ 2 - 4
src/core/Variant.cpp

@@ -261,14 +261,12 @@ Variant::operator RID() const {
 }
 }
 
 
 Variant::operator Dictionary() const {
 Variant::operator Dictionary() const {
-	Dictionary ret;
-	*(godot_dictionary *)&ret = godot::api->godot_variant_as_dictionary(&_godot_variant);
+	Dictionary ret(godot::api->godot_variant_as_dictionary(&_godot_variant));
 	return ret;
 	return ret;
 }
 }
 
 
 Variant::operator Array() const {
 Variant::operator Array() const {
-	Array ret;
-	*(godot_array *)&ret = godot::api->godot_variant_as_array(&_godot_variant);
+	Array ret(godot::api->godot_variant_as_array(&_godot_variant));
 	return ret;
 	return ret;
 }
 }