зеркало из https://github.com/mono/ikvm-fork.git
Use sigElementType to implement IsGenericParameter.
This commit is contained in:
Родитель
6b6c100bc5
Коммит
7a2901ead2
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче