@@ -440,6 +440,48 @@ 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
+ 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
+
443
485
MonoReflectionType *
444
486
mono_type_get_object_checked (MonoType * type , MonoError * error )
445
487
{
@@ -554,33 +596,9 @@ mono_type_get_object_checked (MonoType *type, MonoError *error)
554
596
res = & mono_class_get_ref_info_raw (klass )-> type ; /* FIXME use handles */
555
597
goto leave ;
556
598
}
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
599
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
600
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 );
584
602
585
603
leave :
586
604
mono_loader_unlock ();
0 commit comments