@@ -440,6 +440,46 @@ mono_type_get_object (MonoDomain *domain, MonoType *type)
440
440
return ret ;
441
441
}
442
442
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
+
443
483
MonoReflectionType *
444
484
mono_type_get_object_checked (MonoType * type , MonoError * error )
445
485
{
@@ -554,33 +594,9 @@ mono_type_get_object_checked (MonoType *type, MonoError *error)
554
594
res = & mono_class_get_ref_info_raw (klass )-> type ; /* FIXME use handles */
555
595
goto leave ;
556
596
}
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
597
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
598
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 );
584
600
585
601
leave :
586
602
mono_loader_unlock ();
0 commit comments