X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Ftypemanager.cs;h=51bc5326bca4c7f3d194f6361fb58dd02eaac46c;hb=5ace7ce140d57c2e441ea2bd66d3a5887d55563f;hp=65725bafc3d7eacaa798d41e7dab8bdf8e64315c;hpb=a779b309ab59e88b4f29666fab166916ad815622;p=mono.git diff --git a/mcs/mcs/typemanager.cs b/mcs/mcs/typemanager.cs index 65725bafc3d..51bc5326bca 100644 --- a/mcs/mcs/typemanager.cs +++ b/mcs/mcs/typemanager.cs @@ -3,12 +3,13 @@ // // Author: Miguel de Icaza (miguel@gnu.org) // Ravi Pratap (ravi@ximian.com) -// Marek Safar (marek.safar@seznam.cz) +// Marek Safar (marek.safar@gmail.com) // // Dual licensed under the terms of the MIT X11 or GNU GPL // // Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) -// Copyright 2003-2008 Novell, Inc. +// Copyright 2003-2011 Novell, Inc. +// Copyright 2011 Xamarin Inc // using System; @@ -208,6 +209,7 @@ namespace Mono.CSharp public readonly PredefinedType MethodBase; public readonly PredefinedType MethodInfo; public readonly PredefinedType ConstructorInfo; + public readonly PredefinedType MemberBinding; // // C# 4.0 @@ -217,6 +219,16 @@ namespace Mono.CSharp public readonly PredefinedType CallSiteGeneric; public readonly PredefinedType BinderFlags; + // + // C# 5.0 + // + public readonly PredefinedType AsyncVoidMethodBuilder; + public readonly PredefinedType AsyncTaskMethodBuilder; + public readonly PredefinedType AsyncTaskMethodBuilderGeneric; + public readonly PredefinedType Action; + public readonly PredefinedType Task; + public readonly PredefinedType TaskGeneric; + public PredefinedTypes (ModuleContainer module) { TypedReference = new PredefinedType (module, MemberKind.Struct, "System", "TypedReference"); @@ -246,6 +258,7 @@ namespace Mono.CSharp Expression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression"); ExpressionGeneric = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression", 1); + MemberBinding = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "MemberBinding"); ParameterExpression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "ParameterExpression"); FieldInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "FieldInfo"); MethodBase = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodBase"); @@ -257,6 +270,13 @@ namespace Mono.CSharp Binder = new PredefinedType (module, MemberKind.Class, "Microsoft.CSharp.RuntimeBinder", "Binder"); BinderFlags = new PredefinedType (module, MemberKind.Enum, "Microsoft.CSharp.RuntimeBinder", "CSharpBinderFlags"); + Action = new PredefinedType (module, MemberKind.Delegate, "System", "Action"); + AsyncVoidMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncVoidMethodBuilder"); + AsyncTaskMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder"); + AsyncTaskMethodBuilderGeneric = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder", 1); + Task = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task"); + TaskGeneric = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task", 1); + // // Define types which are used for comparison. It does not matter // if they don't exist as no error report is needed @@ -281,12 +301,27 @@ namespace Mono.CSharp if (ExpressionGeneric.Define ()) ExpressionGeneric.TypeSpec.IsExpressionTreeType = true; + + Task.Define (); + if (TaskGeneric.Define ()) + TaskGeneric.TypeSpec.IsGenericTask = true; } } class PredefinedMembers { public readonly PredefinedMember ActivatorCreateInstance; + public readonly PredefinedMember AsyncTaskMethodBuilderCreate; + public readonly PredefinedMember AsyncTaskMethodBuilderSetResult; + public readonly PredefinedMember AsyncTaskMethodBuilderSetException; + public readonly PredefinedMember AsyncTaskMethodBuilderTask; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericCreate; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericSetResult; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericSetException; + public readonly PredefinedMember AsyncTaskMethodBuilderGenericTask; + public readonly PredefinedMember AsyncVoidMethodBuilderCreate; + public readonly PredefinedMember AsyncVoidMethodBuilderSetException; + public readonly PredefinedMember AsyncVoidMethodBuilderSetResult; public readonly PredefinedMember DecimalCtor; public readonly PredefinedMember DecimalCtorInt; public readonly PredefinedMember DecimalCtorLong; @@ -318,7 +353,6 @@ namespace Mono.CSharp public readonly PredefinedMember StringInequal; public readonly PredefinedMember StructLayoutAttributeCtor; public readonly PredefinedMember StructLayoutCharSet; - public readonly PredefinedMember StructLayoutPack; public readonly PredefinedMember StructLayoutSize; public readonly PredefinedMember TypeGetTypeFromHandle; @@ -331,6 +365,43 @@ namespace Mono.CSharp ActivatorCreateInstance = new PredefinedMember (module, types.Activator, MemberFilter.Method ("CreateInstance", 1, ParametersCompiled.EmptyReadOnlyParameters, null)); + AsyncTaskMethodBuilderCreate = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncTaskMethodBuilder.TypeSpec)); + + AsyncTaskMethodBuilderSetResult = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void)); + + AsyncTaskMethodBuilderSetException = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Method ("SetException", 0, + ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void)); + + AsyncTaskMethodBuilderTask = new PredefinedMember (module, types.AsyncTaskMethodBuilder, + MemberFilter.Property ("Task", null)); + + AsyncTaskMethodBuilderGenericCreate = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec)); + + AsyncTaskMethodBuilderGenericSetResult = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + "SetResult", MemberKind.Method, () => new TypeSpec[] { + types.AsyncTaskMethodBuilderGeneric.TypeSpec.MemberDefinition.TypeParameters[0] + }); + + AsyncTaskMethodBuilderGenericSetException = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Method ("SetException", 0, + ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void)); + + AsyncTaskMethodBuilderGenericTask = new PredefinedMember (module, types.AsyncTaskMethodBuilderGeneric, + MemberFilter.Property ("Task", null)); + + AsyncVoidMethodBuilderCreate = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec)); + + AsyncVoidMethodBuilderSetException = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("SetException", 0, null, btypes.Void)); + + AsyncVoidMethodBuilderSetResult = new PredefinedMember (module, types.AsyncVoidMethodBuilder, + MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void)); + DecimalCtor = new PredefinedMember (module, btypes.Decimal, MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved ( btypes.Int, btypes.Int, btypes.Int, btypes.Bool, btypes.Byte))); @@ -450,9 +521,6 @@ namespace Mono.CSharp StructLayoutCharSet = new PredefinedMember (module, atypes.StructLayout, "CharSet", MemberKind.Field, types.CharSet); - StructLayoutPack = new PredefinedMember (module, atypes.StructLayout, - MemberFilter.Field ("Pack", btypes.Int)); - StructLayoutSize = new PredefinedMember (module, atypes.StructLayout, MemberFilter.Field ("Size", btypes.Int)); @@ -631,8 +699,8 @@ namespace Mono.CSharp T member; TypeSpec declaring_type; readonly PredefinedType declaring_type_predefined; - readonly PredefinedType[] parameters_predefined; MemberFilter filter; + readonly Func filter_builder; public PredefinedMember (ModuleContainer module, PredefinedType type, MemberFilter filter) { @@ -656,7 +724,24 @@ namespace Mono.CSharp public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, params PredefinedType[] types) : this (module, type, new MemberFilter (name, 0, kind, null, null)) { - parameters_predefined = types; + filter_builder = () => { + var ptypes = new TypeSpec[types.Length]; + for (int i = 0; i < ptypes.Length; ++i) { + var p = types[i]; + if (!p.Define ()) + return null; + + ptypes[i] = p.TypeSpec; + } + + return ptypes; + }; + } + + public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func typesBuilder) + : this (module, type, new MemberFilter (name, 0, kind, null, null)) + { + filter_builder = typesBuilder; } public PredefinedMember (ModuleContainer module, BuiltinTypeSpec type, string name, params TypeSpec[] types) @@ -676,20 +761,14 @@ namespace Mono.CSharp declaring_type = declaring_type_predefined.TypeSpec; } - if (parameters_predefined != null) { - TypeSpec[] types = new TypeSpec [parameters_predefined.Length]; - for (int i = 0; i < types.Length; ++i) { - var p = parameters_predefined [i]; - if (!p.Define ()) - return null; - - types[i] = p.TypeSpec; - } + if (filter_builder != null) { + var types = filter_builder (); if (filter.Kind == MemberKind.Field) filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, null, types [0]); else - filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, ParametersCompiled.CreateFullyResolved (types), filter.MemberType); + filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, + ParametersCompiled.CreateFullyResolved (types), filter.MemberType); } member = MemberCache.FindMember (declaring_type, filter, BindingRestriction.DeclaredOnly) as T; @@ -715,16 +794,9 @@ namespace Mono.CSharp return null; } - if (parameters_predefined != null) { - TypeSpec[] types = new TypeSpec[parameters_predefined.Length]; - for (int i = 0; i < types.Length; ++i) { - var p = parameters_predefined[i]; - types[i] = p.Resolve (); - if (types[i] == null) - return null; - } - - filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, ParametersCompiled.CreateFullyResolved (types), filter.MemberType); + if (filter_builder != null) { + filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, + ParametersCompiled.CreateFullyResolved (filter_builder ()), filter.MemberType); } string method_args = null; @@ -772,43 +844,6 @@ namespace Mono.CSharp { return mb.GetSignatureForError (); } - - // Obsolete - public static bool IsDelegateType (TypeSpec t) - { - return t.IsDelegate; - } - - // Obsolete - public static bool IsEnumType (TypeSpec t) - { - return t.IsEnum; - } - - // - // Whether a type is unmanaged. This is used by the unsafe code (25.2) - // - public static bool IsUnmanagedType (TypeSpec t) - { - var ds = t.MemberDefinition as DeclSpace; - if (ds != null) - return ds.IsUnmanagedType (); - - if (t.Kind == MemberKind.Void) - return true; - - // Someone did the work of checking if the ElementType of t is unmanaged. Let's not repeat it. - if (t.IsPointer) - return IsUnmanagedType (GetElementType (t)); - - if (!TypeSpec.IsValueType (t)) - return false; - - if (t.IsNested && t.DeclaringType.IsGenericOrParentIsGeneric) - return false; - - return true; - } public static bool IsFamilyAccessible (TypeSpec type, TypeSpec parent) { @@ -874,12 +909,12 @@ namespace Mono.CSharp /// public static bool VerifyUnmanaged (ModuleContainer rc, TypeSpec t, Location loc) { - while (t.IsPointer) - t = GetElementType (t); - - if (IsUnmanagedType (t)) + if (t.IsUnmanaged) return true; + while (t.IsPointer) + t = ((ElementTypeSpec) t).Element; + rc.Compiler.Report.SymbolRelatedToPreviousError (t); rc.Compiler.Report.Error (208, loc, "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'",