summaryrefslogtreecommitdiff
path: root/modules/mono
diff options
context:
space:
mode:
authorIgnacio Etcheverry <ignalfonsore@gmail.com>2019-01-21 22:44:05 +0100
committerIgnacio Etcheverry <ignalfonsore@gmail.com>2019-01-21 22:44:09 +0100
commit077e48977384a1b1c2e527e5df9012b64b56e847 (patch)
tree22b15dcd099a77615d64aaef6c516b2a95e68f74 /modules/mono
parent6fa632b82121aff5537d627364d2f10fdeafc418 (diff)
Mono: Add assembly reloading to running games
Add environment variable to specify a custom --debugger-agent for mono.
Diffstat (limited to 'modules/mono')
-rw-r--r--modules/mono/csharp_script.cpp27
-rw-r--r--modules/mono/editor/mono_bottom_panel.cpp8
-rw-r--r--modules/mono/mono_gd/gd_mono.cpp11
3 files changed, 19 insertions, 27 deletions
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 13f8385745..02220ab52f 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -608,30 +608,9 @@ struct CSharpScriptDepSort {
void CSharpLanguage::reload_all_scripts() {
#ifdef DEBUG_ENABLED
-
- List<Ref<CSharpScript> > scripts;
-
- {
- SCOPED_MUTEX_LOCK(script_instances_mutex);
-
- SelfList<CSharpScript> *elem = script_list.first();
- while (elem) {
- if (elem->self()->get_path().is_resource_file()) {
- scripts.push_back(Ref<CSharpScript>(elem->self())); //cast to gdscript to avoid being erased by accident
- }
- elem = elem->next();
- }
- }
-
- //as scripts are going to be reloaded, must proceed without locking here
-
- scripts.sort_custom<CSharpScriptDepSort>(); //update in inheritance dependency order
-
- for (List<Ref<CSharpScript> >::Element *E = scripts.front(); E; E = E->next()) {
- E->get()->load_source_code(E->get()->get_path());
- E->get()->reload(true);
+ if (is_assembly_reloading_needed()) {
+ reload_assemblies(false);
}
-
#endif
}
@@ -829,7 +808,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
CSharpScript::StateBackup &state_backup = scr->pending_reload_state[obj_id];
// Backup placeholder script instance state before replacing it with a script instance
- obj->get_script_instance()->get_property_state(state_backup.properties);
+ si->get_property_state(state_backup.properties);
ScriptInstance *script_instance = scr->instance_create(obj);
diff --git a/modules/mono/editor/mono_bottom_panel.cpp b/modules/mono/editor/mono_bottom_panel.cpp
index feebdb380b..55a334bc4e 100644
--- a/modules/mono/editor/mono_bottom_panel.cpp
+++ b/modules/mono/editor/mono_bottom_panel.cpp
@@ -30,6 +30,9 @@
#include "mono_bottom_panel.h"
+#include "editor/plugins/script_editor_plugin.h"
+#include "editor/script_editor_debugger.h"
+
#include "../csharp_script.h"
#include "../godotsharp_dirs.h"
#include "csharp_project.h"
@@ -160,7 +163,12 @@ void MonoBottomPanel::_build_project_pressed() {
bool build_success = GodotSharpBuilds::get_singleton()->build_project_blocking("Tools");
if (build_success) {
+ // Notify running game for hot-reload
+ ScriptEditor::get_singleton()->get_debugger()->reload_scripts();
+
+ // Hot-reload in the editor
MonoReloadNode::get_singleton()->restart_reload_timer();
+
if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) {
CSharpLanguage::get_singleton()->reload_assemblies(false);
}
diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp
index a422224fcb..42a6fe1ef8 100644
--- a/modules/mono/mono_gd/gd_mono.cpp
+++ b/modules/mono/mono_gd/gd_mono.cpp
@@ -130,9 +130,14 @@ void gdmono_debug_init() {
}
#endif
- CharString da_args = String("--debugger-agent=transport=dt_socket,address=127.0.0.1:" + itos(da_port) +
- ",embedding=1,server=y,suspend=" + (da_suspend ? "y,timeout=" + itos(da_timeout) : "n"))
- .utf8();
+ CharString da_args = OS::get_singleton()->get_environment("GODOT_MONO_DEBUGGER_AGENT").utf8();
+
+ if (da_args == "") {
+ da_args = String("--debugger-agent=transport=dt_socket,address=127.0.0.1:" + itos(da_port) +
+ ",embedding=1,server=y,suspend=" + (da_suspend ? "y,timeout=" + itos(da_timeout) : "n"))
+ .utf8();
+ }
+
// --debugger-agent=help
const char *options[] = {
"--soft-breakpoints",