X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection%2FMonoEvent.cs;h=876de83bff0a9c2a5758d2d4f3babd590c34e9b9;hb=ac194553049b2eeb328f5fc54b708da9b95f4d88;hp=95b25b008132954e4f7e16119014faa8fbc36860;hpb=c4a3b30460c7ea1a1fb3c97cfc8478555714af2f;p=mono.git diff --git a/mcs/class/corlib/System.Reflection/MonoEvent.cs b/mcs/class/corlib/System.Reflection/MonoEvent.cs index 95b25b00813..876de83bff0 100644 --- a/mcs/class/corlib/System.Reflection/MonoEvent.cs +++ b/mcs/class/corlib/System.Reflection/MonoEvent.cs @@ -8,7 +8,7 @@ // // -// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// Copyright (C) 2004, 2009 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -31,9 +31,12 @@ // using System; +using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Diagnostics.Contracts; namespace System.Reflection { @@ -48,83 +51,138 @@ namespace System.Reflection { public MethodInfo[] other_methods; [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void get_event_info (MonoEvent ev, out MonoEventInfo info); + static extern void get_event_info (MonoEvent ev, out MonoEventInfo info); + + internal static MonoEventInfo GetEventInfo (MonoEvent ev) + { + MonoEventInfo mei; + MonoEventInfo.get_event_info (ev, out mei); + return mei; + } } - internal sealed class MonoEvent: EventInfo { + abstract class RuntimeEventInfo : EventInfo, ISerializable + { + internal BindingFlags BindingFlags { + get { + return 0; + } + } + + public override Module Module { + get { + return GetRuntimeModule (); + } + } + + internal RuntimeType GetDeclaringTypeInternal () + { + return (RuntimeType) DeclaringType; + } + + RuntimeType ReflectedTypeInternal { + get { + return (RuntimeType) ReflectedType; + } + } + + internal RuntimeModule GetRuntimeModule () + { + return GetDeclaringTypeInternal ().GetRuntimeModule (); + } + + #region ISerializable + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + throw new ArgumentNullException("info"); + Contract.EndContractBlock(); + + MemberInfoSerializationHolder.GetSerializationInfo( + info, + Name, + ReflectedTypeInternal, + null, + MemberTypes.Event); + } + #endregion + } + + [Serializable] + [StructLayout (LayoutKind.Sequential)] + internal sealed class MonoEvent: RuntimeEventInfo + { +#pragma warning disable 169 IntPtr klass; IntPtr handle; +#pragma warning restore 169 public override EventAttributes Attributes { get { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - return info.attrs; + return MonoEventInfo.GetEventInfo (this).attrs; } } - public override MethodInfo GetAddMethod(bool nonPublic) { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - + public override MethodInfo GetAddMethod (bool nonPublic) + { + MonoEventInfo info = MonoEventInfo.GetEventInfo (this); if (nonPublic || (info.add_method != null && info.add_method.IsPublic)) return info.add_method; return null; } - public override MethodInfo GetRaiseMethod( bool nonPublic) { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - + public override MethodInfo GetRaiseMethod (bool nonPublic) + { + MonoEventInfo info = MonoEventInfo.GetEventInfo (this); if (nonPublic || (info.raise_method != null && info.raise_method.IsPublic)) return info.raise_method; return null; } - public override MethodInfo GetRemoveMethod( bool nonPublic) { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - + public override MethodInfo GetRemoveMethod (bool nonPublic) + { + MonoEventInfo info = MonoEventInfo.GetEventInfo (this); if (nonPublic || (info.remove_method != null && info.remove_method.IsPublic)) return info.remove_method; return null; } -#if NET_2_0 - public override MethodInfo[] GetOtherMethods (bool nonPublic) { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - return info.other_methods; + public override MethodInfo[] GetOtherMethods (bool nonPublic) + { + MonoEventInfo info = MonoEventInfo.GetEventInfo (this); + if (nonPublic) + return info.other_methods; + int num_public = 0; + foreach (MethodInfo m in info.other_methods) { + if (m.IsPublic) + num_public++; + } + if (num_public == info.other_methods.Length) + return info.other_methods; + MethodInfo[] res = new MethodInfo [num_public]; + num_public = 0; + foreach (MethodInfo m in info.other_methods) { + if (m.IsPublic) + res [num_public++] = m; + } + return res; } -#endif public override Type DeclaringType { get { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - return info.declaring_type; + return MonoEventInfo.GetEventInfo (this).declaring_type; } } public override Type ReflectedType { get { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - return info.reflected_type; + return MonoEventInfo.GetEventInfo (this).reflected_type; } } public override string Name { get { - MonoEventInfo info; - MonoEventInfo.get_event_info (this, out info); - - return info.name; + return MonoEventInfo.GetEventInfo (this).name; } } @@ -148,5 +206,8 @@ namespace System.Reflection { return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit); } + public override IList GetCustomAttributesData () { + return CustomAttributeData.GetCustomAttributes (this); + } } }