mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 06:01:14 +00:00
Fix properties being lost when reloading placeholder GDScript instance
During reloading in `GDScriptLanguage::reload_all_scripts` a placeholder instance that must remain so is replaced with a new placeholder instance. The state is then restored by calling `ScriptInstance::set` for each property. This does not work if the script is missing the properties due to build/parse failing. The fix for such cases is to call `placeholder_set_fallback` instead of `set` on the script instance. I took this chance to move the `build_failed` flag from `PlaceHolderScriptInstance` to `Script`. That improves the code a lot. I also renamed it to `placeholder_fallback_enabled` which is a much better name (`build_failed` could lead to misunderstandings).
This commit is contained in:
parent
9a8569d434
commit
ea85ff0dc2
6 changed files with 51 additions and 40 deletions
|
|
@ -783,7 +783,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
|
|||
|
||||
// Even though build didn't fail, this tells the placeholder to keep properties and
|
||||
// it allows using property_set_fallback for restoring the state without a valid script.
|
||||
placeholder->set_build_failed(true);
|
||||
scr->placeholder_fallback_enabled = true;
|
||||
|
||||
// Restore Variant properties state, it will be kept by the placeholder until the next script reloading
|
||||
for (List<Pair<StringName, Variant> >::Element *G = scr->pending_reload_state[obj_id].properties.front(); G; G = G->next()) {
|
||||
|
|
@ -1830,12 +1830,10 @@ void CSharpScript::_update_exports_values(Map<StringName, Variant> &values, List
|
|||
bool CSharpScript::_update_exports() {
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (!valid) {
|
||||
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
||||
E->get()->set_build_failed(true);
|
||||
}
|
||||
placeholder_fallback_enabled = true; // until proven otherwise
|
||||
|
||||
if (!valid)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool changed = false;
|
||||
|
||||
|
|
@ -1944,6 +1942,8 @@ bool CSharpScript::_update_exports() {
|
|||
tmp_object = NULL;
|
||||
}
|
||||
|
||||
placeholder_fallback_enabled = false;
|
||||
|
||||
if (placeholders.size()) {
|
||||
// Update placeholders if any
|
||||
Map<StringName, Variant> values;
|
||||
|
|
@ -1951,7 +1951,6 @@ bool CSharpScript::_update_exports() {
|
|||
_update_exports_values(values, propnames);
|
||||
|
||||
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
||||
E->get()->set_build_failed(false);
|
||||
E->get()->update(propnames, values);
|
||||
}
|
||||
}
|
||||
|
|
@ -2666,6 +2665,7 @@ CSharpScript::CSharpScript() :
|
|||
|
||||
#ifdef TOOLS_ENABLED
|
||||
source_changed_cache = false;
|
||||
placeholder_fallback_enabled = false;
|
||||
exports_invalidated = true;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue