Skip to content

Commit b64e9d3

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

File tree

1 file changed

+43
-25
lines changed

1 file changed

+43
-25
lines changed

src/mono/mono/metadata/reflection.c

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

443+
/* LOCKING: assumes the loader lock is taken */
444+
static MonoReflectionType*
445+
mono_type_get_object_checked_alloc_helper (MonoType *type, MonoMemoryManager *memory_manager, MonoDomain *domain, MonoError *error)
446+
{
447+
HANDLE_FUNCTION_ENTER ();
448+
449+
MonoReflectionType *res, *cached;
450+
/* This is stored in vtables/JITted code so it has to be pinned */
451+
MonoReflectionTypeHandle res_handle = MONO_HANDLE_CAST (MonoReflectionType, mono_object_new_pinned_handle (mono_defaults.runtimetype_class, error));
452+
goto_if_nok (error, exit);
453+
454+
res = MONO_HANDLE_RAW (res_handle);
455+
456+
res->type = type;
457+
if (memory_manager->collectible) {
458+
MonoObject *loader_alloc = mono_gchandle_get_target_internal (mono_mem_manager_get_loader_alloc (memory_manager));
459+
g_assert (loader_alloc);
460+
MONO_OBJECT_SETREF_INTERNAL (res, m_keepalive, loader_alloc);
461+
}
462+
463+
mono_mem_manager_lock (memory_manager);
464+
if (memory_manager->collectible)
465+
cached = (MonoReflectionType *)mono_weak_hash_table_lookup (memory_manager->weak_type_hash, type);
466+
else
467+
cached = (MonoReflectionType *)mono_g_hash_table_lookup (memory_manager->type_hash, type);
468+
if (cached) {
469+
res = cached;
470+
MONO_HANDLE_ASSIGN_RAW (res_handle, res);
471+
} else {
472+
if (memory_manager->collectible)
473+
mono_weak_hash_table_insert (memory_manager->weak_type_hash, type, res);
474+
else
475+
mono_g_hash_table_insert_internal (memory_manager->type_hash, type, res);
476+
if (type->type == MONO_TYPE_VOID && !m_type_is_byref (type))
477+
domain->typeof_void = (MonoObject*)res;
478+
}
479+
mono_mem_manager_unlock (memory_manager);
480+
481+
exit:
482+
HANDLE_FUNCTION_RETURN_OBJ (res_handle);
483+
}
484+
443485
MonoReflectionType*
444486
mono_type_get_object_checked (MonoType *type, MonoError *error)
445487
{
@@ -554,33 +596,9 @@ mono_type_get_object_checked (MonoType *type, MonoError *error)
554596
res = &mono_class_get_ref_info_raw (klass)->type; /* FIXME use handles */
555597
goto leave;
556598
}
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);
560599

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-
}
567600

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);
601+
res = mono_type_get_object_checked_alloc_helper (type, memory_manager, domain, error);
584602

585603
leave:
586604
mono_loader_unlock ();

0 commit comments

Comments
 (0)