[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/engine lib_type.c,1.36,1.37,
Gopal.V <address@hidden> <=