summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsheepandshepherd <sheepandshepherd@hotmail.com>2019-12-04 21:12:59 +0100
committersheepandshepherd <sheepandshepherd@hotmail.com>2020-01-31 00:08:02 +0100
commit66c671b59dece97d523478cae7c602de6d423aa4 (patch)
treed2206102a8d43efeef21f3fe740ce3e36d4dbb6a
parentaba8766618c6aa40c6f7b40b513e8e47cfa807f4 (diff)
downloadredot-cpp-66c671b59dece97d523478cae7c602de6d423aa4.tar.gz
Add C conversion constructors to fix leak of default-constructed empty arrays
-rw-r--r--include/core/Array.hpp5
-rw-r--r--include/core/Dictionary.hpp5
-rw-r--r--src/core/Variant.cpp6
3 files changed, 12 insertions, 4 deletions
diff --git a/include/core/Array.hpp b/include/core/Array.hpp
index d766c54..3d13914 100644
--- a/include/core/Array.hpp
+++ b/include/core/Array.hpp
@@ -57,6 +57,11 @@ class Object;
class Array {
godot_array _godot_array;
+ friend class Variant;
+ inline explicit Array(const godot_array &other) {
+ _godot_array = other;
+ }
+
public:
Array();
Array(const Array &other);
diff --git a/include/core/Dictionary.hpp b/include/core/Dictionary.hpp
index ec97602..7f40adc 100644
--- a/include/core/Dictionary.hpp
+++ b/include/core/Dictionary.hpp
@@ -12,6 +12,11 @@ namespace godot {
class Dictionary {
godot_dictionary _godot_dictionary;
+ friend Variant::operator Dictionary() const;
+ inline explicit Dictionary(const godot_dictionary &other) {
+ _godot_dictionary = other;
+ }
+
public:
Dictionary();
Dictionary(const Dictionary &other);
diff --git a/src/core/Variant.cpp b/src/core/Variant.cpp
index 4c5cfe6..86d2f91 100644
--- a/src/core/Variant.cpp
+++ b/src/core/Variant.cpp
@@ -261,14 +261,12 @@ Variant::operator RID() 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;
}
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;
}