Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions core/variant/variant_construct.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
19 changes: 8 additions & 11 deletions core/variant/variant_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,21 +100,14 @@ class VariantInternal {
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; }
Expand Down Expand Up @@ -285,7 +278,11 @@ class VariantInternal {
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;
Expand Down
2 changes: 1 addition & 1 deletion modules/gdscript/gdscript_vm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1653,7 +1653,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
VariantInternal::initialize(ret, Variant::OBJECT);
Object **ret_opaque = VariantInternal::get_object(ret);
method->ptrcall(base_obj, argptrs, ret_opaque);
VariantInternal::set_object(ret, *ret_opaque);
VariantInternal::object_assign(ret, *ret_opaque); // Set so ID is correct too.

#ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling) {
Expand Down