Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions mono/mini/mini-generic-sharing.c
Original file line number Diff line number Diff line change
Expand Up @@ -2783,6 +2783,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type)
* @method: a method
* @in_mrgctx: whether to put the data into the MRGCTX
* @data: the info data
* @did_register: whether data was registered
* @info_type: the type of info to register about data
* @generic_context: a generic context
*
Expand All @@ -2791,7 +2792,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type)
* encoded slot number.
*/
static guint32
lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data,
lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data, gboolean *did_register,
MonoRgctxInfoType info_type, MonoGenericContext *generic_context)
{
int type_argc = 0;
Expand Down Expand Up @@ -2840,7 +2841,10 @@ lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgct

/* We haven't found the info */
if (index == -1)
{
index = register_info (klass, type_argc, data, info_type);
*did_register = TRUE;
}

/* interlocked by loader lock */
if (index > UnlockedRead (&rgctx_max_slot_number))
Expand Down Expand Up @@ -4233,6 +4237,8 @@ int
mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry)
{
gpointer entry_data = NULL;
gboolean did_register = FALSE;
guint32 result = -1;

switch (entry->data->type) {
case MONO_PATCH_INFO_CLASS:
Expand Down Expand Up @@ -4299,9 +4305,27 @@ mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry)
}

if (entry->in_mrgctx)
return lookup_or_register_info (entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, entry->info_type, mono_method_get_context (entry->d.method));
result = lookup_or_register_info (entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_method_get_context (entry->d.method));
else
return lookup_or_register_info (entry->d.klass, NULL, entry->in_mrgctx, entry_data, entry->info_type, mono_class_get_context (entry->d.klass));
result = lookup_or_register_info (entry->d.klass, NULL, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_class_get_context (entry->d.klass));

if (!did_register)
switch (entry->data->type) {
case MONO_PATCH_INFO_GSHAREDVT_CALL:
case MONO_PATCH_INFO_VIRT_METHOD:
case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE:
g_free (entry_data);
break;
case MONO_PATCH_INFO_GSHAREDVT_METHOD: {
g_free (((MonoGSharedVtMethodInfo *) entry_data)->entries);
g_free (entry_data);
break;
}
default :
break;
}

return result;
}

static gboolean gsharedvt_supported;
Expand Down