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

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

[Dotgnu-pnet-commits] CVS: pnet/image member.c,1.25,1.26


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/image member.c,1.25,1.26
Date: Sat, 05 Jul 2003 00:06:12 -0400

Update of /cvsroot/dotgnu-pnet/pnet/image
In directory subversions:/tmp/cvs-serv29426/image

Modified Files:
        member.c 
Log Message:


Search for the "virtual" method corresponding to an "override"
and report a bug if one isn't present (Bug #4196); property
signatures should never use the "hasthis" flag, as it is stored
on the underlying accessor methods instead.


Index: member.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/image/member.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -r1.25 -r1.26
*** member.c    9 May 2003 09:34:33 -0000       1.25
--- member.c    5 Jul 2003 04:06:10 -0000       1.26
***************
*** 352,355 ****
--- 352,427 ----
  }
  
+ static ILMethod *MemberToMethod(ILMember *member)
+ {
+       ILMethod *accessor;
+       member = ILMemberResolve(member);
+       if(ILMember_IsMethod(member))
+       {
+               return (ILMethod *)member;
+       }
+       else if(ILMember_IsProperty(member))
+       {
+               accessor = ILProperty_Getter((ILProperty *)member);
+               if(!accessor)
+               {
+                       accessor = ILProperty_Setter((ILProperty *)member);
+               }
+               return accessor;
+       }
+       else if(ILMember_IsEvent(member))
+       {
+               accessor = ILEvent_AddOn((ILEvent *)member);
+               if(!accessor)
+               {
+                       accessor = ILEvent_RemoveOn((ILEvent *)member);
+               }
+               return accessor;
+       }
+       else
+       {
+               return 0;
+       }
+ }
+ 
+ ILMember *ILMemberGetBase(ILMember *member)
+ {
+       ILClass *classInfo = ILClassResolve(ILMember_Owner(member));
+       ILClass *origClass = classInfo;
+       ILMember *testMember;
+       ILMethod *underlying;
+       if(classInfo)
+       {
+               classInfo = ILClass_Parent(classInfo);
+       }
+       while(classInfo != 0)
+       {
+               testMember = 0;
+               while((testMember = ILClassNextMemberByKind
+                                       (classInfo, testMember, 
ILMemberGetKind(member))) != 0)
+               {
+                       if(!strcmp(ILMember_Name(testMember), 
ILMember_Name(member)) &&
+                          ILTypeIdentical(ILMember_Signature(testMember),
+                                                          
ILMember_Signature(member)))
+                       {
+                               /* The member must be accessible from the 
original
+                                  class to be considered a candidate.  This 
allows
+                                  us to skip "private" members in parent 
classes
+                                  that might otherwise indicate a match */
+                               if(ILMemberAccessible(testMember, origClass))
+                               {
+                                       underlying = MemberToMethod(testMember);
+                                       if(underlying && 
ILMethod_IsVirtual(underlying) &&
+                                          ILMethod_IsNewSlot(underlying))
+                                       {
+                                               return testMember;
+                                       }
+                               }
+                       }
+               }
+               classInfo = ILClass_Parent(classInfo);
+       }
+       return 0;
+ }
+ 
  ILMethod *ILMethodCreate(ILClass *info, ILToken token,
                                                 const char *name, ILUInt32 
attributes)





reply via email to

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