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

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

[Dotgnu-pnet-commits] CVS: pnet/engine lib_type.c,1.36,1.37


From: Gopal.V <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/engine lib_type.c,1.36,1.37
Date: Thu, 24 Jul 2003 22:24:36 -0400

Update of /cvsroot/dotgnu-pnet/pnet/engine
In directory subversions:/tmp/cvs-serv29348/engine

Modified Files:
        lib_type.c 
Log Message:
Fix for bug #3520 , GetMemberImpl() now removes overriden members


Index: lib_type.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/lib_type.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -r1.36 -r1.37
*** lib_type.c  19 Jul 2003 16:48:41 -0000      1.36
--- lib_type.c  25 Jul 2003 02:24:33 -0000      1.37
***************
*** 1875,1878 ****
--- 1875,1960 ----
  }
  
+ /*
+  * Get the method underlying a member, for permission and access checks.
+  * Returns NULL if there is no underlying method.
+  */
+ static ILMethod *GetUnderlyingMethod(ILMember *member)
+ {
+       ILMethod *method;
+ 
+       switch(ILMemberGetKind(member))
+       {
+               case IL_META_MEMBERKIND_METHOD:
+               {
+                       return (ILMethod *)member;
+               }
+               /* Not reached */
+ 
+               case IL_META_MEMBERKIND_PROPERTY:
+               {
+                       method = ILProperty_Getter((ILProperty *)member);
+                       if(method)
+                       {
+                               return method;
+                       }
+                       method = ILProperty_Setter((ILProperty *)member);
+                       if(method)
+                       {
+                               return method;
+                       }
+               }
+               break;
+ 
+               case IL_META_MEMBERKIND_EVENT:
+               {
+                       method = ILEvent_AddOn((ILEvent *)member);
+                       if(method)
+                       {
+                               return method;
+                       }
+                       method = ILEvent_RemoveOn((ILEvent *)member);
+                       if(method)
+                       {
+                               return method;
+                       }
+               }
+               break;
+       }
+ 
+       return 0;
+ }
+ 
+ /* 
+  * Check if member1 override member2 or vice versa , return overriding 
+  * member , else return NULL.
+  *
+  * TODO: handle "new" instance methods, fields and methods
+  */
+ static ILMember * CheckMemberOverride(ILMember *member1, ILMember *member2)
+ {
+       ILMethod *method1, *method2;
+       ILClass *class1, *class2;
+ 
+       method1=GetUnderlyingMethod(member1);
+       method2=GetUnderlyingMethod(member2);
+       if(!method1 || !method2) return NULL;
+       if(!ILMethod_IsVirtual(method1) || !ILMethod_IsVirtual(method2)) 
+       {
+               return NULL;
+       }
+       class1=ILMember_Owner(member1);
+       class2=ILMember_Owner(member2);
+       /* Note: I'm assuming here that the object heirarchy says it all */
+       if(ILClassInheritsFrom(class1,class2))
+       {
+               return member1;
+       }
+       if(ILClassInheritsFrom(class2, class1))
+       {
+               return member2;
+       }
+       return NULL;
+ }
+ 
  #endif /* IL_CONFIG_REFLECTION */
  
***************
*** 1899,1902 ****
--- 1981,1985 ----
        char *nameUtf8;
        ILMember *member;
+       ILMember *otherMember;
        ILProgramItem *foundItem;
        ILNestedInfo *nested;
***************
*** 2003,2006 ****
--- 2086,2097 ----
                        if(foundItem)
                        {
+                               otherMember=ILProgramItemToMember(foundItem);
+                               if(ILMemberGetKind(member) == 
ILMemberGetKind(otherMember) &&
+                                 (otherMember=CheckMemberOverride(otherMember, 
member))!=NULL)
+                               {
+                                       foundItem = &(otherMember->programItem);
+                                       member = member->nextMember;
+                                       continue;                               
        
+                               }
                                /* The member match is ambiguous */
                        ambiguous:





reply via email to

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