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
{
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
/// </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 {
}
}
- // 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 {
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);
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);
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);
}