Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/mcs/gmcs
diff options
context:
space:
mode:
authorMartin Baulig <martin@novell.com>2006-02-16 04:07:31 +0300
committerMartin Baulig <martin@novell.com>2006-02-16 04:07:31 +0300
commit77889014739695fe9c1f4c7bfa63be02bf7c2d01 (patch)
tree80197d4a37a6c9bf96f73be42c26958a2b0a6345 /mcs/gmcs
parent4ff6ffbe36cbe96de5e6f60e9963c61478c08302 (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/ChangeLog6
-rw-r--r--mcs/gmcs/ecore.cs19
-rw-r--r--mcs/gmcs/generic.cs17
-rw-r--r--mcs/gmcs/typemanager.cs4
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];
}