Don't check constraints for anonymous method stories it's not needed and it's hard...
[mono.git] / mcs / mcs / codegen.cs
index 4041a6ae3797eb5149d53056585c30b668d2ec4b..e8900de8bf1d5ea9d1116526a2b78e35101b1f75 100644 (file)
@@ -101,6 +101,12 @@ namespace Mono.CSharp
 
                #region Properties
 
+               public BuiltinTypes BuiltinTypes {
+                       get {
+                               return MemberContext.Module.Compiler.BuiltinTypes;
+                       }
+               }
+
                public TypeSpec CurrentType {
                        get { return member_context.CurrentType; }
                }
@@ -117,7 +123,7 @@ namespace Mono.CSharp
                        get { return member_context.IsStatic; }
                }
 
-               bool IsAnonymousStoreyMutateRequired {
+               public bool IsAnonymousStoreyMutateRequired {
                        get {
                                return CurrentAnonymousMethod != null &&
                                        CurrentAnonymousMethod.Storey != null &&
@@ -202,7 +208,7 @@ namespace Mono.CSharp
                //
                // Creates a nested container in this context for all dynamic compiler generated stuff
                //
-               public DynamicSiteClass CreateDynamicSite ()
+               internal DynamicSiteClass CreateDynamicSite ()
                {
                        if (dynamic_site_container == null) {
                                var mc = member_context.CurrentMemberDefinition as MemberBase;
@@ -213,6 +219,10 @@ namespace Mono.CSharp
                                dynamic_site_container.DefineType ();
                                dynamic_site_container.ResolveTypeParameters ();
                                dynamic_site_container.Define ();
+
+                               var inflator = new TypeParameterInflator (Module, CurrentType, TypeParameterSpec.EmptyTypes, TypeSpec.EmptyTypes);
+                               var inflated = dynamic_site_container.CurrentType.InflateMember (inflator);
+                               CurrentType.MemberCache.AddMember (inflated);
                        }
 
                        return dynamic_site_container;
@@ -364,51 +374,57 @@ namespace Mono.CSharp
                        if (type.Kind == MemberKind.Enum)
                                type = EnumSpec.GetUnderlyingType (type);
 
-                       switch (type.BuildinType) {
-                       case BuildinTypeSpec.Type.Byte:
-                       case BuildinTypeSpec.Type.Bool:
+                       switch (type.BuiltinType) {
+                       case BuiltinTypeSpec.Type.Byte:
+                       case BuiltinTypeSpec.Type.Bool:
                                Emit (OpCodes.Ldelem_U1);
                                return;
-                       case BuildinTypeSpec.Type.SByte:
+                       case BuiltinTypeSpec.Type.SByte:
                                Emit (OpCodes.Ldelem_I1);
                                return;
-                       case BuildinTypeSpec.Type.Short:
+                       case BuiltinTypeSpec.Type.Short:
                                Emit (OpCodes.Ldelem_I2);
                                return;
-                       case BuildinTypeSpec.Type.UShort:
-                       case BuildinTypeSpec.Type.Char:
+                       case BuiltinTypeSpec.Type.UShort:
+                       case BuiltinTypeSpec.Type.Char:
                                Emit (OpCodes.Ldelem_U2);
                                return;
-                       case BuildinTypeSpec.Type.Int:
+                       case BuiltinTypeSpec.Type.Int:
                                Emit (OpCodes.Ldelem_I4);
                                return;
-                       case BuildinTypeSpec.Type.UInt:
+                       case BuiltinTypeSpec.Type.UInt:
                                Emit (OpCodes.Ldelem_U4);
                                return;
-                       case BuildinTypeSpec.Type.ULong:
-                       case BuildinTypeSpec.Type.Long:
+                       case BuiltinTypeSpec.Type.ULong:
+                       case BuiltinTypeSpec.Type.Long:
                                Emit (OpCodes.Ldelem_I8);
                                return;
-                       case BuildinTypeSpec.Type.Float:
+                       case BuiltinTypeSpec.Type.Float:
                                Emit (OpCodes.Ldelem_R4);
                                return;
-                       case BuildinTypeSpec.Type.Double:
+                       case BuiltinTypeSpec.Type.Double:
                                Emit (OpCodes.Ldelem_R8);
                                return;
-                       case BuildinTypeSpec.Type.IntPtr:
+                       case BuiltinTypeSpec.Type.IntPtr:
                                Emit (OpCodes.Ldelem_I);
                                return;
                        }
 
-                       if (TypeManager.IsStruct (type)) {
+                       switch (type.Kind) {
+                       case MemberKind.Struct:
                                Emit (OpCodes.Ldelema, type);
                                Emit (OpCodes.Ldobj, type);
-                       } else if (type.IsGenericParameter) {
+                               break;
+                       case MemberKind.TypeParameter:
                                Emit (OpCodes.Ldelem, type);
-                       } else if (type.IsPointer)
+                               break;
+                       case MemberKind.PointerType:
                                Emit (OpCodes.Ldelem_I);
-                       else
+                               break;
+                       default:
                                Emit (OpCodes.Ldelem_Ref);
+                               break;
+                       }
                }
 
                //
@@ -429,41 +445,47 @@ namespace Mono.CSharp
                        if (type.Kind == MemberKind.Enum)
                                type = EnumSpec.GetUnderlyingType (type);
 
-                       switch (type.BuildinType) {
-                       case BuildinTypeSpec.Type.Byte:
-                       case BuildinTypeSpec.Type.SByte:
-                       case BuildinTypeSpec.Type.Bool:
+                       switch (type.BuiltinType) {
+                       case BuiltinTypeSpec.Type.Byte:
+                       case BuiltinTypeSpec.Type.SByte:
+                       case BuiltinTypeSpec.Type.Bool:
                                Emit (OpCodes.Stelem_I1);
                                return;
-                       case BuildinTypeSpec.Type.Short:
-                       case BuildinTypeSpec.Type.UShort:
-                       case BuildinTypeSpec.Type.Char:
+                       case BuiltinTypeSpec.Type.Short:
+                       case BuiltinTypeSpec.Type.UShort:
+                       case BuiltinTypeSpec.Type.Char:
                                Emit (OpCodes.Stelem_I2);
                                return;
-                       case BuildinTypeSpec.Type.Int:
-                       case BuildinTypeSpec.Type.UInt:
+                       case BuiltinTypeSpec.Type.Int:
+                       case BuiltinTypeSpec.Type.UInt:
                                Emit (OpCodes.Stelem_I4);
                                return;
-                       case BuildinTypeSpec.Type.Long:
-                       case BuildinTypeSpec.Type.ULong:
+                       case BuiltinTypeSpec.Type.Long:
+                       case BuiltinTypeSpec.Type.ULong:
                                Emit (OpCodes.Stelem_I8);
                                return;
-                       case BuildinTypeSpec.Type.Float:
+                       case BuiltinTypeSpec.Type.Float:
                                Emit (OpCodes.Stelem_R4);
                                return;
-                       case BuildinTypeSpec.Type.Double:
+                       case BuiltinTypeSpec.Type.Double:
                                Emit (OpCodes.Stelem_R8);
                                return;
                        }
 
-                       if (TypeManager.IsStruct (type))
+                       switch (type.Kind) {
+                       case MemberKind.Struct:
                                Emit (OpCodes.Stobj, type);
-                       else if (type.IsGenericParameter)
+                               break;
+                       case MemberKind.TypeParameter:
                                Emit (OpCodes.Stelem, type);
-                       else if (type.IsPointer)
+                               break;
+                       case MemberKind.PointerType:
                                Emit (OpCodes.Stelem_I);
-                       else
+                               break;
+                       default:
                                Emit (OpCodes.Stelem_Ref);
+                               break;
+                       }
                }
 
                public void EmitInt (int i)
@@ -543,48 +565,54 @@ namespace Mono.CSharp
                        if (type.Kind == MemberKind.Enum)
                                type = EnumSpec.GetUnderlyingType (type);
 
-                       switch (type.BuildinType) {
-                       case BuildinTypeSpec.Type.Int:
+                       switch (type.BuiltinType) {
+                       case BuiltinTypeSpec.Type.Int:
                                ig.Emit (OpCodes.Ldind_I4);
                                return;
-                       case BuildinTypeSpec.Type.UInt:
+                       case BuiltinTypeSpec.Type.UInt:
                                ig.Emit (OpCodes.Ldind_U4);
                                return;
-                       case BuildinTypeSpec.Type.Short:
+                       case BuiltinTypeSpec.Type.Short:
                                ig.Emit (OpCodes.Ldind_I2);
                                return;
-                       case BuildinTypeSpec.Type.UShort:
-                       case BuildinTypeSpec.Type.Char:
+                       case BuiltinTypeSpec.Type.UShort:
+                       case BuiltinTypeSpec.Type.Char:
                                ig.Emit (OpCodes.Ldind_U2);
                                return;
-                       case BuildinTypeSpec.Type.Byte:
+                       case BuiltinTypeSpec.Type.Byte:
                                ig.Emit (OpCodes.Ldind_U1);
                                return;
-                       case BuildinTypeSpec.Type.SByte:
-                       case BuildinTypeSpec.Type.Bool:
+                       case BuiltinTypeSpec.Type.SByte:
+                       case BuiltinTypeSpec.Type.Bool:
                                ig.Emit (OpCodes.Ldind_I1);
                                return;
-                       case BuildinTypeSpec.Type.ULong:
-                       case BuildinTypeSpec.Type.Long:
+                       case BuiltinTypeSpec.Type.ULong:
+                       case BuiltinTypeSpec.Type.Long:
                                ig.Emit (OpCodes.Ldind_I8);
                                return;
-                       case BuildinTypeSpec.Type.Float:
+                       case BuiltinTypeSpec.Type.Float:
                                ig.Emit (OpCodes.Ldind_R4);
                                return;
-                       case BuildinTypeSpec.Type.Double:
+                       case BuiltinTypeSpec.Type.Double:
                                ig.Emit (OpCodes.Ldind_R8);
                                return;
-                       case BuildinTypeSpec.Type.IntPtr:
+                       case BuiltinTypeSpec.Type.IntPtr:
                                ig.Emit (OpCodes.Ldind_I);
                                return;
                        }
 
-                       if (TypeManager.IsStruct (type) || TypeManager.IsGenericParameter (type))
+                       switch (type.Kind) {
+                       case MemberKind.Struct:
+                       case MemberKind.TypeParameter:
                                Emit (OpCodes.Ldobj, type);
-                       else if (type.IsPointer)
+                               break;
+                       case MemberKind.PointerType:
                                ig.Emit (OpCodes.Ldind_I);
-                       else
+                               break;
+                       default:
                                ig.Emit (OpCodes.Ldind_Ref);
+                               break;
+                       }
                }
 
                //
@@ -595,37 +623,37 @@ namespace Mono.CSharp
                        if (type.IsEnum)
                                type = EnumSpec.GetUnderlyingType (type);
 
-                       switch (type.BuildinType) {
-                       case BuildinTypeSpec.Type.Int:
-                       case BuildinTypeSpec.Type.UInt:
+                       switch (type.BuiltinType) {
+                       case BuiltinTypeSpec.Type.Int:
+                       case BuiltinTypeSpec.Type.UInt:
                                ig.Emit (OpCodes.Stind_I4);
                                return;
-                       case BuildinTypeSpec.Type.Long:
-                       case BuildinTypeSpec.Type.ULong:
+                       case BuiltinTypeSpec.Type.Long:
+                       case BuiltinTypeSpec.Type.ULong:
                                ig.Emit (OpCodes.Stind_I8);
                                return;
-                       case BuildinTypeSpec.Type.Char:
-                       case BuildinTypeSpec.Type.Short:
-                       case BuildinTypeSpec.Type.UShort:
+                       case BuiltinTypeSpec.Type.Char:
+                       case BuiltinTypeSpec.Type.Short:
+                       case BuiltinTypeSpec.Type.UShort:
                                ig.Emit (OpCodes.Stind_I2);
                                return;
-                       case BuildinTypeSpec.Type.Float:
+                       case BuiltinTypeSpec.Type.Float:
                                ig.Emit (OpCodes.Stind_R4);
                                return;
-                       case BuildinTypeSpec.Type.Double:
+                       case BuiltinTypeSpec.Type.Double:
                                ig.Emit (OpCodes.Stind_R8);
                                return;
-                       case BuildinTypeSpec.Type.Byte:
-                       case BuildinTypeSpec.Type.SByte:
-                       case BuildinTypeSpec.Type.Bool:
+                       case BuiltinTypeSpec.Type.Byte:
+                       case BuiltinTypeSpec.Type.SByte:
+                       case BuiltinTypeSpec.Type.Bool:
                                ig.Emit (OpCodes.Stind_I1);
                                return;
-                       case BuildinTypeSpec.Type.IntPtr:
+                       case BuiltinTypeSpec.Type.IntPtr:
                                ig.Emit (OpCodes.Stind_I);
                                return;
                        }
 
-                       if (TypeManager.IsStruct (type) || TypeManager.IsGenericParameter (type))
+                       if (type.IsStruct || TypeManager.IsGenericParameter (type))
                                Emit (OpCodes.Stobj, type);
                        else
                                ig.Emit (OpCodes.Stind_Ref);