dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection ClrType.cs,


From: Gopal.V <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection ClrType.cs, 1.16, 1.17
Date: Fri, 25 Jul 2003 10:17:55 -0400

Update of /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection
In directory subversions:/tmp/cvs-serv19956/runtime/System/Reflection

Modified Files:
        ClrType.cs 
Log Message:
Fix bug #2688 by trimming member lists 


Index: ClrType.cs
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/ClrType.cs,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -r1.16 -r1.17
*** ClrType.cs  16 Apr 2003 03:17:55 -0000      1.16
--- ClrType.cs  25 Jul 2003 14:17:53 -0000      1.17
***************
*** 23,26 ****
--- 23,27 ----
  
  using System;
+ using System.Collections;
  using System.Globalization;
  using System.Runtime.CompilerServices;
***************
*** 233,237 ****
                                                                                
 Type arrayType,
                                                                                
 String name);
! 
        // Implementation of "GetConstructor" provided by subclasses.
        protected override ConstructorInfo
--- 234,396 ----
                                                                                
 Type arrayType,
                                                                                
 String name);
!       
!       
!       [Flags]
!       private enum MemberComparison
!       {
!               None = 0x01,
!               Candidate = 0x02,
!               Override = 0x04,
!       }
!       
!       /* 
!        * Check if m1 overrides m2
!        */
!       private MemberComparison CompareMembers(MemberInfo m1, MemberInfo m2)
!                       {
!                               if(m1.MemberType != m2.MemberType || 
m1.Name!=m2.Name)
!                               {       
!                                       return MemberComparison.None;
!                               }
!                               if(m1.MemberType==MemberTypes.Field)
!                               {
!                                       
if(((FieldInfo)m1).Attributes==((FieldInfo)m2).Attributes)
!                                       {
!                                               goto overrideCheck;
!                                       }
!                               }
!                               MethodBase method1, method2;
!                               switch(m1.MemberType)
!                               {
!                                       case MemberTypes.Constructor:
!                                       {
!                                               method1=(MethodBase)m1;
!                                               method2=(MethodBase)m2;
!                                       }
!                                       break;
! 
!                                       case MemberTypes.Method:
!                                       {
!                                               method1=(MethodBase)m1;
!                                               method2=(MethodBase)m2;
!                                       }
!                                       break;
!                                       
!                                       case MemberTypes.Property:
!                                       {
!                                               
if(((PropertyInfo)m1).GetAccessors().Length==0 &&
!                                                  
((PropertyInfo)m2).GetAccessors().Length==0)
!                                               {
!                                                       
if(((PropertyInfo)m1).Attributes == 
!                                                                       
((PropertyInfo)m2).Attributes)
!                                                       {
!                                                               goto 
overrideCheck;
!                                                       }
!                                               }
! 
!                                               
method1=((PropertyInfo)m1).GetGetMethod() != null ?
!                                                                       
((PropertyInfo)m1).GetGetMethod() :
!                                                                       
((PropertyInfo)m1).GetSetMethod() ;
!                                               
!                                               
method2=((PropertyInfo)m2).GetGetMethod() != null ?
!                                                                       
((PropertyInfo)m2).GetGetMethod() :
!                                                                       
((PropertyInfo)m2).GetSetMethod() ;
!                                       }
!                                       break;
!                                       
!                                       case MemberTypes.Event:
!                                       {
!                                               
method1=((EventInfo)m1).GetAddMethod() != null ?
!                                                                       
((EventInfo)m1).GetAddMethod() :
!                                                                       
((EventInfo)m1).GetRemoveMethod() ;
!                                               
!                                               
method2=((EventInfo)m2).GetAddMethod() != null ?
!                                                                       
((EventInfo)m2).GetAddMethod() :
!                                                                       
((EventInfo)m2).GetRemoveMethod() ;
!                                       }
!                                       break;
!                               }
!                               if((method1.Attributes | 
MethodAttributes.NewSlot) 
!                                                       != (method1.Attributes 
| MethodAttributes.NewSlot))
!                               {
!                                       return MemberComparison.None;
!                               }
! 
!                               ParameterInfo [] pinfo1 = 
method1.GetParameters();
!                               ParameterInfo [] pinfo2 = 
method2.GetParameters();
!                               if(pinfo1.Length != pinfo2.Length)
!                               {
!                                       return MemberComparison.None;
!                               }
!                               for(int i=0;i<pinfo1.Length;i++)
!                               {
!                                       
if(pinfo1[i].Attributes!=pinfo2[i].Attributes ||
!                                               pinfo1[i].ParameterType != 
pinfo2[i].ParameterType)
!                                       {
!                                               return MemberComparison.None;
!                                       }
!                               }
! 
!                               if(method1 is MethodInfo)
!                               {
!                                       
if(((MethodInfo)method2).ReturnType.Equals(
!                                                               
((MethodInfo)method1).ReturnType))
!                                       {
!                                               return MemberComparison.None;
!                                       }
!                               }
!                       overrideCheck:
!                               
if(m1.DeclaringType.IsSubclassOf(m2.DeclaringType))
!                               {
!                                       return MemberComparison.Candidate 
!                                                       | 
MemberComparison.Override;
!                               }
!                               return MemberComparison.Candidate;
!                       }
! 
!       /// <summary>
!       /// This function sorts and removes overrides from an array of
!       /// MemberInfo[]
!       /// </summary>
!       private Object TrimMembers(Object memberArray, Type type)
!                       {
!                               MemberInfo[] 
members=(MemberInfo[])(memberArray);
!                               ArrayList list=new ArrayList(members.Length/2);
!                               int best;
! 
!                               for(int i=0;i<members.Length-1;i++)
!                               {
!                                       best=i;
!                                       if(members[best]==null)
!                                       {
!                                               continue;
!                                       }
!                                       for(int j=i+1;j<members.Length;j++)
!                                       {
!                                               if(members[j]==null)
!                                               {
!                                                       continue;
!                                               }
! 
!                                               MemberComparison 
cmp=CompareMembers(members[j], 
!                                                                               
                                        members[best]);
!                                               if((cmp & 
MemberComparison.Candidate)!= 0)
!                                               {
!                                                       if((cmp & 
MemberComparison.Override)!= 0)
!                                                       {
!                                                               
members[best]=null;
!                                                               best=j;
!                                                       }
!                                                       else
!                                                       {
!                                                               members[j]=null;
!                                                       }
!                                               }
!                                       }
!                                       list.Add(members[best]);
!                               }
!                               return list.ToArray(type);
!                       }
!       
        // Implementation of "GetConstructor" provided by subclasses.
        protected override ConstructorInfo
