Merge pull request #20458 from neikeq/igiveuponbranchnames
Mono module bug fixes
This commit is contained in:
commit
7e75b9b2c0
4 changed files with 52 additions and 33 deletions
|
|
@ -638,33 +638,41 @@ void CSharpLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft
|
|||
#ifdef TOOLS_ENABLED
|
||||
void CSharpLanguage::reload_assemblies_if_needed(bool p_soft_reload) {
|
||||
|
||||
if (gdmono->is_runtime_initialized()) {
|
||||
if (!gdmono->is_runtime_initialized())
|
||||
return;
|
||||
|
||||
GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
|
||||
GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
|
||||
|
||||
String name = ProjectSettings::get_singleton()->get("application/config/name");
|
||||
if (name.empty()) {
|
||||
name = "UnnamedProject";
|
||||
}
|
||||
String name = ProjectSettings::get_singleton()->get("application/config/name");
|
||||
if (name.empty()) {
|
||||
name = "UnnamedProject";
|
||||
}
|
||||
|
||||
if (proj_assembly) {
|
||||
String proj_asm_path = proj_assembly->get_path();
|
||||
name += ".dll";
|
||||
|
||||
if (!FileAccess::exists(proj_assembly->get_path())) {
|
||||
// Maybe it wasn't loaded from the default path, so check this as well
|
||||
proj_asm_path = GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name);
|
||||
if (!FileAccess::exists(proj_asm_path))
|
||||
return; // No assembly to load
|
||||
}
|
||||
if (proj_assembly) {
|
||||
String proj_asm_path = proj_assembly->get_path();
|
||||
|
||||
if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
|
||||
return; // Already up to date
|
||||
} else {
|
||||
if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name)))
|
||||
if (!FileAccess::exists(proj_assembly->get_path())) {
|
||||
// Maybe it wasn't loaded from the default path, so check this as well
|
||||
proj_asm_path = GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name);
|
||||
if (!FileAccess::exists(proj_asm_path))
|
||||
return; // No assembly to load
|
||||
}
|
||||
|
||||
if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
|
||||
return; // Already up to date
|
||||
} else {
|
||||
if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name)))
|
||||
return; // No assembly to load
|
||||
}
|
||||
|
||||
if (!gdmono->get_core_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_CORE))
|
||||
return; // The core API assembly to load is invalidated
|
||||
|
||||
if (!gdmono->get_editor_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_EDITOR))
|
||||
return; // The editor API assembly to load is invalidated
|
||||
|
||||
#ifndef NO_THREADS
|
||||
lock->lock();
|
||||
#endif
|
||||
|
|
@ -1963,8 +1971,6 @@ Variant CSharpScript::_new(const Variant **p_args, int p_argcount, Variant::Call
|
|||
|
||||
ScriptInstance *CSharpScript::instance_create(Object *p_this) {
|
||||
|
||||
ERR_FAIL_COND_V(!valid, NULL);
|
||||
|
||||
if (!tool && !ScriptServer::is_scripting_enabled()) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(CSharpLanguage::get_singleton(), Ref<Script>(this), p_this));
|
||||
|
|
@ -1981,13 +1987,15 @@ ScriptInstance *CSharpScript::instance_create(Object *p_this) {
|
|||
// The project assembly is not loaded
|
||||
ERR_EXPLAIN("Cannot instance script because the project assembly is not loaded. Script: " + get_path());
|
||||
ERR_FAIL_V(NULL);
|
||||
} else {
|
||||
// The project assembly is loaded, but the class could not found
|
||||
ERR_EXPLAIN("Cannot instance script because the class '" + name + "' could not be found. Script: " + get_path());
|
||||
ERR_FAIL_V(NULL);
|
||||
}
|
||||
|
||||
// The project assembly is loaded, but the class could not found
|
||||
ERR_EXPLAIN("Cannot instance script because the class '" + name + "' could not be found. Script: " + get_path());
|
||||
ERR_FAIL_V(NULL);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_V(!valid, NULL);
|
||||
|
||||
if (native) {
|
||||
String native_name = native->get_name();
|
||||
if (!ClassDB::is_parent_class(p_this->get_class_name(), native_name)) {
|
||||
|
|
@ -2040,6 +2048,9 @@ void CSharpScript::set_source_code(const String &p_code) {
|
|||
|
||||
bool CSharpScript::has_method(const StringName &p_method) const {
|
||||
|
||||
if (!script_class)
|
||||
return false;
|
||||
|
||||
return script_class->has_fetched_method_unknown_params(p_method);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -322,6 +322,12 @@ GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, boo
|
|||
return get_method(method);
|
||||
}
|
||||
|
||||
void *GDMonoClass::get_method_thunk(const StringName &p_name, int p_params_count) {
|
||||
|
||||
GDMonoMethod *method = get_method(p_name, p_params_count);
|
||||
return method ? method->get_thunk() : NULL;
|
||||
}
|
||||
|
||||
GDMonoField *GDMonoClass::get_field(const StringName &p_name) {
|
||||
|
||||
Map<StringName, GDMonoField *>::Element *result = fields.find(p_name);
|
||||
|
|
|
|||
|
|
@ -133,6 +133,8 @@ public:
|
|||
GDMonoMethod *get_method(MonoMethod *p_raw_method, const StringName &p_name, int p_params_count);
|
||||
GDMonoMethod *get_method_with_desc(const String &p_description, bool p_include_namespace);
|
||||
|
||||
void *get_method_thunk(const StringName &p_name, int p_params_count = 0);
|
||||
|
||||
GDMonoField *get_field(const StringName &p_name);
|
||||
const Vector<GDMonoField *> &get_all_fields();
|
||||
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ void update_corlib_cache() {
|
|||
|
||||
#ifdef DEBUG_ENABLED
|
||||
CACHE_CLASS_AND_CHECK(System_Diagnostics_StackTrace, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Diagnostics", "StackTrace"));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, (StackTrace_GetFrames)CACHED_CLASS(System_Diagnostics_StackTrace)->get_method("GetFrames")->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, (StackTrace_GetFrames)CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_thunk("GetFrames"));
|
||||
CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(bool)", true));
|
||||
CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_Exception_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(System.Exception,bool)", true));
|
||||
#endif
|
||||
|
|
@ -234,16 +234,16 @@ void update_godot_api_cache() {
|
|||
CACHE_FIELD_AND_CHECK(NodePath, ptr, CACHED_CLASS(NodePath)->get_field(BINDINGS_PTR_FIELD));
|
||||
CACHE_FIELD_AND_CHECK(RID, ptr, CACHED_CLASS(RID)->get_field(BINDINGS_PTR_FIELD));
|
||||
|
||||
CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, (Array_GetPtr)GODOT_API_CLASS(Array)->get_method("GetPtr", 0)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, (Dictionary_GetPtr)GODOT_API_CLASS(Dictionary)->get_method("GetPtr", 0)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IsArrayGenericType, (IsArrayGenericType)GODOT_API_CLASS(MarshalUtils)->get_method("IsArrayGenericType", 1)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IsDictionaryGenericType, (IsDictionaryGenericType)GODOT_API_CLASS(MarshalUtils)->get_method("IsDictionaryGenericType", 1)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, (SignalAwaiter_SignalCallback)GODOT_API_CLASS(SignalAwaiter)->get_method("SignalCallback", 1)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, (SignalAwaiter_FailureCallback)GODOT_API_CLASS(SignalAwaiter)->get_method("FailureCallback", 0)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, (GodotTaskScheduler_Activate)GODOT_API_CLASS(GodotTaskScheduler)->get_method("Activate", 0)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, (Array_GetPtr)GODOT_API_CLASS(Array)->get_method_thunk("GetPtr", 0));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, (Dictionary_GetPtr)GODOT_API_CLASS(Dictionary)->get_method_thunk("GetPtr", 0));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IsArrayGenericType, (IsArrayGenericType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("IsArrayGenericType", 1));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IsDictionaryGenericType, (IsDictionaryGenericType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("IsDictionaryGenericType", 1));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, (SignalAwaiter_SignalCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("SignalCallback", 1));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, (SignalAwaiter_FailureCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("FailureCallback", 0));
|
||||
CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, (GodotTaskScheduler_Activate)GODOT_API_CLASS(GodotTaskScheduler)->get_method_thunk("Activate", 0));
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, (DebugUtils_StackFrameInfo)GODOT_API_CLASS(DebuggingUtils)->get_method("GetStackFrameInfo", 4)->get_thunk());
|
||||
CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, (DebugUtils_StackFrameInfo)GODOT_API_CLASS(DebuggingUtils)->get_method_thunk("GetStackFrameInfo", 4));
|
||||
#endif
|
||||
|
||||
// TODO Move to CSharpLanguage::init()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue