mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Hot-reload only changed scripts
This commit is contained in:
parent
13a0d6e9b2
commit
cde478bda6
17 changed files with 113 additions and 38 deletions
|
@ -36,6 +36,7 @@
|
|||
#include "core/debugger/engine_profiler.h"
|
||||
#include "core/debugger/script_debugger.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
|
@ -515,8 +516,9 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
|
|||
_send_stack_vars(globals, globals_vals, 2);
|
||||
|
||||
} else if (command == "reload_scripts") {
|
||||
script_paths_to_reload = data;
|
||||
} else if (command == "reload_all_scripts") {
|
||||
reload_all_scripts = true;
|
||||
|
||||
} else if (command == "breakpoint") {
|
||||
ERR_FAIL_COND(data.size() < 3);
|
||||
bool set = data[2];
|
||||
|
@ -591,19 +593,36 @@ void RemoteDebugger::poll_events(bool p_is_idle) {
|
|||
}
|
||||
|
||||
// Reload scripts during idle poll only.
|
||||
if (p_is_idle && reload_all_scripts) {
|
||||
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
|
||||
ScriptServer::get_language(i)->reload_all_scripts();
|
||||
if (p_is_idle) {
|
||||
if (reload_all_scripts) {
|
||||
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
|
||||
ScriptServer::get_language(i)->reload_all_scripts();
|
||||
}
|
||||
reload_all_scripts = false;
|
||||
} else if (!script_paths_to_reload.is_empty()) {
|
||||
Array scripts_to_reload;
|
||||
for (int i = 0; i < script_paths_to_reload.size(); ++i) {
|
||||
String path = script_paths_to_reload[i];
|
||||
Error err = OK;
|
||||
Ref<Script> script = ResourceLoader::load(path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &err);
|
||||
ERR_CONTINUE_MSG(err != OK, vformat("Could not reload script '%s': %s", path, error_names[err]));
|
||||
ERR_CONTINUE_MSG(script.is_null(), vformat("Could not reload script '%s': Not a script!", path, error_names[err]));
|
||||
scripts_to_reload.push_back(script);
|
||||
}
|
||||
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
|
||||
ScriptServer::get_language(i)->reload_scripts(scripts_to_reload, true);
|
||||
}
|
||||
}
|
||||
reload_all_scripts = false;
|
||||
script_paths_to_reload.clear();
|
||||
}
|
||||
}
|
||||
|
||||
Error RemoteDebugger::_core_capture(const String &p_cmd, const Array &p_data, bool &r_captured) {
|
||||
r_captured = true;
|
||||
if (p_cmd == "reload_scripts") {
|
||||
script_paths_to_reload = p_data;
|
||||
} else if (p_cmd == "reload_all_scripts") {
|
||||
reload_all_scripts = true;
|
||||
|
||||
} else if (p_cmd == "breakpoint") {
|
||||
ERR_FAIL_COND_V(p_data.size() < 3, ERR_INVALID_DATA);
|
||||
bool set = p_data[2];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue