@@ -440,6 +440,47 @@ mono_type_get_object (MonoDomain *domain, MonoType *type)
440
440
return ret ;
441
441
}
442
442
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
+ } else {
471
+ if (memory_manager -> collectible )
472
+ mono_weak_hash_table_insert (memory_manager -> weak_type_hash , type , res );
473
+ else
474
+ mono_g_hash_table_insert_internal (memory_manager -> type_hash , type , res );
475
+ if (type -> type == MONO_TYPE_VOID && !m_type_is_byref (type ))
476
+ domain -> typeof_void = (MonoObject * )res ;
477
+ }
478
+ mono_mem_manager_unlock (memory_manager );
479
+
480
+ exit :
481
+ HANDLE_FUNCTION_RETURN_OBJ (res_handle );
482
+ }
483
+
443
484
MonoReflectionType *
444
485
mono_type_get_object_checked (MonoType * type , MonoError * error )
445
486
{
@@ -554,33 +595,9 @@ mono_type_get_object_checked (MonoType *type, MonoError *error)
554
595
res = & mono_class_get_ref_info_raw (klass )-> type ; /* FIXME use handles */
555
596
goto leave ;
556
597
}
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 );
560
598
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
- }
567
599
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 );
600
+ res = mono_type_get_object_checked_alloc_helper (type , memory_manager , domain , error );
584
601
585
602
leave :
586
603
mono_loader_unlock ();
0 commit comments