Merge pull request #57968 from reduz/variant-ref-assignment-fix

This commit is contained in:
Rémi Verschelde 2022-02-11 15:10:51 +01:00 committed by GitHub
commit 275f26cb57
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 4 deletions

View file

@ -1023,6 +1023,13 @@ bool Variant::is_null() const {
}
}
bool Variant::initialize_ref(Object *p_object) {
RefCounted *ref_counted = const_cast<RefCounted *>(static_cast<const RefCounted *>(p_object));
if (!ref_counted->init_ref()) {
return false;
}
return true;
}
void Variant::reference(const Variant &p_variant) {
switch (type) {
case NIL:

View file

@ -216,6 +216,7 @@ private:
} _data alignas(8);
void reference(const Variant &p_variant);
static bool initialize_ref(Object *p_object);
void _clear_internal();

View file

@ -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());
}
}