GDScript: Use linked list for instance tracking

This commit is contained in:
HolonProduction
2026-04-04 14:38:36 +02:00
parent ee713ccb7c
commit 3d8ab757d5
3 changed files with 23 additions and 56 deletions
+16 -15
View File
@@ -170,7 +170,7 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
/* STEP 2, INITIALIZE AND CONSTRUCT */
{
MutexLock lock(GDScriptLanguage::singleton->mutex);
instances.insert(instance->owner);
instances.add(&instance->script_instance_list);
}
_super_implicit_constructor(this, instance, r_error);
@@ -180,7 +180,7 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
instance->owner->set_script_instance(nullptr);
{
MutexLock lock(GDScriptLanguage::singleton->mutex);
instances.erase(p_owner);
instances.remove(&instance->script_instance_list);
}
ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance: " + error_text);
}
@@ -198,7 +198,7 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco
instance->owner->set_script_instance(nullptr);
{
MutexLock lock(GDScriptLanguage::singleton->mutex);
instances.erase(p_owner);
instances.remove(&instance->script_instance_list);
}
ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance: " + error_text);
}
@@ -436,9 +436,12 @@ PlaceHolderScriptInstance *GDScript::placeholder_instance_create(Object *p_this)
}
bool GDScript::instance_has(const Object *p_this) const {
MutexLock lock(GDScriptLanguage::singleton->mutex);
GDScriptInstance *instance = dynamic_cast<GDScriptInstance *>(p_this->get_script_instance());
return instances.has((Object *)p_this);
if (instance == nullptr) {
return false;
}
return instance->script.ptr() == this;
}
bool GDScript::has_source_code() const {
@@ -750,7 +753,7 @@ Error GDScript::reload(bool p_keep_state) {
{
MutexLock lock(GDScriptLanguage::singleton->mutex);
has_instances = instances.size();
has_instances = instances.first() != nullptr;
}
// Check condition but reset flag before early return
@@ -2045,8 +2048,8 @@ GDScriptInstance::~GDScriptInstance() {
}
}
if (script.is_valid() && owner) {
script->instances.erase(owner);
if (script.is_valid()) {
script->instances.remove(&script_instance_list);
}
}
@@ -2472,15 +2475,13 @@ void GDScriptLanguage::reload_scripts(const Array &p_scripts, bool p_soft_reload
//save state and remove script from instances
HashMap<ObjectID, List<Pair<StringName, Variant>>> &map = to_reload[scr];
while (scr->instances.front()) {
Object *obj = scr->instances.front()->get();
while (scr->instances.first()) {
GDScriptInstance *instance = scr->instances.first()->self();
//save instance info
List<Pair<StringName, Variant>> state;
if (obj->get_script_instance()) {
obj->get_script_instance()->get_property_state(state);
map[obj->get_instance_id()] = state;
obj->set_script(Variant());
}
instance->get_property_state(state);
map[instance->get_owner()->get_instance_id()] = state;
instance->get_owner()->set_script(Variant());
}
//same thing for placeholders