#region Properties
+ public BuiltinTypes BuiltinTypes {
+ get {
+ return MemberContext.Module.Compiler.BuiltinTypes;
+ }
+ }
+
public TypeSpec CurrentType {
get { return member_context.CurrentType; }
}
get { return member_context.IsStatic; }
}
- bool IsAnonymousStoreyMutateRequired {
+ public bool IsAnonymousStoreyMutateRequired {
get {
return CurrentAnonymousMethod != null &&
CurrentAnonymousMethod.Storey != null &&
//
// 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;
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;
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;
+ }
}
//
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)
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;
+ }
}
//
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);