From ce4e2ab7ea4dc0f3d52d11543f706f211cc752f3 Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Thu, 4 May 2023 17:39:03 -0400 Subject: [PATCH 01/14] Add mono hot reload support for updating parameter name --- src/mono/mono/component/hot_reload.c | 24 +---------------------- src/mono/mono/metadata/metadata.c | 6 +++++- src/mono/mono/metadata/reflection-cache.h | 24 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/mono/mono/component/hot_reload.c b/src/mono/mono/component/hot_reload.c index ac8236f78775ad..47c3120f25c4ea 100644 --- a/src/mono/mono/component/hot_reload.c +++ b/src/mono/mono/component/hot_reload.c @@ -1600,29 +1600,7 @@ apply_enclog_pass1 (MonoImage *image_base, MonoImage *image_dmeta, DeltaInfo *de } case MONO_TABLE_PARAM: { *should_invalidate_transformed_code = true; - if (!is_addition) { - /* We only allow modifications where the parameter name doesn't change. */ - uint32_t base_param [MONO_PARAM_SIZE]; - uint32_t upd_param [MONO_PARAM_SIZE]; - int mapped_token = hot_reload_relative_delta_index (image_dmeta, delta_info, mono_metadata_make_token (token_table, token_index)); - g_assert (mapped_token != -1); - mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_METADATA_UPDATE, "row[0x%02x]:0x%08x PARAM update. mapped index = 0x%08x\n", i, log_token, mapped_token); - - mono_metadata_decode_row (&image_dmeta->tables [MONO_TABLE_PARAM], mapped_token - 1, upd_param, MONO_PARAM_SIZE); - mono_metadata_decode_row (&image_base->tables [MONO_TABLE_PARAM], token_index - 1, base_param, MONO_PARAM_SIZE); - - const char *base_name = mono_metadata_string_heap (image_base, base_param [MONO_PARAM_NAME]); - const char *upd_name = mono_metadata_string_heap (image_base, upd_param [MONO_PARAM_NAME]); - mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_METADATA_UPDATE, "row[0x%02x: 0x%08x PARAM update: seq = %d (base = %d), name = '%s' (base = '%s')\n", i, log_token, upd_param [MONO_PARAM_SEQUENCE], base_param [MONO_PARAM_SEQUENCE], upd_name, base_name); - if (strcmp (base_name, upd_name) != 0 || base_param [MONO_PARAM_SEQUENCE] != upd_param [MONO_PARAM_SEQUENCE]) { - mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_METADATA_UPDATE, "row[0x%02x]:0x%08x we do not support patching of existing PARAM table cols.", i, log_token); - mono_error_set_type_load_name (error, NULL, image_base->name, "EnC: we do not support patching of existing PARAM table cols. token=0x%08x", log_token); - unsupported_edits = TRUE; - continue; - } - break; - } else - break; /* added a row. ok */ + break; } case MONO_TABLE_TYPEDEF: { *should_invalidate_transformed_code = true; diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index c564777f848370..4877300fe9eb82 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5107,8 +5107,12 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) return 0; if (G_UNLIKELY (meta->has_updates)) { - if (!found && !mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) + if (mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef) || mono_metadata_update_has_modified_rows (tdef)) { + if (!found && !mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) + return 0; + } else { return 0; + } } /* Find the first entry by searching backwards */ diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 2d91d4d74bd6e3..22e131e207b0f4 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -12,6 +12,7 @@ #include #include #include +#include /* * We need to return always the same object for MethodInfo, FieldInfo etc.. @@ -22,6 +23,7 @@ typedef struct { gpointer item; MonoClass *refclass; + uint32_t generation; /* 0 is normal; hot reload may change it */ } ReflectedEntry; gboolean @@ -59,6 +61,7 @@ cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, M ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; + e->generation = mono_metadata_update_get_thread_generation(); mono_conc_g_hash_table_insert (mem_manager->refobject_hash, e, o); obj = o; } @@ -83,6 +86,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; + e->generation = mono_metadata_update_get_thread_generation(); mono_conc_g_hash_table_insert (mem_manager->refobject_hash, e, MONO_HANDLE_RAW (o)); MONO_HANDLE_ASSIGN (obj, o); } @@ -92,6 +96,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; + e->generation = mono_metadata_update_get_thread_generation(); mono_weak_hash_table_insert (mem_manager->weak_refobject_hash, e, MONO_HANDLE_RAW (o)); MONO_HANDLE_ASSIGN (obj, o); } @@ -107,6 +112,7 @@ static inline MonoObjectHandle check_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item) { MonoObjectHandle obj_handle; + gpointer orig_e, orig_value; ReflectedEntry e; e.item = item; e.refclass = klass; @@ -123,6 +129,24 @@ check_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer MonoWeakHashTable *hash = mem_manager->weak_refobject_hash; obj_handle = MONO_HANDLE_NEW (MonoObject, (MonoObject *)mono_weak_hash_table_lookup (hash, &e)); } + + if (!mem_manager->collectible) { + MonoConcGHashTable *hash = mem_manager->refobject_hash; + if (mono_conc_g_hash_table_lookup_extended (hash, &e, &orig_e, &orig_value)) + if (((ReflectedEntry *)orig_e)->generation < mono_metadata_update_get_thread_generation()) { + mono_conc_g_hash_table_remove (hash, &e); + free_reflected_entry ((ReflectedEntry *)orig_e); + obj_handle = MONO_HANDLE_NEW (MonoObject, NULL); + } else { + obj_handle = MONO_HANDLE_NEW (MonoObject, (MonoObject *)orig_value); + } + else { + obj_handle = MONO_HANDLE_NEW (MonoObject, NULL); + } + } else { + MonoWeakHashTable *hash = mem_manager->weak_refobject_hash; + obj_handle = MONO_HANDLE_NEW (MonoObject, (MonoObject *)mono_weak_hash_table_lookup (hash, &e)); + } mono_mem_manager_unlock (mem_manager); return obj_handle; From eb8e6258d4264cd6f6a4c5f7e3553a359bbb3da3 Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 9 May 2023 10:50:57 -0400 Subject: [PATCH 02/14] Add a debugger test --- src/mono/mono/component/hot_reload.c | 2 +- .../DebuggerTestSuite/HotReloadTests.cs | 38 +++++++++++++++++++ .../MethodBody1.cs | 37 ++++++++++++++++++ .../MethodBody1_v1.cs | 10 +++++ 4 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/component/hot_reload.c b/src/mono/mono/component/hot_reload.c index 47c3120f25c4ea..150330769a34c6 100644 --- a/src/mono/mono/component/hot_reload.c +++ b/src/mono/mono/component/hot_reload.c @@ -3471,7 +3471,7 @@ hot_reload_get_method_params (MonoImage *base_image, uint32_t methoddef_token, u static const char * hot_reload_get_capabilities (void) { - return "Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod"; + return "Baseline AddMethodToExistingType AddStaticFieldToExistingType NewTypeDefinition ChangeCustomAttributes AddInstanceFieldToExistingType GenericAddMethodToExistingType GenericUpdateMethod UpdateParameters"; } static GENERATE_GET_CLASS_WITH_CACHE_DECL (hot_reload_instance_field_table); diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/HotReloadTests.cs b/src/mono/wasm/debugger/DebuggerTestSuite/HotReloadTests.cs index 3a1953183dfdb5..1ce00cb2bca501 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/HotReloadTests.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/HotReloadTests.cs @@ -599,5 +599,43 @@ await SendCommandAndCheck (JObject.FromObject(new { }), "Debugger.resume", scrip }, "c", num_fields: 2); }); } + + // Enable this test when https://github.com/dotnet/hotreload-utils/pull/264 flows into dotnet/runtime repo + // [ConditionalFact(nameof(RunningOnChrome))] + // public async Task DebugHotReloadMethod_ChangeParameterName() + // { + // string asm_file = Path.Combine(DebuggerTestAppPath, "ApplyUpdateReferencedAssembly.dll"); + // string pdb_file = Path.Combine(DebuggerTestAppPath, "ApplyUpdateReferencedAssembly.pdb"); + // string asm_file_hot_reload = Path.Combine(DebuggerTestAppPath, "../wasm/ApplyUpdateReferencedAssembly.dll"); + + // var bp_notchanged = await SetBreakpoint(".*/MethodBody1.cs$", 89, 12, use_regex: true); + // // var bp_invalid = await SetBreakpoint(".*/MethodBody1.cs$", 59, 12, use_regex: true); + + // var pause_location = await LoadAssemblyAndTestHotReloadUsingSDBWithoutChanges( + // asm_file, pdb_file, "MethodBody9", "test", expectBpResolvedEvent: true, sourcesToWait: new string [] { "MethodBody0.cs", "MethodBody1.cs" }); + + // CheckLocation("dotnet://ApplyUpdateReferencedAssembly.dll/MethodBody1.cs", 89, 12, scripts, pause_location["callFrames"]?[0]["location"]); + // await StepAndCheck(StepKind.Over, "dotnet://ApplyUpdateReferencedAssembly.dll/MethodBody1.cs", 90, 12, "ApplyUpdateReferencedAssembly.MethodBody9.M1", + // locals_fn: async (locals) => + // { + // CheckNumber(locals, "a", 1); + // await Task.CompletedTask; + // } + // ); + // //apply first update + // pause_location = await LoadAssemblyAndTestHotReloadUsingSDB( + // asm_file_hot_reload, "MethodBody9", "test", 1); + + // JToken top_frame = pause_location["callFrames"]?[0]; + // AssertEqual("ApplyUpdateReferencedAssembly.MethodBody9.M1", top_frame?["functionName"]?.Value(), top_frame?.ToString()); + // CheckLocation("dotnet://ApplyUpdateReferencedAssembly.dll/MethodBody1.cs", 89, 12, scripts, top_frame["location"]); + // await StepAndCheck(StepKind.Over, "dotnet://ApplyUpdateReferencedAssembly.dll/MethodBody1.cs", 90, 12, "ApplyUpdateReferencedAssembly.MethodBody9.M1", + // locals_fn: async (locals) => + // { + // CheckNumber(locals, "x", 1); + // await Task.CompletedTask; + // } + // ); + // } } } diff --git a/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1.cs b/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1.cs index 3abc1d4b538bb7..14f8e5316f8a19 100644 --- a/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1.cs +++ b/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1.cs @@ -57,4 +57,41 @@ public static void StaticMethod1 () { Console.WriteLine("original"); } } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // public class MethodBody9 { + // public static int M1(int a, int b) { + // return a + b; + // } + + // public static int test() { + // return M1(1, 2); + // } + // } } diff --git a/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1_v1.cs b/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1_v1.cs index cef3214d9c89e9..7c69a0ca7b0fa3 100644 --- a/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1_v1.cs +++ b/src/mono/wasm/debugger/tests/ApplyUpdateReferencedAssembly/MethodBody1_v1.cs @@ -84,4 +84,14 @@ public void InstanceMethod () { Console.WriteLine($"add a breakpoint the instance method of the new class"); } } + + // public class MethodBody9 { + // public static int M1(int x, int y) { + // return x + y; + // } + + // public static int test() { + // return M1(1, 2); + // } + // } } From 909ea0b1c923615bf1b4ece88c72f73c73294524 Mon Sep 17 00:00:00 2001 From: Fan Yang <52458914+fanyang-mono@users.noreply.github.com> Date: Tue, 9 May 2023 10:59:08 -0400 Subject: [PATCH 03/14] Update src/mono/mono/metadata/metadata.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/metadata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 4877300fe9eb82..a6077d2b72b7e3 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5107,8 +5107,8 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) return 0; if (G_UNLIKELY (meta->has_updates)) { - if (mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef) || mono_metadata_update_has_modified_rows (tdef)) { - if (!found && !mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) + if (!found && (mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef))) { + if (!mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) return 0; } else { return 0; From 77ddae75498e6ca4a82e852b3f2e1857d05b9376 Mon Sep 17 00:00:00 2001 From: Fan Yang <52458914+fanyang-mono@users.noreply.github.com> Date: Tue, 9 May 2023 10:59:18 -0400 Subject: [PATCH 04/14] Update src/mono/mono/metadata/reflection-cache.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/reflection-cache.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 22e131e207b0f4..4ad4b413716016 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -61,7 +61,10 @@ cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, M ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - e->generation = mono_metadata_update_get_thread_generation(); + if (G_UNLIKELY(mono_metadata_has_updates()) + e->generation = mono_metadata_update_get_thread_generation(); + else + e->generation = 0; mono_conc_g_hash_table_insert (mem_manager->refobject_hash, e, o); obj = o; } From b4fbcf5e205ea3646c34a62c254d1a38028ff30a Mon Sep 17 00:00:00 2001 From: Fan Yang <52458914+fanyang-mono@users.noreply.github.com> Date: Tue, 9 May 2023 10:59:26 -0400 Subject: [PATCH 05/14] Update src/mono/mono/metadata/reflection-cache.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/reflection-cache.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 4ad4b413716016..bd022a884b2a66 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -89,7 +89,10 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - e->generation = mono_metadata_update_get_thread_generation(); + if (G_UNLIKELY(mono_metadata_has_updates()) + e->generation = mono_metadata_update_get_thread_generation(); + else + e->generation = 0; mono_conc_g_hash_table_insert (mem_manager->refobject_hash, e, MONO_HANDLE_RAW (o)); MONO_HANDLE_ASSIGN (obj, o); } From a736858adae7bcc6a1ebf7096ab3405f8b2b8491 Mon Sep 17 00:00:00 2001 From: Fan Yang <52458914+fanyang-mono@users.noreply.github.com> Date: Tue, 9 May 2023 10:59:33 -0400 Subject: [PATCH 06/14] Update src/mono/mono/metadata/reflection-cache.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/reflection-cache.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index bd022a884b2a66..75cef055e5d272 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -102,7 +102,10 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - e->generation = mono_metadata_update_get_thread_generation(); + if (G_UNLIKELY(mono_metadata_has_updates()) + e->generation = mono_metadata_update_get_thread_generation(); + else + e->generation = 0; mono_weak_hash_table_insert (mem_manager->weak_refobject_hash, e, MONO_HANDLE_RAW (o)); MONO_HANDLE_ASSIGN (obj, o); } From e61e87a8762af548a72988c9d6b75ac5a0aaecc7 Mon Sep 17 00:00:00 2001 From: Fan Yang <52458914+fanyang-mono@users.noreply.github.com> Date: Tue, 9 May 2023 11:02:05 -0400 Subject: [PATCH 07/14] Update src/mono/mono/metadata/reflection-cache.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksey Kliger (λgeek) --- src/mono/mono/metadata/reflection-cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 75cef055e5d272..eae3e251602f6f 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -142,7 +142,7 @@ check_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer if (!mem_manager->collectible) { MonoConcGHashTable *hash = mem_manager->refobject_hash; if (mono_conc_g_hash_table_lookup_extended (hash, &e, &orig_e, &orig_value)) - if (((ReflectedEntry *)orig_e)->generation < mono_metadata_update_get_thread_generation()) { + if (mono_metadata_has_updates() && ((ReflectedEntry *)orig_e)->generation < mono_metadata_update_get_thread_generation()) { mono_conc_g_hash_table_remove (hash, &e); free_reflected_entry ((ReflectedEntry *)orig_e); obj_handle = MONO_HANDLE_NEW (MonoObject, NULL); From 5c8b38a43fdf61cfd5a03fabc3bdcf76b27c5c83 Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 9 May 2023 12:05:30 -0400 Subject: [PATCH 08/14] Add missing parenthese --- src/mono/mono/metadata/reflection-cache.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index eae3e251602f6f..8816f67ffeeccb 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -61,7 +61,7 @@ cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, M ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates()) + if (G_UNLIKELY(mono_metadata_has_updates())) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; @@ -89,7 +89,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates()) + if (G_UNLIKELY(mono_metadata_has_updates())) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; @@ -102,7 +102,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates()) + if (G_UNLIKELY(mono_metadata_has_updates())) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; From ea38ec548ae5bda0f3971d8e0409226c06d99cae Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Mon, 5 Jun 2023 17:20:27 -0400 Subject: [PATCH 09/14] Don't invalidate the whole assembly when using hot relaod --- src/mono/mono/metadata/metadata.c | 18 ++++++------- src/mono/mono/metadata/reflection-cache.h | 31 +++++++++++++---------- src/mono/mono/metadata/reflection.c | 16 ++++++------ src/mono/mono/metadata/sre.c | 4 +-- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index a6077d2b72b7e3..ea0cdf41721137 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5103,17 +5103,17 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) /* FIXME: Index translation */ gboolean found = tdef->base && mono_binary_search (&loc, tdef->base, table_info_get_rows (tdef), tdef->row_size, table_locator) != NULL; - if (!found && !meta->has_updates) - return 0; - - if (G_UNLIKELY (meta->has_updates)) { - if (!found && (mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef))) { - if (!mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) - return 0; - } else { + if (!found) + if (G_UNLIKELY (!meta->has_updates)) return 0; + else { + if ((mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef))) { + if (!mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) + return 0; + } else { + return 0; + } } - } /* Find the first entry by searching backwards */ while ((loc.result > 0) && (mono_metadata_decode_row_col (tdef, loc.result - 1, MONO_CUSTOM_ATTR_PARENT) == index)) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 8816f67ffeeccb..5856f42a144d6b 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -26,6 +26,11 @@ typedef struct { uint32_t generation; /* 0 is normal; hot reload may change it */ } ReflectedEntry; +enum { + MONO_REFL_CACHE_DEFAULT = 0, + MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE = 1, +}; + gboolean mono_reflected_equal (gconstpointer a, gconstpointer b); @@ -48,7 +53,7 @@ free_reflected_entry (ReflectedEntry *entry) } static inline MonoObject* -cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, MonoObject* o) +cache_object (MonoMemoryManager *mem_manager, int flags, MonoClass *klass, gpointer item, MonoObject* o) { MonoObject *obj; ReflectedEntry pe; @@ -61,7 +66,7 @@ cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, M ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates())) + if (G_UNLIKELY(mono_metadata_has_updates()) && ((flags & MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE) == 0)) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; @@ -73,7 +78,7 @@ cache_object (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, M } static inline MonoObjectHandle -cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, MonoObjectHandle o) +cache_object_handle (MonoMemoryManager *mem_manager, int flags, MonoClass *klass, gpointer item, MonoObjectHandle o) { MonoObjectHandle obj; ReflectedEntry pe; @@ -89,7 +94,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates())) + if (G_UNLIKELY(mono_metadata_has_updates()) && ((flags & MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE) == 0)) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; @@ -102,7 +107,7 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer ReflectedEntry *e = alloc_reflected_entry (mem_manager); e->item = item; e->refclass = klass; - if (G_UNLIKELY(mono_metadata_has_updates())) + if (G_UNLIKELY(mono_metadata_has_updates()) && ((flags & MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE) == 0)) e->generation = mono_metadata_update_get_thread_generation(); else e->generation = 0; @@ -114,11 +119,11 @@ cache_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer return obj; } -#define CACHE_OBJECT(t,mem_manager,p,o,k) ((t) (cache_object ((mem_manager), (k), (p), (o)))) -#define CACHE_OBJECT_HANDLE(t,mem_manager,p,o,k) (MONO_HANDLE_CAST (t, cache_object_handle ((mem_manager), (k), (p), (o)))) +#define CACHE_OBJECT(t,mem_manager,flags,p,o,k) ((t) (cache_object ((mem_manager), (flags), (k), (p), (o)))) +#define CACHE_OBJECT_HANDLE(t,mem_manager,flags,p,o,k) (MONO_HANDLE_CAST (t, cache_object_handle ((mem_manager), (flags), (k), (p), (o)))) static inline MonoObjectHandle -check_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item) +check_object_handle (MonoMemoryManager *mem_manager, int flags, MonoClass *klass, gpointer item) { MonoObjectHandle obj_handle; gpointer orig_e, orig_value; @@ -164,10 +169,10 @@ check_object_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer typedef MonoObjectHandle (*ReflectionCacheConstructFunc_handle) (MonoClass*, gpointer, gpointer, MonoError *); static inline MonoObjectHandle -check_or_construct_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpointer item, gpointer user_data, MonoError *error, ReflectionCacheConstructFunc_handle construct) +check_or_construct_handle (MonoMemoryManager *mem_manager, int flags, MonoClass *klass, gpointer item, gpointer user_data, MonoError *error, ReflectionCacheConstructFunc_handle construct) { error_init (error); - MonoObjectHandle obj = check_object_handle (mem_manager, klass, item); + MonoObjectHandle obj = check_object_handle (mem_manager, flags, klass, item); if (!MONO_HANDLE_IS_NULL (obj)) return obj; MONO_HANDLE_ASSIGN (obj, construct (klass, item, user_data, error)); @@ -175,11 +180,11 @@ check_or_construct_handle (MonoMemoryManager *mem_manager, MonoClass *klass, gpo if (MONO_HANDLE_IS_NULL (obj)) return obj; /* note no caching if there was an error in construction */ - return cache_object_handle (mem_manager, klass, item, obj); + return cache_object_handle (mem_manager, flags, klass, item, obj); } -#define CHECK_OR_CONSTRUCT_HANDLE(type,mem_manager, item,klass,construct,user_data) \ +#define CHECK_OR_CONSTRUCT_HANDLE(type,mem_manager,flags,item,klass,construct,user_data) \ (MONO_HANDLE_CAST (type, check_or_construct_handle ( \ - (mem_manager), (klass), (item), (user_data), error, (ReflectionCacheConstructFunc_handle) (construct)))) + (mem_manager), (flags), (klass), (item), (user_data), error, (ReflectionCacheConstructFunc_handle) (construct)))) #endif /*__MONO_METADATA_REFLECTION_CACHE_H__*/ diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c index 37898f954ff348..a587ef40bc67e8 100644 --- a/src/mono/mono/metadata/reflection.c +++ b/src/mono/mono/metadata/reflection.c @@ -243,7 +243,7 @@ MonoReflectionAssemblyHandle mono_assembly_get_object_handle (MonoAssembly *assembly, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionAssembly, m_image_get_mem_manager (assembly->image), assembly, NULL, assembly_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionAssembly, m_image_get_mem_manager (assembly->image), MONO_REFL_CACHE_DEFAULT, assembly, NULL, assembly_object_construct, NULL); } /** @@ -311,7 +311,7 @@ MonoReflectionModuleHandle mono_module_get_object_handle (MonoImage *image, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionModule, m_image_get_mem_manager (image), image, NULL, module_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionModule, m_image_get_mem_manager (image), MONO_REFL_CACHE_DEFAULT, image, NULL, module_object_construct, NULL); } /** @@ -670,7 +670,7 @@ mono_method_get_object_handle (MonoMethod *method, MonoClass *refclass, MonoErro refclass = method->klass; // FIXME: For methods/params etc., use the mem manager for refclass or a merged one ? - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethod, m_method_get_mem_manager (method), method, refclass, method_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethod, m_method_get_mem_manager (method), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, method, refclass, method_object_construct, NULL); } /* * mono_method_get_object_checked: @@ -776,7 +776,7 @@ MonoReflectionFieldHandle mono_field_get_object_handle (MonoClass *klass, MonoClassField *field, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionField, m_class_get_mem_manager (m_field_get_parent (field)), field, klass, field_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionField, m_class_get_mem_manager (m_field_get_parent (field)), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, field, klass, field_object_construct, NULL); } /* @@ -844,7 +844,7 @@ property_object_construct (MonoClass *klass, MonoProperty *property, gpointer us MonoReflectionPropertyHandle mono_property_get_object_handle (MonoClass *klass, MonoProperty *property, MonoError *error) { - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionProperty, m_class_get_mem_manager (property->parent), property, klass, property_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionProperty, m_class_get_mem_manager (property->parent), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, property, klass, property_object_construct, NULL); } /** @@ -909,7 +909,7 @@ MonoReflectionEventHandle mono_event_get_object_handle (MonoClass *klass, MonoEvent *event, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionEvent, m_class_get_mem_manager (event->parent), event, klass, event_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionEvent, m_class_get_mem_manager (event->parent), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, event, klass, event_object_construct, NULL); } @@ -1167,7 +1167,7 @@ mono_param_get_objects_internal (MonoMethod *method, MonoClass *refclass, MonoEr /* Note: the cache is based on the address of the signature into the method * since we already cache MethodInfos with the method as keys. */ - return CHECK_OR_CONSTRUCT_HANDLE (MonoArray, m_method_get_mem_manager (method), &method->signature, refclass, param_objects_construct, method); + return CHECK_OR_CONSTRUCT_HANDLE (MonoArray, m_method_get_mem_manager (method), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, &method->signature, refclass, param_objects_construct, method); fail: return MONO_HANDLE_NEW (MonoArray, NULL); } @@ -1392,7 +1392,7 @@ MonoReflectionMethodBodyHandle mono_method_body_get_object_handle (MonoMethod *method, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethodBody, m_method_get_mem_manager (method), method, NULL, method_body_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethodBody, m_method_get_mem_manager (method), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, method, NULL, method_body_object_construct, NULL); } /** diff --git a/src/mono/mono/metadata/sre.c b/src/mono/mono/metadata/sre.c index b582c5cf4219bc..5029ab33f104b0 100644 --- a/src/mono/mono/metadata/sre.c +++ b/src/mono/mono/metadata/sre.c @@ -1188,13 +1188,13 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, static gpointer register_assembly (MonoReflectionAssembly *res, MonoAssembly *assembly) { - return CACHE_OBJECT (MonoReflectionAssembly *, mono_mem_manager_get_ambient (), assembly, &res->object, NULL); + return CACHE_OBJECT (MonoReflectionAssembly *, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_DEFAULT, assembly, &res->object, NULL); } static MonoReflectionModuleBuilderHandle register_module (MonoReflectionModuleBuilderHandle res, MonoDynamicImage *module) { - return CACHE_OBJECT_HANDLE (MonoReflectionModuleBuilder, mono_mem_manager_get_ambient (), module, MONO_HANDLE_CAST (MonoObject, res), NULL); + return CACHE_OBJECT_HANDLE (MonoReflectionModuleBuilder, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_DEFAULT, module, MONO_HANDLE_CAST (MonoObject, res), NULL); } /* From 0e60d1cc06eb0dbba1d95609beb826c2fda31e9a Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 6 Jun 2023 11:37:17 -0400 Subject: [PATCH 10/14] Switch flags --- src/mono/mono/metadata/reflection.c | 12 ++++++------ src/mono/mono/metadata/sre.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c index a587ef40bc67e8..dd4f2c63f7c628 100644 --- a/src/mono/mono/metadata/reflection.c +++ b/src/mono/mono/metadata/reflection.c @@ -243,7 +243,7 @@ MonoReflectionAssemblyHandle mono_assembly_get_object_handle (MonoAssembly *assembly, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionAssembly, m_image_get_mem_manager (assembly->image), MONO_REFL_CACHE_DEFAULT, assembly, NULL, assembly_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionAssembly, m_image_get_mem_manager (assembly->image), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, assembly, NULL, assembly_object_construct, NULL); } /** @@ -311,7 +311,7 @@ MonoReflectionModuleHandle mono_module_get_object_handle (MonoImage *image, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionModule, m_image_get_mem_manager (image), MONO_REFL_CACHE_DEFAULT, image, NULL, module_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionModule, m_image_get_mem_manager (image), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, image, NULL, module_object_construct, NULL); } /** @@ -670,7 +670,7 @@ mono_method_get_object_handle (MonoMethod *method, MonoClass *refclass, MonoErro refclass = method->klass; // FIXME: For methods/params etc., use the mem manager for refclass or a merged one ? - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethod, m_method_get_mem_manager (method), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, method, refclass, method_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethod, m_method_get_mem_manager (method), MONO_REFL_CACHE_DEFAULT, method, refclass, method_object_construct, NULL); } /* * mono_method_get_object_checked: @@ -776,7 +776,7 @@ MonoReflectionFieldHandle mono_field_get_object_handle (MonoClass *klass, MonoClassField *field, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionField, m_class_get_mem_manager (m_field_get_parent (field)), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, field, klass, field_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionField, m_class_get_mem_manager (m_field_get_parent (field)), MONO_REFL_CACHE_DEFAULT, field, klass, field_object_construct, NULL); } /* @@ -844,7 +844,7 @@ property_object_construct (MonoClass *klass, MonoProperty *property, gpointer us MonoReflectionPropertyHandle mono_property_get_object_handle (MonoClass *klass, MonoProperty *property, MonoError *error) { - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionProperty, m_class_get_mem_manager (property->parent), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, property, klass, property_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionProperty, m_class_get_mem_manager (property->parent), MONO_REFL_CACHE_DEFAULT, property, klass, property_object_construct, NULL); } /** @@ -909,7 +909,7 @@ MonoReflectionEventHandle mono_event_get_object_handle (MonoClass *klass, MonoEvent *event, MonoError *error) { error_init (error); - return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionEvent, m_class_get_mem_manager (event->parent), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, event, klass, event_object_construct, NULL); + return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionEvent, m_class_get_mem_manager (event->parent), MONO_REFL_CACHE_DEFAULT, event, klass, event_object_construct, NULL); } diff --git a/src/mono/mono/metadata/sre.c b/src/mono/mono/metadata/sre.c index 5029ab33f104b0..d7c1b63b3917c8 100644 --- a/src/mono/mono/metadata/sre.c +++ b/src/mono/mono/metadata/sre.c @@ -1188,13 +1188,13 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, static gpointer register_assembly (MonoReflectionAssembly *res, MonoAssembly *assembly) { - return CACHE_OBJECT (MonoReflectionAssembly *, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_DEFAULT, assembly, &res->object, NULL); + return CACHE_OBJECT (MonoReflectionAssembly *, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, assembly, &res->object, NULL); } static MonoReflectionModuleBuilderHandle register_module (MonoReflectionModuleBuilderHandle res, MonoDynamicImage *module) { - return CACHE_OBJECT_HANDLE (MonoReflectionModuleBuilder, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_DEFAULT, module, MONO_HANDLE_CAST (MonoObject, res), NULL); + return CACHE_OBJECT_HANDLE (MonoReflectionModuleBuilder, mono_mem_manager_get_ambient (), MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE, module, MONO_HANDLE_CAST (MonoObject, res), NULL); } /* From be9b20158b9eb9e3338bea9867d419f3519a944a Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 6 Jun 2023 12:31:59 -0400 Subject: [PATCH 11/14] Fix build error --- src/mono/mono/metadata/metadata.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index ea0cdf41721137..17feade1819a93 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5104,9 +5104,9 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) gboolean found = tdef->base && mono_binary_search (&loc, tdef->base, table_info_get_rows (tdef), tdef->row_size, table_locator) != NULL; if (!found) - if (G_UNLIKELY (!meta->has_updates)) + if (G_UNLIKELY (!meta->has_updates)) { return 0; - else { + } else { if ((mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef))) { if (!mono_metadata_update_metadata_linear_search (meta, tdef, &loc, table_locator)) return 0; From 196651e63de86ca8dc0f2468c204c0fbc7b016f2 Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 6 Jun 2023 13:09:13 -0400 Subject: [PATCH 12/14] Use G_LIKELY --- src/mono/mono/metadata/metadata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 17feade1819a93..4c9683d8adc268 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5104,7 +5104,7 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) gboolean found = tdef->base && mono_binary_search (&loc, tdef->base, table_info_get_rows (tdef), tdef->row_size, table_locator) != NULL; if (!found) - if (G_UNLIKELY (!meta->has_updates)) { + if (G_LIKELY (!meta->has_updates)) { return 0; } else { if ((mono_metadata_table_num_rows (meta, MONO_TABLE_CUSTOMATTRIBUTE) > table_info_get_rows (tdef))) { From 6d99e993497d63b0bbe21c2c1808019d5a2dc0cd Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 6 Jun 2023 16:28:43 -0400 Subject: [PATCH 13/14] Try to fix build failure v2 --- src/mono/mono/metadata/metadata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 4c9683d8adc268..e3d806c9a01489 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -5103,7 +5103,7 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) /* FIXME: Index translation */ gboolean found = tdef->base && mono_binary_search (&loc, tdef->base, table_info_get_rows (tdef), tdef->row_size, table_locator) != NULL; - if (!found) + if (!found) { if (G_LIKELY (!meta->has_updates)) { return 0; } else { @@ -5114,6 +5114,7 @@ mono_metadata_custom_attrs_from_index (MonoImage *meta, guint32 index) return 0; } } + } /* Find the first entry by searching backwards */ while ((loc.result > 0) && (mono_metadata_decode_row_col (tdef, loc.result - 1, MONO_CUSTOM_ATTR_PARENT) == index)) From 6b47264a624d04d19680e5bcfa889600d04bf164 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Thu, 15 Jun 2023 15:57:30 -0400 Subject: [PATCH 14/14] don't ignore reflection cache entries when the "no invalidate" flag is set --- src/mono/mono/metadata/reflection-cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/reflection-cache.h b/src/mono/mono/metadata/reflection-cache.h index 5856f42a144d6b..de92ac2dd673e4 100644 --- a/src/mono/mono/metadata/reflection-cache.h +++ b/src/mono/mono/metadata/reflection-cache.h @@ -147,7 +147,7 @@ check_object_handle (MonoMemoryManager *mem_manager, int flags, MonoClass *klass if (!mem_manager->collectible) { MonoConcGHashTable *hash = mem_manager->refobject_hash; if (mono_conc_g_hash_table_lookup_extended (hash, &e, &orig_e, &orig_value)) - if (mono_metadata_has_updates() && ((ReflectedEntry *)orig_e)->generation < mono_metadata_update_get_thread_generation()) { + if (mono_metadata_has_updates() && ((flags & MONO_REFL_CACHE_NO_HOT_RELOAD_INVALIDATE) == 0) && ((ReflectedEntry *)orig_e)->generation < mono_metadata_update_get_thread_generation()) { mono_conc_g_hash_table_remove (hash, &e); free_reflected_entry ((ReflectedEntry *)orig_e); obj_handle = MONO_HANDLE_NEW (MonoObject, NULL);