/[dotgnu-pnet]/pnetlib/runtime/System/Reflection/ClrType.cs
ViewVC logotype

Diff of /pnetlib/runtime/System/Reflection/ClrType.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.27 by t3rmin4t0r, Thu Dec 9 14:09:14 2004 UTC revision 1.28 by t3rmin4t0r, Fri Aug 19 23:07:52 2005 UTC
# Line 274  internal class ClrType : Type, ICloneabl Line 274  internal class ClrType : Type, ICloneabl
274                                  }                                  }
275                                  if(m1.MemberType==MemberTypes.Field)                                  if(m1.MemberType==MemberTypes.Field)
276                                  {                                  {
277                                          if(((FieldInfo)m1).Attributes==((FieldInfo)m2).Attributes)                                          FieldInfo f1 = (FieldInfo)m1;
278                                            FieldInfo f2 = (FieldInfo)m2;
279    
280                                            if(f1.Attributes == f2.Attributes)
281                                          {                                          {
282                                                    if(((f1.Attributes & FieldAttributes.FieldAccessMask) & FieldAttributes.Private) != 0)
283                                                    {
284                                                            // Private members never override each other.
285                                                            // Very important for serialization.
286                                                            // TODO: more research on protected and internal stuff here.
287                                                            return MemberComparison.None;
288                                                    }
289                                                  goto overrideCheck;                                                  goto overrideCheck;
290                                          }                                          }
291                                  }                                  }
# Line 370  internal class ClrType : Type, ICloneabl Line 380  internal class ClrType : Type, ICloneabl
380                          }                          }
381    
382          /// <summary>          /// <summary>
383          /// This function sorts and removes overrides from an array of          /// This function removes overrides from an array of
384          /// MemberInfo[]          /// MemberInfo[] while retaining original order of
385            /// the members in the array.
386          /// </summary>          /// </summary>
387          private Object TrimMembers(Object memberArray, Type type)          private Object TrimMembers(Object memberArray, Type type)
388                          {                          {
389                                  MemberInfo[] members=(MemberInfo[])(memberArray);                                  MemberInfo[] members=(MemberInfo[])(memberArray);
390                                  ArrayList list=new ArrayList(members.Length/2);                                  BitArray visibleMask = new BitArray(members.Length, false);
391                                    int count = 0;
392                                  int best;                                  int best;
393    
394                                  // Sort the members on name to make it easier to                                  // Technically speaking, this algorithm
395                                  // efficiently remove overrides.                                  // should not touch a type twice in the
396                                  Array.Sort(members, memberNameComparer);                                  // inner loop. Need to fix that up
397                                    // Real Soon Now (tm).
398                                  // Remove overrides from the list.                                  for(int i = 0; i < members.Length; i++)
                                 int i = 0;  
                                 while(i < members.Length)  
399                                  {                                  {
400                                          best = i;                                          best = i;
401                                          ++i;                                          for(int j = 0; j < members.Length; j++)
                                         while(i < members.Length &&  
                                               members[i].Name == members[best].Name)  
402                                          {                                          {
403                                                  MemberComparison cmp = CompareMembers(members[i],                                                  if(members[j].Name != members[best].Name)
404                                                                                                                            members[best]);                                                  {
405                                                            continue;
406                                                    }
407                                                    MemberComparison cmp = CompareMembers(members[j],
408                                                                                                                                    members[best]);
409                                                  if(cmp == MemberComparison.None)                                                  if(cmp == MemberComparison.None)
410                                                  {                                                  {
411                                                          break;                                                          break;
# Line 402  internal class ClrType : Type, ICloneabl Line 414  internal class ClrType : Type, ICloneabl
414                                                  {                                                  {
415                                                          if((cmp & MemberComparison.Override) != 0)                                                          if((cmp & MemberComparison.Override) != 0)
416                                                          {                                                          {
417                                                                  best = i;                                                                  best = j;
418                                                          }                                                          }
419                                                  }                                                  }
                                                 ++i;  
420                                          }                                          }
421                                          list.Add(members[best]);                                          if(visibleMask[best] == false)
422                                            {
423                                                    visibleMask[best] = true;
424                                                    count++;
425                                            }
426                                    }
427                                    MemberInfo [] newMembers = (MemberInfo[])Array.CreateInstance(type,count);
428                                    for(int i = 0, j = 0; i < visibleMask.Count; i++)
429                                    {
430                                            if(visibleMask[i] == true)
431                                            {
432                                                    newMembers[j++] = members[i];
433                                            }
434                                  }                                  }
435                                  return list.ToArray(type);                                  return newMembers;
436                          }                          }
437                    
438          // Implementation of "GetConstructor" provided by subclasses.          // Implementation of "GetConstructor" provided by subclasses.

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.28

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26