зеркало из https://github.com/mono/ikvm-fork.git
More generics fixes.
This commit is contained in:
Родитель
2b305fcb7e
Коммит
a6da072555
|
@ -203,6 +203,16 @@ namespace IKVM.Reflection.Emit
|
|||
get { return pseudoToken; }
|
||||
}
|
||||
|
||||
public override Type[] GetOptionalCustomModifiers()
|
||||
{
|
||||
return MethodBuilder.Copy(optionalCustomModifiers);
|
||||
}
|
||||
|
||||
public override Type[] GetRequiredCustomModifiers()
|
||||
{
|
||||
return MethodBuilder.Copy(requiredCustomModifiers);
|
||||
}
|
||||
|
||||
internal void WriteFieldRecords(MetadataWriter mw)
|
||||
{
|
||||
mw.Write((short)attribs);
|
||||
|
@ -225,4 +235,92 @@ namespace IKVM.Reflection.Emit
|
|||
return other.ImportField(typeBuilder, name, fieldType, optionalCustomModifiers, requiredCustomModifiers);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class FieldInstance : FieldInfo
|
||||
{
|
||||
private readonly Type type;
|
||||
private readonly FieldInfo field;
|
||||
|
||||
internal FieldInstance(Type type, FieldInfo field)
|
||||
{
|
||||
this.type = type;
|
||||
this.field = field;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
FieldInstance other = obj as FieldInstance;
|
||||
return other != null && other.type == type && other.field == field;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return type.GetHashCode() * 23 + field.GetHashCode();
|
||||
}
|
||||
|
||||
public override FieldAttributes Attributes
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
public override RuntimeFieldHandle FieldHandle
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
public override Type FieldType
|
||||
{
|
||||
get { return field.FieldType; }
|
||||
}
|
||||
|
||||
public override object GetValue(object obj)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, System.Globalization.CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Type DeclaringType
|
||||
{
|
||||
get { return type; }
|
||||
}
|
||||
|
||||
public override object[] GetCustomAttributes(Type attributeType, bool inherit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override object[] GetCustomAttributes(bool inherit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override bool IsDefined(Type attributeType, bool inherit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override string Name
|
||||
{
|
||||
get { return field.Name; }
|
||||
}
|
||||
|
||||
public override Type ReflectedType
|
||||
{
|
||||
get { return type; }
|
||||
}
|
||||
|
||||
public override Type[] GetOptionalCustomModifiers()
|
||||
{
|
||||
return field.GetOptionalCustomModifiers();
|
||||
}
|
||||
|
||||
public override Type[] GetRequiredCustomModifiers()
|
||||
{
|
||||
return field.GetRequiredCustomModifiers();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -618,7 +618,14 @@ namespace IKVM.Reflection.Emit
|
|||
public void Emit(OpCode opc, Type type)
|
||||
{
|
||||
Emit(opc);
|
||||
code.Write(moduleBuilder.GetTypeToken(type).Token);
|
||||
if (opc.Value == OpCodes.Ldtoken.Value)
|
||||
{
|
||||
code.Write(moduleBuilder.GetTypeToken(type).Token);
|
||||
}
|
||||
else
|
||||
{
|
||||
code.Write(moduleBuilder.GetTypeTokenForMemberRef(type).Token);
|
||||
}
|
||||
}
|
||||
|
||||
public void EmitCall(OpCode opc, MethodInfo methodInfo, Type[] optionalParameterTypes)
|
||||
|
|
|
@ -395,7 +395,7 @@ namespace IKVM.Reflection.Emit
|
|||
}
|
||||
}
|
||||
|
||||
private TypeToken GetTypeTokenForMemberRef(Type type)
|
||||
internal TypeToken GetTypeTokenForMemberRef(Type type)
|
||||
{
|
||||
if (type.IsGenericTypeDefinition)
|
||||
{
|
||||
|
|
|
@ -594,6 +594,11 @@ namespace IKVM.Reflection.Emit
|
|||
get { return token; }
|
||||
}
|
||||
|
||||
public static FieldInfo GetField(Type type, FieldInfo field)
|
||||
{
|
||||
return new FieldInstance(type, field);
|
||||
}
|
||||
|
||||
internal void WriteTypeDefRecord(MetadataWriter mw, ref int fieldList, ref int methodList)
|
||||
{
|
||||
mw.Write((int)attribs);
|
||||
|
@ -1001,6 +1006,11 @@ namespace IKVM.Reflection.Emit
|
|||
get { return false; }
|
||||
}
|
||||
|
||||
public override Type GetGenericTypeDefinition()
|
||||
{
|
||||
return typeBuilder;
|
||||
}
|
||||
|
||||
internal override int GetTypeToken()
|
||||
{
|
||||
if (token == 0)
|
||||
|
|
Загрузка…
Ссылка в новой задаче