GDScript: Use linked list for instance tracking
This commit is contained in:
@@ -3075,45 +3075,8 @@ Error GDScriptCompiler::_compile_class(GDScript *p_script, const GDScriptParser:
|
||||
//validate instances if keeping state
|
||||
|
||||
if (p_keep_state) {
|
||||
for (RBSet<Object *>::Element *E = p_script->instances.front(); E;) {
|
||||
RBSet<Object *>::Element *N = E->next();
|
||||
|
||||
ScriptInstance *si = E->get()->get_script_instance();
|
||||
if (si->is_placeholder()) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
PlaceHolderScriptInstance *psi = static_cast<PlaceHolderScriptInstance *>(si);
|
||||
|
||||
if (p_script->is_tool()) {
|
||||
//re-create as an instance
|
||||
p_script->placeholders.erase(psi); //remove placeholder
|
||||
|
||||
GDScriptInstance *instance = memnew(GDScriptInstance);
|
||||
instance->members.resize(p_script->member_indices.size());
|
||||
instance->script = Ref<GDScript>(p_script);
|
||||
instance->owner = E->get();
|
||||
|
||||
//needed for hot reloading
|
||||
for (const KeyValue<StringName, GDScript::MemberInfo> &F : p_script->member_indices) {
|
||||
instance->member_indices_cache[F.key] = F.value.index;
|
||||
}
|
||||
instance->owner->set_script_instance(instance);
|
||||
|
||||
/* STEP 2, INITIALIZE AND CONSTRUCT */
|
||||
|
||||
Callable::CallError ce;
|
||||
p_script->initializer->call(instance, nullptr, 0, ce);
|
||||
|
||||
if (ce.error != Callable::CallError::CALL_OK) {
|
||||
//well, tough luck, not gonna do anything here
|
||||
}
|
||||
}
|
||||
#endif // TOOLS_ENABLED
|
||||
} else {
|
||||
GDScriptInstance *gi = static_cast<GDScriptInstance *>(si);
|
||||
gi->reload_members();
|
||||
}
|
||||
|
||||
E = N;
|
||||
for (SelfList<GDScriptInstance> *E = p_script->instances.first(); E; E = E->next()) {
|
||||
E->self()->reload_members();
|
||||
}
|
||||
}
|
||||
#endif //DEBUG_ENABLED
|
||||
|
||||
Reference in New Issue
Block a user