summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Joannon <hello@pauljoannon.com>2024-05-09 13:46:25 +0200
committerPaul Joannon <hello@pauljoannon.com>2024-05-09 13:46:25 +0200
commit1d7085571efbe7b47c496806d490dde8dd6ad430 (patch)
tree9ef526b3e743141d30b1efdcf2a1ffdad2f4c676
parentc313312ff5301bb6537bbe7187a40fff20726850 (diff)
downloadredot-engine-1d7085571efbe7b47c496806d490dde8dd6ad430.tar.gz
CSharpScript should not own base script signals
-rw-r--r--modules/mono/csharp_script.cpp41
-rw-r--r--modules/mono/csharp_script.h4
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs14
3 files changed, 33 insertions, 26 deletions
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 1b1cd3ae4a..36c8a40ed9 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -1764,16 +1764,19 @@ void CSharpInstance::mono_object_disposed_baseref(GCHandleIntPtr p_gchandle_to_f
}
void CSharpInstance::connect_event_signals() {
- // The script signals list includes the signals declared in base scripts.
- for (CSharpScript::EventSignalInfo &signal : script->get_script_event_signals()) {
- String signal_name = signal.name;
+ const CSharpScript *top = script.ptr();
+ while (top != nullptr && top->valid) {
+ for (const CSharpScript::EventSignalInfo &signal : top->event_signals) {
+ String signal_name = signal.name;
- // TODO: Use pooling for ManagedCallable instances.
- EventSignalCallable *event_signal_callable = memnew(EventSignalCallable(owner, signal_name));
+ // TODO: Use pooling for ManagedCallable instances.
+ EventSignalCallable *event_signal_callable = memnew(EventSignalCallable(owner, signal_name));
- Callable callable(event_signal_callable);
- connected_event_signals.push_back(callable);
- owner->connect(signal_name, callable);
+ Callable callable(event_signal_callable);
+ connected_event_signals.push_back(callable);
+ owner->connect(signal_name, callable);
+ }
+ top = top->base_script.ptr();
}
}
@@ -2617,25 +2620,33 @@ bool CSharpScript::has_script_signal(const StringName &p_signal) const {
}
}
+ if (base_script.is_valid()) {
+ return base_script->has_script_signal(p_signal);
+ }
+
return false;
}
-void CSharpScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
+void CSharpScript::_get_script_signal_list(List<MethodInfo> *r_signals, bool p_include_base) const {
if (!valid) {
return;
}
- for (const EventSignalInfo &signal : get_script_event_signals()) {
+ for (const EventSignalInfo &signal : event_signals) {
r_signals->push_back(signal.method_info);
}
-}
-Vector<CSharpScript::EventSignalInfo> CSharpScript::get_script_event_signals() const {
- if (!valid) {
- return Vector<EventSignalInfo>();
+ if (!p_include_base) {
+ return;
+ }
+
+ if (base_script.is_valid()) {
+ base_script->get_script_signal_list(r_signals);
}
+}
- return event_signals;
+void CSharpScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
+ _get_script_signal_list(r_signals, true);
}
bool CSharpScript::inherits_script(const Ref<Script> &p_script) const {
diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h
index 17df3988ee..c48e1a95c9 100644
--- a/modules/mono/csharp_script.h
+++ b/modules/mono/csharp_script.h
@@ -215,6 +215,8 @@ private:
// Do not use unless you know what you are doing
static void update_script_class_info(Ref<CSharpScript> p_script);
+ void _get_script_signal_list(List<MethodInfo> *r_signals, bool p_include_base) const;
+
protected:
static void _bind_methods();
@@ -251,8 +253,6 @@ public:
bool has_script_signal(const StringName &p_signal) const override;
void get_script_signal_list(List<MethodInfo> *r_signals) const override;
- Vector<EventSignalInfo> get_script_event_signals() const;
-
bool get_property_default_value(const StringName &p_property, Variant &r_value) const override;
void get_script_property_list(List<PropertyInfo> *r_list) const override;
void update_exports() override;
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs
index a501f73daa..eef26cdd4e 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs
@@ -798,15 +798,15 @@ namespace Godot.Bridge
GetScriptTypeInfo(scriptType, outTypeInfo);
+ Type native = GodotObject.InternalGetClassNativeBase(scriptType);
+
// Methods
// Performance is not critical here as this will be replaced with source generators.
using var methods = new Collections.Array();
Type? top = scriptType;
- Type native = GodotObject.InternalGetClassNativeBase(scriptType);
-
- if (scriptType != null && scriptType != native)
+ if (scriptType != native)
{
var methodList = GetMethodListForType(scriptType);
@@ -910,11 +910,9 @@ namespace Godot.Bridge
// Performance is not critical here as this will be replaced with source generators.
using var signals = new Collections.Dictionary();
- top = scriptType;
-
- while (top != null && top != native)
+ if (scriptType != native)
{
- var signalList = GetSignalListForType(top);
+ var signalList = GetSignalListForType(scriptType);
if (signalList != null)
{
@@ -949,8 +947,6 @@ namespace Godot.Bridge
signals.Add(signalName, signalParams);
}
}
-
- top = top.BaseType;
}
*outEventSignalsDest = NativeFuncs.godotsharp_dictionary_new_copy(