Skip to content

Commit 07a07ef

Browse files
committed
[mono][metadata] Allocate handle while operating with newly allocated RuntimeType
1 parent c02f8cd commit 07a07ef

File tree

1 file changed

+41
-25
lines changed

1 file changed

+41
-25
lines changed

src/mono/mono/metadata/reflection.c

+41-25
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,46 @@ mono_type_get_object (MonoDomain *domain, MonoType *type)
440440
return ret;
441441
}
442442

443+
static MonoReflectionType*
444+
mono_type_get_object_checked_alloc_helper (MonoType *type, MonoMemoryManager *memory_manager, MonoDomain *domain, MonoError *error)
445+
{
446+
HANDLE_FUNCTION_ENTER ();
447+
448+
MonoReflectionType *res, *cached;
449+
/* This is stored in vtables/JITted code so it has to be pinned */
450+
MonoReflectionTypeHandle res_handle = MONO_HANDLE_CAST (MonoReflectionType, mono_object_new_pinned_handle (mono_defaults.runtimetype_class, error));
451+
goto_if_nok (error, exit);
452+
453+
res = MONO_HANDLE_RAW (res_handle);
454+
455+
res->type = type;
456+
if (memory_manager->collectible) {
457+
MonoObject *loader_alloc = mono_gchandle_get_target_internal (mono_mem_manager_get_loader_alloc (memory_manager));
458+
g_assert (loader_alloc);
459+
MONO_OBJECT_SETREF_INTERNAL (res, m_keepalive, loader_alloc);
460+
}
461+
462+
mono_mem_manager_lock (memory_manager);
463+
if (memory_manager->collectible)
464+
cached = (MonoReflectionType *)mono_weak_hash_table_lookup (memory_manager->weak_type_hash, type);
465+
else
466+
cached = (MonoReflectionType *)mono_g_hash_table_lookup (memory_manager->type_hash, type);
467+
if (cached) {
468+
res = cached;
469+
} else {
470+
if (memory_manager->collectible)
471+
mono_weak_hash_table_insert (memory_manager->weak_type_hash, type, res);
472+
else
473+
mono_g_hash_table_insert_internal (memory_manager->type_hash, type, res);
474+
if (type->type == MONO_TYPE_VOID && !m_type_is_byref (type))
475+
domain->typeof_void = (MonoObject*)res;
476+
}
477+
mono_mem_manager_unlock (memory_manager);
478+
479+
exit:
480+
HANDLE_FUNCTION_RETURN_OBJ (res_handle);
481+
}
482+
443483
MonoReflectionType*
444484
mono_type_get_object_checked (MonoType *type, MonoError *error)
445485
{
@@ -554,33 +594,9 @@ mono_type_get_object_checked (MonoType *type, MonoError *error)
554594
res = &mono_class_get_ref_info_raw (klass)->type; /* FIXME use handles */
555595
goto leave;
556596
}
557-
/* This is stored in vtables/JITted code so it has to be pinned */
558-
res = (MonoReflectionType *)mono_object_new_pinned (mono_defaults.runtimetype_class, error);
559-
goto_if_nok (error, leave);
560597

561-
res->type = type;
562-
if (memory_manager->collectible) {
563-
MonoObject *loader_alloc = mono_gchandle_get_target_internal (mono_mem_manager_get_loader_alloc (memory_manager));
564-
g_assert (loader_alloc);
565-
MONO_OBJECT_SETREF_INTERNAL (res, m_keepalive, loader_alloc);
566-
}
567598

568-
mono_mem_manager_lock (memory_manager);
569-
if (memory_manager->collectible)
570-
cached = (MonoReflectionType *)mono_weak_hash_table_lookup (memory_manager->weak_type_hash, type);
571-
else
572-
cached = (MonoReflectionType *)mono_g_hash_table_lookup (memory_manager->type_hash, type);
573-
if (cached) {
574-
res = cached;
575-
} else {
576-
if (memory_manager->collectible)
577-
mono_weak_hash_table_insert (memory_manager->weak_type_hash, type, res);
578-
else
579-
mono_g_hash_table_insert_internal (memory_manager->type_hash, type, res);
580-
if (type->type == MONO_TYPE_VOID && !m_type_is_byref (type))
581-
domain->typeof_void = (MonoObject*)res;
582-
}
583-
mono_mem_manager_unlock (memory_manager);
599+
res = mono_type_get_object_checked_alloc_helper (type, memory_manager, domain, error);
584600

585601
leave:
586602
mono_loader_unlock ();

0 commit comments

Comments
 (0)