diff options
| author | George Marques <george@gmarqu.es> | 2020-11-30 14:27:44 -0300 |
|---|---|---|
| committer | George Marques <george@gmarqu.es> | 2020-11-30 14:49:52 -0300 |
| commit | 029fd88adbc95e32d8613d315fa81fa978ca04c3 (patch) | |
| tree | f332ce311172bce3bb28bb9aa4d9676f97b010ef /core/variant | |
| parent | b9a2787bd164602e866ecac1527020e0e1c34da8 (diff) | |
| download | redot-engine-029fd88adbc95e32d8613d315fa81fa978ca04c3.tar.gz | |
Fix VariantInternal initialization and setting of object
- Initialize Object pointer to nullptr so it's not used by mistake.
- When setting an Object check if it's a reference so refcounting works
as intended.
Diffstat (limited to 'core/variant')
| -rw-r--r-- | core/variant/variant_construct.cpp | 25 | ||||
| -rw-r--r-- | core/variant/variant_internal.h | 19 |
2 files changed, 23 insertions, 21 deletions
diff --git a/core/variant/variant_construct.cpp b/core/variant/variant_construct.cpp index 01f5b7df59..3bb3fa3634 100644 --- a/core/variant/variant_construct.cpp +++ b/core/variant/variant_construct.cpp @@ -777,18 +777,23 @@ String Variant::get_constructor_argument_name(Variant::Type p_type, int p_constr return construct_data[p_type][p_constructor].arg_names[p_argument]; } -void VariantInternal::object_assign(Variant *v, const Variant *o) { - if (o->_get_obj().obj && o->_get_obj().id.is_reference()) { - Reference *reference = static_cast<Reference *>(o->_get_obj().obj); - if (!reference->reference()) { - v->_get_obj().obj = nullptr; - v->_get_obj().id = ObjectID(); - return; +void VariantInternal::object_assign(Variant *v, const Object *o) { + if (o) { + if (o->is_reference()) { + Reference *reference = const_cast<Reference *>(static_cast<const Reference *>(o)); + if (!reference->init_ref()) { + v->_get_obj().obj = nullptr; + v->_get_obj().id = ObjectID(); + return; + } } - } - v->_get_obj().obj = const_cast<Object *>(o->_get_obj().obj); - v->_get_obj().id = o->_get_obj().id; + v->_get_obj().obj = const_cast<Object *>(o); + v->_get_obj().id = o->get_instance_id(); + } else { + v->_get_obj().obj = nullptr; + v->_get_obj().id = ObjectID(); + } } void Variant::get_constructor_list(Type p_type, List<MethodInfo> *r_list) { diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index bf7e46eed7..804abf8fbc 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -100,21 +100,14 @@ public: case Variant::PACKED_COLOR_ARRAY: init_color_array(v); break; + case Variant::OBJECT: + object_assign_null(v); + break; default: break; } } - _FORCE_INLINE_ static void set_object(Variant *v, Object *obj) { - if (obj) { - v->_get_obj().obj = obj; - v->_get_obj().id = obj->get_instance_id(); - } else { - v->_get_obj().obj = nullptr; - v->_get_obj().id = ObjectID(); - } - } - // Atomic types. _FORCE_INLINE_ static bool *get_bool(Variant *v) { return &v->_data._bool; } _FORCE_INLINE_ static const bool *get_bool(const Variant *v) { return &v->_data._bool; } @@ -285,7 +278,11 @@ public: v->clear(); } - static void object_assign(Variant *v, const Variant *o); //needs to use reference, do away + static void object_assign(Variant *v, const Object *o); // Needs Reference, so it's implemented elsewhere. + + _FORCE_INLINE_ static void object_assign(Variant *v, const Variant *o) { + object_assign(v, o->_get_obj().obj); + } _FORCE_INLINE_ static void object_assign_null(Variant *v) { v->_get_obj().obj = nullptr; |
