Skip to content

Commit

Permalink
Merge pull request #91564 from paulloz/huisedenanhai-fix_csharp_metho…
Browse files Browse the repository at this point in the history
…d_info

CSharpScript should not own method infos of the base class
  • Loading branch information
akien-mga committed May 10, 2024
2 parents c469ab0 + 1d70855 commit b7783a4
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 37 deletions.
50 changes: 27 additions & 23 deletions modules/mono/csharp_script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1596,14 +1596,7 @@ void CSharpInstance::get_method_list(List<MethodInfo> *p_list) const {
return;
}

const CSharpScript *top = script.ptr();
while (top != nullptr) {
for (const CSharpScript::CSharpMethodInfo &E : top->methods) {
p_list->push_back(E.method_info);
}

top = top->base_script.ptr();
}
script->get_script_method_list(p_list);
}

bool CSharpInstance::has_method(const StringName &p_method) const {
Expand Down Expand Up @@ -1771,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();
}
}

Expand Down Expand Up @@ -2624,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 {
Expand Down
4 changes: 2 additions & 2 deletions modules/mono/csharp_script.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ class CSharpScript : public Script {
// 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();

Expand Down Expand Up @@ -251,8 +253,6 @@ class CSharpScript : public Script {
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -798,17 +798,17 @@ static void AppendTypeName(StringBuilder sb, Type type)

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(top);

while (top != null && top != native)
if (scriptType != native)
{
var methodList = GetMethodListForType(top);
var methodList = GetMethodListForType(scriptType);

if (methodList != null)
{
Expand Down Expand Up @@ -859,8 +859,6 @@ static void AppendTypeName(StringBuilder sb, Type type)
methods.Add(methodInfo);
}
}

top = top.BaseType;
}

*outMethodsDest = NativeFuncs.godotsharp_array_new_copy(
Expand Down Expand Up @@ -912,11 +910,9 @@ static void AppendTypeName(StringBuilder sb, Type type)
// 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)
{
Expand Down Expand Up @@ -951,8 +947,6 @@ static void AppendTypeName(StringBuilder sb, Type type)
signals.Add(signalName, signalParams);
}
}

top = top.BaseType;
}

*outEventSignalsDest = NativeFuncs.godotsharp_dictionary_new_copy(
Expand Down

0 comments on commit b7783a4

Please sign in to comment.