summaryrefslogtreecommitdiffstats
path: root/src/core/Variant.cpp
diff options
context:
space:
mode:
authorMarc Gilleron <marc.gilleron@gmail.com>2021-01-07 01:05:12 +0000
committerMarc Gilleron <marc.gilleron@gmail.com>2021-01-07 01:05:12 +0000
commitfb71edd45b2473bf0ac502c777a1850fb564087e (patch)
tree5d7a48365313cd54a2a763efa85728c36cf7ed86 /src/core/Variant.cpp
parent43828ebb3931b9117ad57f08cc457e052fdfd631 (diff)
downloadredot-cpp-fb71edd45b2473bf0ac502c777a1850fb564087e.tar.gz
Fix container and string leaks
Some functions return a new instance of such containers, but instead we made a copy of them, without taking ownership of the original created by the function. Now we use a specific constructor taking ownership on the godot_* struct.
Diffstat (limited to 'src/core/Variant.cpp')
-rw-r--r--src/core/Variant.cpp53
1 files changed, 22 insertions, 31 deletions
diff --git a/src/core/Variant.cpp b/src/core/Variant.cpp
index 86d2f91..9e3927f 100644
--- a/src/core/Variant.cpp
+++ b/src/core/Variant.cpp
@@ -205,9 +205,8 @@ Variant::operator double() const {
return godot::api->godot_variant_as_real(&_godot_variant);
}
Variant::operator String() const {
- String ret;
- *(godot_string *)&ret = godot::api->godot_variant_as_string(&_godot_variant);
- return ret;
+ godot_string s = godot::api->godot_variant_as_string(&_godot_variant);
+ return String(s);
}
Variant::operator Vector2() const {
godot_vector2 s = godot::api->godot_variant_as_vector2(&_godot_variant);
@@ -251,9 +250,8 @@ Variant::operator Color() const {
return *(Color *)&s;
}
Variant::operator NodePath() const {
- NodePath ret;
- *(godot_node_path *)&ret = godot::api->godot_variant_as_node_path(&_godot_variant);
- return ret;
+ godot_node_path ret = godot::api->godot_variant_as_node_path(&_godot_variant);
+ return NodePath(ret);
}
Variant::operator RID() const {
godot_rid s = godot::api->godot_variant_as_rid(&_godot_variant);
@@ -271,52 +269,45 @@ Variant::operator Array() const {
}
Variant::operator PoolByteArray() const {
- PoolByteArray ret;
- *(godot_pool_byte_array *)&ret = godot::api->godot_variant_as_pool_byte_array(&_godot_variant);
- return ret;
+ godot_pool_byte_array ret = godot::api->godot_variant_as_pool_byte_array(&_godot_variant);
+ return PoolByteArray(ret);
}
Variant::operator PoolIntArray() const {
- PoolIntArray ret;
- *(godot_pool_int_array *)&ret = godot::api->godot_variant_as_pool_int_array(&_godot_variant);
- return ret;
+ godot_pool_int_array ret = godot::api->godot_variant_as_pool_int_array(&_godot_variant);
+ return PoolIntArray(ret);
}
Variant::operator PoolRealArray() const {
- PoolRealArray ret;
- *(godot_pool_real_array *)&ret = godot::api->godot_variant_as_pool_real_array(&_godot_variant);
- return ret;
+ godot_pool_real_array ret = godot::api->godot_variant_as_pool_real_array(&_godot_variant);
+ return PoolRealArray(ret);
}
Variant::operator PoolStringArray() const {
- PoolStringArray ret;
- *(godot_pool_string_array *)&ret = godot::api->godot_variant_as_pool_string_array(&_godot_variant);
- return ret;
+ godot_pool_string_array ret = godot::api->godot_variant_as_pool_string_array(&_godot_variant);
+ return PoolStringArray(ret);
}
Variant::operator PoolVector2Array() const {
- PoolVector2Array ret;
- *(godot_pool_vector2_array *)&ret = godot::api->godot_variant_as_pool_vector2_array(&_godot_variant);
- return ret;
+ godot_pool_vector2_array ret = godot::api->godot_variant_as_pool_vector2_array(&_godot_variant);
+ return PoolVector2Array(ret);
}
Variant::operator PoolVector3Array() const {
- PoolVector3Array ret;
- *(godot_pool_vector3_array *)&ret = godot::api->godot_variant_as_pool_vector3_array(&_godot_variant);
- return ret;
+ godot_pool_vector3_array ret = godot::api->godot_variant_as_pool_vector3_array(&_godot_variant);
+ return PoolVector3Array(ret);
}
Variant::operator PoolColorArray() const {
- PoolColorArray ret;
- *(godot_pool_color_array *)&ret = godot::api->godot_variant_as_pool_color_array(&_godot_variant);
- return ret;
+ godot_pool_color_array ret = godot::api->godot_variant_as_pool_color_array(&_godot_variant);
+ return PoolColorArray(ret);
}
Variant::operator godot_object *() const {
return godot::api->godot_variant_as_object(&_godot_variant);
}
Variant::Type Variant::get_type() const {
- return (Type)godot::api->godot_variant_get_type(&_godot_variant);
+ return static_cast<Type>(godot::api->godot_variant_get_type(&_godot_variant));
}
Variant Variant::call(const String &method, const Variant **args, const int arg_count) {
- Variant v;
- *(godot_variant *)&v = godot::api->godot_variant_call(&_godot_variant, (godot_string *)&method, (const godot_variant **)args, arg_count, nullptr);
- return v;
+ godot_variant v = godot::api->godot_variant_call(
+ &_godot_variant, (godot_string *)&method, (const godot_variant **)args, arg_count, nullptr);
+ return Variant(v);
}
bool Variant::has_method(const String &method) {