2007-09-04 Jb Evain <jbevain@novell.com>
authorJb Evain <jbevain@gmail.com>
Tue, 4 Sep 2007 08:56:03 +0000 (08:56 -0000)
committerJb Evain <jbevain@gmail.com>
Tue, 4 Sep 2007 08:56:03 +0000 (08:56 -0000)
* Mono.Cecil/ReflectionWriter.cs:
Adapt a patch by Ewout Prangsma <ewout@tallapplications.com>.
Cache the typespec tokens instead of the typespec themselves
because GenericParameters are somethimes considered as typespecs.

svn path=/trunk/mcs/; revision=85261

mcs/class/Mono.Cecil/ChangeLog
mcs/class/Mono.Cecil/Mono.Cecil/ReflectionWriter.cs

index 23bcd2fcf31c7d9edb2f204ff3b4178859b67f67..03e2c9a3d63319c2aa626b175ee4cf24acc35bfa 100644 (file)
@@ -1,3 +1,10 @@
+2007-09-04  Jb Evain  <jbevain@novell.com>
+
+       * Mono.Cecil/ReflectionWriter.cs:
+               Adapt a patch by Ewout Prangsma <ewout@tallapplications.com>.
+               Cache the typespec tokens instead of the typespec themselves
+               because GenericParameters are somethimes considered as typespecs.
+
 2007-08-28  Jb Evain  <jbevain@novell.com>
 
        * Mono.Cecil.Cil/CodeWriter.cs
index 6a1c97f2a0c1902846aa92b976ec15c258fd5a58..c26e3a54a29971a1bb237bc0707d181cc3bcf6a3 100644 (file)
@@ -56,7 +56,7 @@ namespace Mono.Cecil {
                ArrayList m_methodStack;
                ArrayList m_fieldStack;
                ArrayList m_genericParamStack;
-               IDictionary m_typeSpecCache;
+               IDictionary m_typeSpecTokenCache;
 
                uint m_methodIndex;
                uint m_fieldIndex;
@@ -133,7 +133,7 @@ namespace Mono.Cecil {
                        m_methodStack = new ArrayList ();
                        m_fieldStack = new ArrayList ();
                        m_genericParamStack = new ArrayList ();
-                       m_typeSpecCache = new Hashtable ();
+                       m_typeSpecTokenCache = new Hashtable ();
 
                        m_methodIndex = 1;
                        m_fieldIndex = 1;
@@ -178,15 +178,19 @@ namespace Mono.Cecil {
                {
                        if (IsTypeSpec (type)) {
                                uint sig = m_sigWriter.AddTypeSpec (GetTypeSpecSig (type));
-                               if (m_typeSpecCache.Contains (sig))
-                                       return ((TypeReference) m_typeSpecCache [sig]).MetadataToken;
+                               if (m_typeSpecTokenCache.Contains (sig))
+                                       return (MetadataToken) m_typeSpecTokenCache [sig];
 
                                TypeSpecTable tsTable = m_tableWriter.GetTypeSpecTable ();
                                TypeSpecRow tsRow = m_rowWriter.CreateTypeSpecRow (sig);
                                tsTable.Rows.Add (tsRow);
-                               type.MetadataToken = new MetadataToken (TokenType.TypeSpec, (uint) tsTable.Rows.Count);
-                               m_typeSpecCache [sig] = type;
-                               return type.MetadataToken;
+
+                               MetadataToken token = new MetadataToken (TokenType.TypeSpec, (uint) tsTable.Rows.Count);
+                               if (! (type is GenericParameter))
+                                       type.MetadataToken = token;
+
+                               m_typeSpecTokenCache [sig] = token;
+                               return token;
                        } else if (type != null)
                                return type.MetadataToken;
                        else // <Module> and interfaces