Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSharpScript should not own method infos of the base class #91564

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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;
raulsntos marked this conversation as resolved.
Show resolved Hide resolved
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