X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FRuntimeTypeHandle.cs;h=eb6c42f097648ff77d290c66f24e2a600768da87;hb=d88424370f59e5dfaab106bc86f82d586d6cf4f9;hp=3875173e2fb8e0ce9bea9dd6a8246bb95c964091;hpb=496dfbf9ec0fd3143e5dd560a863d916e56a52b8;p=mono.git diff --git a/mcs/class/corlib/System/RuntimeTypeHandle.cs b/mcs/class/corlib/System/RuntimeTypeHandle.cs index 3875173e2fb..eb6c42f0976 100644 --- a/mcs/class/corlib/System/RuntimeTypeHandle.cs +++ b/mcs/class/corlib/System/RuntimeTypeHandle.cs @@ -33,17 +33,15 @@ using System.Runtime.Serialization; using System.Runtime.InteropServices; - -#if NET_2_0 using System.Runtime.ConstrainedExecution; -#endif +using System.Threading; +using System.Runtime.CompilerServices; +using System.Reflection; +using System.Diagnostics.Contracts; namespace System { -#if NET_2_0 [ComVisible (true)] -#endif - [MonoTODO ("Serialization needs tests")] [Serializable] public struct RuntimeTypeHandle : ISerializable { @@ -54,12 +52,17 @@ namespace System value = val; } + internal RuntimeTypeHandle (RuntimeType type) + : this (type._impl.value) + { + } + RuntimeTypeHandle (SerializationInfo info, StreamingContext context) { if (info == null) throw new ArgumentNullException ("info"); - MonoType mt = ((MonoType) info.GetValue ("TypeObj", typeof (MonoType))); + RuntimeType mt = ((RuntimeType) info.GetValue ("TypeObj", typeof (RuntimeType))); value = mt.TypeHandle.Value; if (value == IntPtr.Zero) throw new SerializationException (Locale.GetText ("Insufficient state.")); @@ -76,10 +79,12 @@ namespace System if (info == null) throw new ArgumentNullException ("info"); - info.AddValue ("TypeObj", Type.GetTypeHandle (this), typeof (MonoType)); + if (value == IntPtr.Zero) + throw new SerializationException ("Object fields may not be properly initialized"); + + info.AddValue ("TypeObj", Type.GetTypeHandle (this), typeof (RuntimeType)); } -#if NET_2_0 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] public override bool Equals (object obj) { @@ -100,14 +105,14 @@ namespace System return value.GetHashCode (); } - public static bool operator == (RuntimeTypeHandle left, RuntimeTypeHandle right) + public static bool operator == (RuntimeTypeHandle left, Object right) { - return left.Equals (right); + return (right != null) && (right is RuntimeTypeHandle) && left.Equals ((RuntimeTypeHandle)right); } - public static bool operator != (RuntimeTypeHandle left, RuntimeTypeHandle right) + public static bool operator != (RuntimeTypeHandle left, Object right) { - return !left.Equals (right); + return (right == null) || !(right is RuntimeTypeHandle) || !left.Equals ((RuntimeTypeHandle)right); } public static bool operator == (Object left, RuntimeTypeHandle right) @@ -120,11 +125,123 @@ namespace System return (left == null) || !(left is RuntimeTypeHandle) || !((RuntimeTypeHandle)left).Equals (right); } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern TypeAttributes GetAttributes (RuntimeType type); + [CLSCompliant (false)] [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] - public ModuleHandle GetModuleHandle () { + public ModuleHandle GetModuleHandle () + { + // Although MS' runtime is crashing here, we prefer throwing an exception. + // The check is needed because Type.GetTypeFromHandle returns null + // for zero handles. + if (value == IntPtr.Zero) + throw new InvalidOperationException ("Object fields may not be properly initialized"); + return Type.GetTypeFromHandle (this).Module.ModuleHandle; } -#endif + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + static extern int GetMetadataToken (RuntimeType type); + + internal static int GetToken (RuntimeType type) + { + return GetMetadataToken (type); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + extern static Type GetGenericTypeDefinition_impl (RuntimeType type); + + internal static Type GetGenericTypeDefinition (RuntimeType type) + { + return GetGenericTypeDefinition_impl (type); + } + + internal static bool HasElementType (RuntimeType type) + { + return IsArray (type) || IsByRef (type) || IsPointer (type); + } + + internal static bool HasProxyAttribute (RuntimeType type) + { + throw new NotImplementedException ("HasProxyAttribute"); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool HasInstantiation (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsArray(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsByRef (RuntimeType type); + + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern static bool IsComObject (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsInstanceOfType (RuntimeType type, Object o); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsPointer (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsPrimitive (RuntimeType type); + + internal static bool IsComObject (RuntimeType type, bool isGenericCOM) + { + return isGenericCOM ? false : IsComObject (type); + } + + internal static bool IsContextful (RuntimeType type) + { + return typeof (ContextBoundObject).IsAssignableFrom (type); + } + + internal static bool IsEquivalentTo (RuntimeType rtType1, RuntimeType rtType2) + { + // refence check is done earlier and we don't recognize anything else + return false; + } + + internal static bool IsSzArray(RuntimeType type) + { + // TODO: Better check + return IsArray (type) && type.GetArrayRank () == 1; + } + + internal static bool IsInterface (RuntimeType type) + { + return (type.Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static int GetArrayRank(RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static RuntimeAssembly GetAssembly (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static RuntimeType GetElementType (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static RuntimeModule GetModule (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsGenericVariable (RuntimeType type); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static RuntimeType GetBaseType (RuntimeType type); + + internal static bool CanCastTo (RuntimeType type, RuntimeType target) + { + return type_is_assignable_from (target, type); + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + static extern bool type_is_assignable_from (Type a, Type b); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern static bool IsGenericTypeDefinition (RuntimeType type); } }