+2006-02-16 Martin Baulig <martin@ximian.com>
+
+ * generic.cs
+ (TypeManager.GetGenericFieldDefinition): New public method; use it
+ instead of the `FieldInfo.Mono_GetGenericFieldDefinition()' icall.
+
2006-02-14 Martin Baulig <martin@ximian.com>
* *.cs: Use `Type.IsGenericType' instead of `Type.IsGenericInstance'.
public override Expression ResolveMemberAccess (EmitContext ec, Expression left, Location loc,
SimpleName original)
{
- FieldInfo fi = FieldInfo.Mono_GetGenericFieldDefinition ();
+ FieldInfo fi = TypeManager.GetGenericFieldDefinition (FieldInfo);
Type t = fi.FieldType;
ILGenerator ig = ec.ig;
bool is_volatile = false;
- FieldInfo the_fi = FieldInfo.Mono_GetGenericFieldDefinition ();
- if (the_fi is FieldBuilder){
- FieldBase f = TypeManager.GetField (the_fi);
- if (f != null){
- if ((f.ModFlags & Modifiers.VOLATILE) != 0)
- is_volatile = true;
-
- f.SetMemberIsUsed ();
- }
- }
+ FieldBase f = TypeManager.GetField (FieldInfo);
+ if (f != null){
+ if ((f.ModFlags & Modifiers.VOLATILE) != 0)
+ is_volatile = true;
+
+ f.SetMemberIsUsed ();
+ }
if (FieldInfo.IsStatic){
if (is_volatile)
return m;
}
+ public static FieldInfo GetGenericFieldDefinition (FieldInfo fi)
+ {
+ if (fi.DeclaringType.IsGenericTypeDefinition ||
+ !fi.DeclaringType.IsGenericType)
+ return fi;
+
+ Type t = fi.DeclaringType.GetGenericTypeDefinition ();
+ BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic |
+ BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
+
+ foreach (FieldInfo f in t.GetFields (bf))
+ if (f.MetadataToken == fi.MetadataToken)
+ return f;
+
+ return fi;
+ }
+
//
// Whether `array' is an array of T and `enumerator' is `IEnumerable<T>'.
// For instance "string[]" -> "IEnumerable<string>".
//
static public FieldBase GetField (FieldInfo fb)
{
- if (fb.DeclaringType.IsGenericType)
- fb = fb.Mono_GetGenericFieldDefinition ();
-
+ fb = GetGenericFieldDefinition (fb);
return (FieldBase) fieldbuilders_to_fields [fb];
}