From 662aead1e1feed60b31a760fe10637e1d571108e Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Tue, 4 Sep 2007 08:56:03 +0000 Subject: [PATCH] 2007-09-04 Jb Evain * Mono.Cecil/ReflectionWriter.cs: Adapt a patch by Ewout Prangsma . 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 | 7 +++++++ .../Mono.Cecil/Mono.Cecil/ReflectionWriter.cs | 18 +++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/mcs/class/Mono.Cecil/ChangeLog b/mcs/class/Mono.Cecil/ChangeLog index 23bcd2fcf31..03e2c9a3d63 100644 --- a/mcs/class/Mono.Cecil/ChangeLog +++ b/mcs/class/Mono.Cecil/ChangeLog @@ -1,3 +1,10 @@ +2007-09-04 Jb Evain + + * Mono.Cecil/ReflectionWriter.cs: + Adapt a patch by Ewout Prangsma . + Cache the typespec tokens instead of the typespec themselves + because GenericParameters are somethimes considered as typespecs. + 2007-08-28 Jb Evain * Mono.Cecil.Cil/CodeWriter.cs diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/ReflectionWriter.cs b/mcs/class/Mono.Cecil/Mono.Cecil/ReflectionWriter.cs index 6a1c97f2a0c..c26e3a54a29 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/ReflectionWriter.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/ReflectionWriter.cs @@ -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 // and interfaces -- 2.25.1