X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection%2FMonoField.cs;h=2b3894dd0ff693c5270ff53f025db433238acc20;hb=4323fbeaebf249f016dfdd6dc9b3b52a515f87c4;hp=cf58b904745ab4f2377a7890900985fe9d6507ee;hpb=b41bf89278a81608327476423368ca35bd55b56d;p=mono.git diff --git a/mcs/class/corlib/System.Reflection/MonoField.cs b/mcs/class/corlib/System.Reflection/MonoField.cs old mode 100755 new mode 100644 index cf58b904745..2b3894dd0ff --- a/mcs/class/corlib/System.Reflection/MonoField.cs +++ b/mcs/class/corlib/System.Reflection/MonoField.cs @@ -1,4 +1,27 @@ +// +// Copyright (C) 2004 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 +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + // // System.Reflection/MonoField.cs // The class used to represent Fields from the mono runtime. @@ -13,61 +36,51 @@ using System; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.Serialization; namespace System.Reflection { - - internal struct MonoFieldInfo { - public Type parent; - public Type type; - public String name; - public FieldAttributes attrs; - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void get_field_info (MonoField field, out MonoFieldInfo info); - } - internal class MonoField : FieldInfo { + [Serializable] + internal class MonoField : FieldInfo, ISerializable { internal IntPtr klass; internal RuntimeFieldHandle fhandle; + string name; + Type type; + FieldAttributes attrs; public override FieldAttributes Attributes { get { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return info.attrs; + return attrs; } } public override RuntimeFieldHandle FieldHandle { - get {return fhandle;} + get { + return fhandle; + } } public override Type FieldType { get { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return info.type; + return type; } } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern Type GetParentType (bool declaring); + public override Type ReflectedType { get { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return info.parent; + return GetParentType (false); } } public override Type DeclaringType { get { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return info.parent; + return GetParentType (true); } } public override string Name { get { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return info.name; + return name; } } @@ -82,23 +95,74 @@ namespace System.Reflection { return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit); } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal override extern int GetFieldOffset (); + [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern object GetValueInternal (object obj); public override object GetValue (object obj) { + if (!IsStatic && obj == null) + throw new TargetException ("Non-static field requires a target"); + CheckGeneric (); return GetValueInternal (obj); } public override string ToString () { - MonoFieldInfo info; - MonoFieldInfo.get_field_info (this, out info); - return String.Format ("{0} {1}", info.type, info.name); + return String.Format ("{0} {1}", type, name); } - [MonoTODO] + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void SetValueInternal (FieldInfo fi, object obj, object value); + public override void SetValue (object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture) { + if (!IsStatic && obj == null) + throw new TargetException ("Non-static field requires a target"); + if (IsLiteral) + throw new FieldAccessException ("Cannot set a constant field"); + if (binder == null) + binder = Binder.DefaultBinder; + CheckGeneric (); + if (val != null) { + object newVal; + newVal = binder.ChangeType (val, type, culture); + if (newVal == null) + throw new ArgumentException ("Object type " + val.GetType() + " cannot be converted to target type: " + type, "val"); + val = newVal; + } + SetValueInternal (this, obj, val); + } + + internal MonoField Clone (string newName) + { + MonoField field = new MonoField (); + field.name = newName; + field.type = type; + field.attrs = attrs; + field.klass = klass; + field.fhandle = fhandle; + return field; } + + // ISerializable + public void GetObjectData (SerializationInfo info, StreamingContext context) + { + MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType, + ToString(), MemberTypes.Field); + } + +#if NET_2_0 + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public override extern object GetRawConstantValue (); +#endif + + void CheckGeneric () { +#if NET_2_0 + if (DeclaringType.ContainsGenericParameters) + throw new InvalidOperationException ("Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true."); +#endif + } } }