diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2022-02-11 15:10:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-11 15:10:51 +0100 |
commit | 275f26cb5700f4877aba65779129d97c4a5965b5 (patch) | |
tree | 24e3a20a8a02ae3c283a2a4a1deff9c87c2e6c88 /core/variant/variant_internal.h | |
parent | f4478843cafc7577dc73911921e49204210acbac (diff) | |
parent | 3ad3a430638af0b64511d90d367e3b35245d9b48 (diff) | |
download | redot-engine-275f26cb5700f4877aba65779129d97c4a5965b5.tar.gz |
Merge pull request #57968 from reduz/variant-ref-assignment-fix
Diffstat (limited to 'core/variant/variant_internal.h')
-rw-r--r-- | core/variant/variant_internal.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index aaafa2f6b6..3696ffae60 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -111,6 +111,10 @@ public: } } + _FORCE_INLINE_ static bool initialize_ref(Object *object) { + return Variant::initialize_ref(object); + } + // 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; } @@ -1430,10 +1434,15 @@ struct VariantTypeConstructor<Object *> { _FORCE_INLINE_ static void variant_from_type(void *p_variant, void *p_value) { Variant *variant = reinterpret_cast<Variant *>(p_variant); VariantInitializer<Object *>::init(variant); - Object *value = *(reinterpret_cast<Object **>(p_value)); - if (value) { - VariantInternalAccessor<Object *>::set(variant, value); - VariantInternalAccessor<ObjectID>::set(variant, value->get_instance_id()); + Object *object = *(reinterpret_cast<Object **>(p_value)); + if (object) { + if (object->is_ref_counted()) { + if (!VariantInternal::initialize_ref(object)) { + return; + } + } + VariantInternalAccessor<Object *>::set(variant, object); + VariantInternalAccessor<ObjectID>::set(variant, object->get_instance_id()); } } |