Use sigElementType to implement IsGenericParameter.

This commit is contained in:
jfrijters 2015-04-21 10:15:39 +00:00
Родитель 6b6c100bc5
Коммит 7a2901ead2
8 изменённых файлов: 42 добавлений и 30 удалений

Просмотреть файл

@ -377,7 +377,7 @@ namespace IKVM.Reflection.Emit
gtpb = new GenericTypeParameterBuilder[names.Length];
for (int i = 0; i < names.Length; i++)
{
gtpb[i] = new GenericTypeParameterBuilder(names[i], null, this, i);
gtpb[i] = new GenericTypeParameterBuilder(names[i], this, i);
}
return (GenericTypeParameterBuilder[])gtpb.Clone();
}

Просмотреть файл

@ -42,7 +42,18 @@ namespace IKVM.Reflection.Emit
private Type baseType;
private GenericParameterAttributes attr;
internal GenericTypeParameterBuilder(string name, TypeBuilder type, MethodBuilder method, int position)
internal GenericTypeParameterBuilder(string name, TypeBuilder type, int position)
: this(name, type, null, position, Signature.ELEMENT_TYPE_VAR)
{
}
internal GenericTypeParameterBuilder(string name, MethodBuilder method, int position)
: this(name, null, method, position, Signature.ELEMENT_TYPE_MVAR)
{
}
private GenericTypeParameterBuilder(string name, TypeBuilder type, MethodBuilder method, int position, byte sigElementType)
: base(sigElementType)
{
this.name = name;
this.type = type;
@ -111,11 +122,6 @@ namespace IKVM.Reflection.Emit
get { return ModuleBuilder; }
}
public override bool IsGenericParameter
{
get { return true; }
}
public override int GenericParameterPosition
{
get { return position; }
@ -658,7 +664,7 @@ namespace IKVM.Reflection.Emit
gtpb = new GenericTypeParameterBuilder[names.Length];
for (int i = 0; i < names.Length; i++)
{
gtpb[i] = new GenericTypeParameterBuilder(names[i], this, null, i);
gtpb[i] = new GenericTypeParameterBuilder(names[i], this, i);
}
return (GenericTypeParameterBuilder[])gtpb.Clone();
}

Просмотреть файл

@ -643,7 +643,18 @@ namespace IKVM.Reflection
private readonly MemberInfo owner;
private readonly int index;
internal MissingTypeParameter(MemberInfo owner, int index)
internal MissingTypeParameter(Type owner, int index)
: this(owner, index, Signature.ELEMENT_TYPE_VAR)
{
}
internal MissingTypeParameter(MethodInfo owner, int index)
: this(owner, index, Signature.ELEMENT_TYPE_MVAR)
{
}
private MissingTypeParameter(MemberInfo owner, int index, byte sigElementType)
: base(sigElementType)
{
this.owner = owner;
this.index = index;

Просмотреть файл

@ -30,6 +30,11 @@ namespace IKVM.Reflection.Reader
{
abstract class TypeParameterType : TypeInfo
{
protected TypeParameterType(byte sigElementType)
: base(sigElementType)
{
}
public sealed override string AssemblyQualifiedName
{
get { return null; }
@ -83,11 +88,6 @@ namespace IKVM.Reflection.Reader
return this.Name;
}
public sealed override bool IsGenericParameter
{
get { return true; }
}
protected sealed override bool ContainsMissingTypeImpl
{
get { return ContainsMissingType(GetGenericParameterConstraints()); }
@ -183,6 +183,7 @@ namespace IKVM.Reflection.Reader
}
private UnboundGenericMethodParameter(int position)
: base(Signature.ELEMENT_TYPE_MVAR)
{
this.position = position;
}
@ -259,7 +260,8 @@ namespace IKVM.Reflection.Reader
private readonly ModuleReader module;
private readonly int index;
internal GenericTypeParameter(ModuleReader module, int index)
internal GenericTypeParameter(ModuleReader module, int index, byte sigElementType)
: base(sigElementType)
{
this.module = module;
this.index = index;

Просмотреть файл

@ -194,7 +194,7 @@ namespace IKVM.Reflection.Reader
int len = module.GenericParam.records.Length;
for (int i = first; i < len && module.GenericParam.records[i].Owner == token; i++)
{
list.Add(new GenericTypeParameter(module, i));
list.Add(new GenericTypeParameter(module, i, Signature.ELEMENT_TYPE_MVAR));
}
typeArgs = list.ToArray();
}

Просмотреть файл

@ -260,7 +260,7 @@ namespace IKVM.Reflection.Reader
int len = module.GenericParam.records.Length;
for (int i = first; i < len && module.GenericParam.records[i].Owner == token; i++)
{
list.Add(new GenericTypeParameter(module, i));
list.Add(new GenericTypeParameter(module, i, Signature.ELEMENT_TYPE_VAR));
}
typeArgs = list.ToArray();
}

Просмотреть файл

@ -371,14 +371,7 @@ namespace IKVM.Reflection
}
else if (type.IsGenericParameter)
{
if (type is UnboundGenericMethodParameter || type.DeclaringMethod != null)
{
bb.Write(ELEMENT_TYPE_MVAR);
}
else
{
bb.Write(ELEMENT_TYPE_VAR);
}
bb.Write(type.SigElementType);
bb.WriteCompressedUInt(type.GenericParameterPosition);
}
else if (!type.__IsMissing && type.IsGenericType)

Просмотреть файл

@ -46,7 +46,7 @@ namespace IKVM.Reflection
public static readonly Type[] EmptyTypes = Empty<Type>.Array;
protected readonly Type underlyingType;
protected TypeFlags typeFlags;
private byte sigElementType; // only used if (__IsBuiltIn || HasElementType || __IsFunctionPointer)
private byte sigElementType; // only used if (__IsBuiltIn || HasElementType || __IsFunctionPointer || IsGenericParameter)
[Flags]
protected enum TypeFlags : ushort
@ -233,9 +233,9 @@ namespace IKVM.Reflection
}
}
public virtual bool IsGenericParameter
public bool IsGenericParameter
{
get { return false; }
get { return sigElementType == Signature.ELEMENT_TYPE_VAR || sigElementType == Signature.ELEMENT_TYPE_MVAR; }
}
public virtual int GenericParameterPosition
@ -1258,8 +1258,8 @@ namespace IKVM.Reflection
{
get
{
// this property can only be called after __IsBuiltIn, HasElementType or __IsFunctionPointer returned true
System.Diagnostics.Debug.Assert((typeFlags & TypeFlags.BuiltIn) != 0 || HasElementType || __IsFunctionPointer);
// this property can only be called after __IsBuiltIn, HasElementType, __IsFunctionPointer or IsGenericParameter returned true
System.Diagnostics.Debug.Assert((typeFlags & TypeFlags.BuiltIn) != 0 || HasElementType || __IsFunctionPointer || IsGenericParameter);
return sigElementType;
}
}