@@ -2983,10 +2983,36 @@ set_interface_map_data_method_object (MonoDomain *domain, MonoMethod *method, Mo
2983
2983
2984
2984
MONO_HANDLE_ARRAY_SETREF (methods , i , member );
2985
2985
2986
- MONO_HANDLE_ASSIGN (member , mono_method_get_object_handle (domain , m_class_get_vtable (klass ) [i + ioffset ], klass , error ));
2987
- goto_if_nok (error , leave );
2986
+ MonoMethod * foundMethod = m_class_get_vtable (klass ) [i + ioffset ];
2987
+
2988
+ if (mono_class_has_dim_conflicts (klass ) && mono_class_is_interface (foundMethod -> klass )) {
2989
+ GSList * conflicts = mono_class_get_dim_conflicts (klass );
2990
+ GSList * l ;
2991
+ MonoMethod * decl = method ;
2988
2992
2989
- MONO_HANDLE_ARRAY_SETREF (targets , i , member );
2993
+ if (decl -> is_inflated )
2994
+ decl = ((MonoMethodInflated * )decl )-> declaring ;
2995
+
2996
+ gboolean in_conflict = FALSE;
2997
+ for (l = conflicts ; l ; l = l -> next ) {
2998
+ if (decl == l -> data ) {
2999
+ in_conflict = TRUE;
3000
+ break ;
3001
+ }
3002
+ }
3003
+ if (in_conflict ) {
3004
+ MONO_HANDLE_ARRAY_SETREF (targets , i , NULL_HANDLE );
3005
+ goto leave ;
3006
+ }
3007
+ }
3008
+
3009
+ if (foundMethod -> flags & METHOD_ATTRIBUTE_ABSTRACT )
3010
+ MONO_HANDLE_ARRAY_SETREF (targets , i , NULL_HANDLE );
3011
+ else {
3012
+ MONO_HANDLE_ASSIGN (member , mono_method_get_object_handle (domain , foundMethod , mono_class_is_interface (foundMethod -> klass ) ? foundMethod -> klass : klass , error ));
3013
+ goto_if_nok (error , leave );
3014
+ MONO_HANDLE_ARRAY_SETREF (targets , i , member );
3015
+ }
2990
3016
2991
3017
leave :
2992
3018
HANDLE_FUNCTION_RETURN_VAL (is_ok (error ));
@@ -3012,20 +3038,30 @@ ves_icall_RuntimeType_GetInterfaceMapData (MonoReflectionTypeHandle ref_type, Mo
3012
3038
if (ioffset == -1 )
3013
3039
return ;
3014
3040
3015
- int len = mono_class_num_methods (iclass );
3041
+ MonoMethod * method ;
3042
+ int i = 0 ;
3043
+ gpointer iter = NULL ;
3016
3044
MonoDomain * domain = MONO_HANDLE_DOMAIN (ref_type );
3017
- MonoArrayHandle targets_arr = mono_array_new_handle (domain , mono_defaults .method_info_class , len , error );
3045
+
3046
+ while ((method = mono_class_get_methods (iclass , & iter ))) {
3047
+ if (method -> flags & METHOD_ATTRIBUTE_VIRTUAL )
3048
+ i ++ ;
3049
+ }
3050
+
3051
+ MonoArrayHandle targets_arr = mono_array_new_handle (domain , mono_defaults .method_info_class , i , error );
3018
3052
return_if_nok (error );
3019
3053
MONO_HANDLE_ASSIGN (targets , targets_arr );
3020
3054
3021
- MonoArrayHandle methods_arr = mono_array_new_handle (domain , mono_defaults .method_info_class , len , error );
3055
+ MonoArrayHandle methods_arr = mono_array_new_handle (domain , mono_defaults .method_info_class , i , error );
3022
3056
return_if_nok (error );
3023
3057
MONO_HANDLE_ASSIGN (methods , methods_arr );
3024
3058
3025
- MonoMethod * method ;
3026
- int i = 0 ;
3027
- gpointer iter = NULL ;
3059
+ i = 0 ;
3060
+ iter = NULL ;
3061
+
3028
3062
while ((method = mono_class_get_methods (iclass , & iter ))) {
3063
+ if (!(method -> flags & METHOD_ATTRIBUTE_VIRTUAL ))
3064
+ continue ;
3029
3065
if (!set_interface_map_data_method_object (domain , method , iclass , ioffset , klass , targets , methods , i , error ))
3030
3066
return ;
3031
3067
i ++ ;
0 commit comments