From 1c1d1a1e2ecf473972a39981aa3ba10245dfbd65 Mon Sep 17 00:00:00 2001 From: Mikael Hermansson Date: Wed, 12 Apr 2023 00:35:10 +0200 Subject: [PATCH] Fix crash when using base types of extension-based types from C# --- modules/mono/csharp_script.cpp | 13 +++++++++++-- modules/mono/editor/bindings_generator.cpp | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 53f696ba1b3..05595e7e452 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -66,6 +66,10 @@ #define CACHED_STRING_NAME(m_var) (CSharpLanguage::get_singleton()->get_string_names().m_var) +// Types that will be skipped over (in favor of their base types) when setting up instance bindings. +// This must be a superset of `ignored_types` in bindings_generator.cpp. +const Vector ignored_types = { "PhysicsServer2DExtension", "PhysicsServer3DExtension" }; + #ifdef TOOLS_ENABLED static bool _create_project_solution_if_needed() { CRASH_COND(CSharpLanguage::get_singleton()->get_godotsharp_editor() == nullptr); @@ -1245,11 +1249,16 @@ bool CSharpLanguage::setup_csharp_script_binding(CSharpScriptBinding &r_script_b StringName type_name = p_object->get_class_name(); - // ¯\_(ツ)_/¯ const ClassDB::ClassInfo *classinfo = ClassDB::classes.getptr(type_name); - while (classinfo && !classinfo->exposed) { + + // This skipping of GDExtension classes, as well as whatever classes are in this list of ignored types, is a + // workaround to allow GDExtension classes to be used from C# so long as they're only used through base classes that + // are registered from the engine. This will likely need to be removed whenever proper support for GDExtension + // classes is added to C#. See #75955 for more details. + while (classinfo && (!classinfo->exposed || classinfo->gdextension || ignored_types.has(classinfo->name))) { classinfo = classinfo->inherits_ptr; } + ERR_FAIL_NULL_V(classinfo, false); type_name = classinfo->name; diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index e4999a90c87..d4472f4722b 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -115,6 +115,7 @@ StringBuilder &operator<<(StringBuilder &r_sb, const char *p_cstring) { #define C_METHOD_MANAGED_FROM_SIGNAL C_NS_MONOMARSHAL ".ConvertSignalToManaged" // Types that will be ignored by the generator and won't be available in C#. +// This must be kept in sync with `ignored_types` in csharp_script.cpp const Vector ignored_types = { "PhysicsServer2DExtension", "PhysicsServer3DExtension" }; void BindingsGenerator::TypeInterface::postsetup_enum_type(BindingsGenerator::TypeInterface &r_enum_itype) {