diff options
author | Martin Baulig <martin@novell.com> | 2006-02-16 04:07:31 +0300 |
---|---|---|
committer | Martin Baulig <martin@novell.com> | 2006-02-16 04:07:31 +0300 |
commit | 77889014739695fe9c1f4c7bfa63be02bf7c2d01 (patch) | |
tree | 80197d4a37a6c9bf96f73be42c26958a2b0a6345 /mcs/gmcs | |
parent | 4ff6ffbe36cbe96de5e6f60e9963c61478c08302 (diff) |
**** Merged r56905-r54907 from HEAD ****
svn path=/branches/mono-1-1-13/mcs/; revision=56911
Diffstat (limited to 'mcs/gmcs')
-rw-r--r-- | mcs/gmcs/ChangeLog | 6 | ||||
-rw-r--r-- | mcs/gmcs/ecore.cs | 19 | ||||
-rw-r--r-- | mcs/gmcs/generic.cs | 17 | ||||
-rw-r--r-- | mcs/gmcs/typemanager.cs | 4 |
4 files changed, 32 insertions, 14 deletions
diff --git a/mcs/gmcs/ChangeLog b/mcs/gmcs/ChangeLog index b9a7e32d920..8e6bdce2a4e 100644 --- a/mcs/gmcs/ChangeLog +++ b/mcs/gmcs/ChangeLog @@ -1,3 +1,9 @@ +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'. diff --git a/mcs/gmcs/ecore.cs b/mcs/gmcs/ecore.cs index d6e007862bc..fa7452cbe25 100644 --- a/mcs/gmcs/ecore.cs +++ b/mcs/gmcs/ecore.cs @@ -2993,7 +2993,7 @@ namespace Mono.CSharp { 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; @@ -3243,16 +3243,13 @@ namespace Mono.CSharp { 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) diff --git a/mcs/gmcs/generic.cs b/mcs/gmcs/generic.cs index 9835ae1fbe9..36d47686dce 100644 --- a/mcs/gmcs/generic.cs +++ b/mcs/gmcs/generic.cs @@ -2065,6 +2065,23 @@ namespace Mono.CSharp { 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>". diff --git a/mcs/gmcs/typemanager.cs b/mcs/gmcs/typemanager.cs index 2fdbbea93f2..976433c9072 100644 --- a/mcs/gmcs/typemanager.cs +++ b/mcs/gmcs/typemanager.cs @@ -1862,9 +1862,7 @@ public partial class TypeManager { // static public FieldBase GetField (FieldInfo fb) { - if (fb.DeclaringType.IsGenericType) - fb = fb.Mono_GetGenericFieldDefinition (); - + fb = GetGenericFieldDefinition (fb); return (FieldBase) fieldbuilders_to_fields [fb]; } |