***************
*** 262,269 ****
                                                                  
BindingFlags.Instance;
                                }
!                               return (ConstructorInfo[])GetMembersImpl
                                                        
(MemberTypes.Constructor,
                                                         bindingAttr | 
BindingFlags.DeclaredOnly,
!                                                        
typeof(ConstructorInfo[]), null);
                        }
  
--- 421,429 ----
                                                                  
BindingFlags.Instance;
                                }
!                               return 
(ConstructorInfo[])TrimMembers(GetMembersImpl
                                                        
(MemberTypes.Constructor,
                                                         bindingAttr | 
BindingFlags.DeclaredOnly,
!                                                        
typeof(ConstructorInfo[]), null),
!                                                        
typeof(ConstructorInfo));
                        }
  
***************
*** 280,286 ****
        public override EventInfo[] GetEvents(BindingFlags bindingAttr)
                        {
!                               return (EventInfo[])GetMembersImpl
                                                        (MemberTypes.Event, 
bindingAttr,
!                                                        typeof(EventInfo[]), 
null);
                        }
  
--- 440,447 ----
        public override EventInfo[] GetEvents(BindingFlags bindingAttr)
                        {
!                               return (EventInfo[])TrimMembers(GetMembersImpl
                                                        (MemberTypes.Event, 
bindingAttr,
!                                                        typeof(EventInfo[]), 
null),
!                                                        typeof(EventInfo));
                        }
  
***************
*** 297,303 ****
        public override FieldInfo[] GetFields(BindingFlags bindingAttr)
                        {
!                               return (FieldInfo[])GetMembersImpl
!                                                       (MemberTypes.Field, 
bindingAttr,
!                                                        typeof(FieldInfo[]), 
null);
                        }
  
--- 458,465 ----
        public override FieldInfo[] GetFields(BindingFlags bindingAttr)
                        {
!                               return (FieldInfo[]) TrimMembers(GetMembersImpl
!                                                                               
(MemberTypes.Field, bindingAttr,
!                                                                               
 typeof(FieldInfo[]), null), 
!                                                                               
 typeof(FieldInfo));
                        }
  
***************
*** 315,320 ****
                                        throw new ArgumentNullException("name");
                                }
!                               return (MemberInfo[])GetMembersImpl
!                                       (type, bindingAttr, 
typeof(MemberInfo[]), name);
                        }
  
--- 477,484 ----
                                        throw new ArgumentNullException("name");
                                }
!                               return (MemberInfo[]) TrimMembers(GetMembersImpl
!                                                                               
(type, bindingAttr, 
!                                                                               
typeof(MemberInfo[]), name),
!                                                                               
typeof(MemberInfo));
                        }
  
***************
*** 322,328 ****
        public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
                        {
!                               return (MemberInfo[])GetMembersImpl
!                                                       (MemberTypes.All, 
bindingAttr,
!                                                        typeof(MemberInfo[]), 
null);
                        }
  
--- 486,494 ----
        public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
                        {
!                               return (MemberInfo[]) TrimMembers(GetMembersImpl
!                                                                               
(MemberTypes.All, 
!                                                                               
bindingAttr, 
!                                                                               
typeof(MemberInfo[]), null),
!                                                                               
typeof(MemberInfo));
                        }
  
***************
*** 344,350 ****
        public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
                        {
!                               return (MethodInfo[])GetMembersImpl
!                                                       (MemberTypes.Method, 
bindingAttr,
!                                                        typeof(MethodInfo[]), 
null);
                        }
  
--- 510,517 ----
        public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
                        {
!                               return (MethodInfo[]) TrimMembers(GetMembersImpl
!                                                                       
(MemberTypes.Method, bindingAttr,
!                                                                        
typeof(MethodInfo[]), null), 
!                                                                        
typeof(MethodInfo));
                        }
  
***************
*** 382,388 ****
        public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
                        {
!                               return (PropertyInfo[])GetMembersImpl
                                                        (MemberTypes.Property, 
bindingAttr,
!                                                        
typeof(PropertyInfo[]), null);
                        }
  
--- 549,555 ----
        public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
                        {
!                               return 
(PropertyInfo[])TrimMembers(GetMembersImpl
                                                        (MemberTypes.Property, 
bindingAttr,
!                                                        
typeof(PropertyInfo[]), null),typeof(PropertyInfo));
                        }
  





reply via email to

[Prev in Thread] Current Thread [Next in Thread]