Merge some useful changes from MD
[mono.git] / mcs / mcs / codegen.cs
index 736380a024dc1f7fbaf3f6c37a67453c395720ca..530eb91e3b93b2d126f36a3638d1590c8662483c 100644 (file)
 
 using System;
 using System.Collections.Generic;
+
+#if STATIC
+using MetaType = IKVM.Reflection.Type;
+using IKVM.Reflection;
+using IKVM.Reflection.Emit;
+#else
+using MetaType = System.Type;
 using System.Reflection;
 using System.Reflection.Emit;
+#endif
 
 namespace Mono.CSharp
 {
@@ -23,13 +31,13 @@ namespace Mono.CSharp
        public class EmitContext : BuilderContext
        {
                // TODO: Has to be private
-               public ILGenerator ig;
+               public readonly ILGenerator ig;
 
                /// <summary>
                ///   The value that is allowed to be returned or NULL if there is no
                ///   return type.
                /// </summary>
-               TypeSpec return_type;
+               readonly TypeSpec return_type;
 
                /// <summary>
                ///   Keeps track of the Type to LocalBuilder temporary storage created
@@ -75,35 +83,38 @@ namespace Mono.CSharp
                /// </summary>
                public AnonymousExpression CurrentAnonymousMethod;
                
-               public readonly IMemberContext MemberContext;
+               readonly IMemberContext member_context;
 
                DynamicSiteClass dynamic_site_container;
 
-               // TODO: Replace IMemberContext with MemberCore
                public EmitContext (IMemberContext rc, ILGenerator ig, TypeSpec return_type)
                {
-                       this.MemberContext = rc;
+                       this.member_context = rc;
                        this.ig = ig;
 
                        this.return_type = return_type;
+
+#if STATIC
+                       ig.__CleverExceptionBlockAssistance ();
+#endif
                }
 
                #region Properties
 
                public TypeSpec CurrentType {
-                       get { return MemberContext.CurrentType; }
+                       get { return member_context.CurrentType; }
                }
 
                public TypeParameter[] CurrentTypeParameters {
-                       get { return MemberContext.CurrentTypeParameters; }
+                       get { return member_context.CurrentTypeParameters; }
                }
 
                public MemberCore CurrentTypeDefinition {
-                       get { return MemberContext.CurrentMemberDefinition; }
+                       get { return member_context.CurrentMemberDefinition; }
                }
 
                public bool IsStatic {
-                       get { return MemberContext.IsStatic; }
+                       get { return member_context.IsStatic; }
                }
 
                bool IsAnonymousStoreyMutateRequired {
@@ -114,9 +125,24 @@ namespace Mono.CSharp
                        }
                }
 
-               // Has to be used for emitter errors only
+               public IMemberContext MemberContext {
+                       get {
+                               return member_context;
+                       }
+               }
+
+               public ModuleContainer Module {
+                       get {
+                               return member_context.Module;
+                       }
+               }
+
+               // Has to be used for specific emitter errors only any
+               // possible resolver errors have to be reported during Resolve
                public Report Report {
-                       get { return MemberContext.Compiler.Report; }
+                       get {
+                               return member_context.Module.Compiler.Report;
+                       }
                }
 
                public TypeSpec ReturnType {
@@ -179,7 +205,7 @@ namespace Mono.CSharp
                public DynamicSiteClass CreateDynamicSite ()
                {
                        if (dynamic_site_container == null) {
-                               var mc = MemberContext.CurrentMemberDefinition as MemberBase;
+                               var mc = member_context.CurrentMemberDefinition as MemberBase;
                                dynamic_site_container = new DynamicSiteClass (CurrentTypeDefinition.Parent.PartialContainer, mc, CurrentTypeParameters);
 
                                CurrentTypeDefinition.Module.AddCompilerGeneratedClass (dynamic_site_container);
@@ -288,13 +314,7 @@ namespace Mono.CSharp
                        ig.Emit (opcode, method);
                }
 
-               // TODO: REMOVE breaks mutator
-               public void Emit (OpCode opcode, FieldBuilder field)
-               {
-                       ig.Emit (opcode, field);
-               }
-
-               public void Emit (OpCode opcode, MethodSpec method, Type[] vargs)
+               public void Emit (OpCode opcode, MethodSpec method, MetaType[] vargs)
                {
                        // TODO MemberCache: This should mutate too
                        ig.EmitCall (opcode, (MethodInfo) method.GetMetaInfo (), vargs);
@@ -557,7 +577,7 @@ namespace Mono.CSharp
                        else if (type == TypeManager.intptr_type)
                                ig.Emit (OpCodes.Stind_I);
                        else if (TypeManager.IsStruct (type) || TypeManager.IsGenericParameter (type))
-                               ig.Emit (OpCodes.Stobj, type.GetMetaInfo ());
+                               Emit (OpCodes.Stobj, type);
                        else
                                ig.Emit (OpCodes.Stind_Ref);
                }