From: <ac...@us...> - 2010-03-29 22:36:33
|
Revision: 20 http://clibinutils.svn.sourceforge.net/clibinutils/?rev=20&view=rev Author: aco Date: 2010-03-29 22:36:27 +0000 (Mon, 29 Mar 2010) Log Message: ----------- refactor ReferenceGetters Modified Paths: -------------- mono-based-binutils/branches/aco-dev/tools/Makefile.am mono-based-binutils/branches/aco-dev/tools/Makefile.in mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/CFileBuilder.cs mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/IReferenceGetters.cs mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGetters.cs mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersCached.cs Added Paths: ----------- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersTracer.cs Modified: mono-based-binutils/branches/aco-dev/tools/Makefile.am =================================================================== --- mono-based-binutils/branches/aco-dev/tools/Makefile.am 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/Makefile.am 2010-03-29 22:36:27 UTC (rev 20) @@ -57,6 +57,7 @@ gcc4cli/utils/IReferenceGetters.cs \ gcc4cli/utils/ReferenceGetters.cs \ gcc4cli/utils/ReferenceGettersCached.cs \ + gcc4cli/utils/ReferenceGettersTracer.cs \ gcc4cli/utils/ReferencesFixer.cs \ gcc4cli/utils/Set.cs \ gcc4cli/utils/Tracer.cs Modified: mono-based-binutils/branches/aco-dev/tools/Makefile.in =================================================================== --- mono-based-binutils/branches/aco-dev/tools/Makefile.in 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/Makefile.in 2010-03-29 22:36:27 UTC (rev 20) @@ -193,6 +193,7 @@ gcc4cli/utils/IReferenceGetters.cs \ gcc4cli/utils/ReferenceGetters.cs \ gcc4cli/utils/ReferenceGettersCached.cs \ + gcc4cli/utils/ReferenceGettersTracer.cs \ gcc4cli/utils/ReferencesFixer.cs \ gcc4cli/utils/Set.cs \ gcc4cli/utils/Tracer.cs Modified: mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/CFileBuilder.cs =================================================================== --- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/CFileBuilder.cs 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/CFileBuilder.cs 2010-03-29 22:36:27 UTC (rev 20) @@ -262,7 +262,12 @@ protected void fixReferences () { if (filesAdded) { - ReferenceGettersCached reffixer = new ReferenceGettersCached (this); + IReferenceGetters reffixer = new ReferenceGetters (this); + if (Tracer.TraceAtLevel(2)) + reffixer = new ReferenceGettersTracer (reffixer, 2, " ReferenceGetters: "); + reffixer = new ReferenceGettersCached (reffixer); + if (Tracer.TraceAtLevel(6)) + reffixer = new ReferenceGettersTracer (reffixer, 6, "ReferenceGettersCached: "); if (keepIncompleteTypes) { foreach (TypeDefinition inc_type in incomplete_types.Values) { @@ -270,10 +275,7 @@ Module.Types.Add (mtype); } } else { - TypeReference newtype = new PointerType (Module.Import (typeof (void))); - foreach (TypeDefinition inc_type in incomplete_types.Values) { - reffixer.Add (inc_type.ToString (), newtype); - } + reffixer.MapTypeReferences(incomplete_types.Values, new PointerType (Module.Import (typeof (void)))); } ReferencesFixer rf = new ReferencesFixer (reffixer); Modified: mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/IReferenceGetters.cs =================================================================== --- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/IReferenceGetters.cs 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/IReferenceGetters.cs 2010-03-29 22:36:27 UTC (rev 20) @@ -1,10 +1,13 @@ +using System.Collections; using Mono.Cecil; namespace gcc4cli.util { public interface IReferenceGetters { + void MapTypeReferences (ICollection types, TypeReference new_type); + ModuleReference GetModuleReference (ModuleReference module); TypeReference GetTypeReference (TypeReference type); Modified: mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGetters.cs =================================================================== --- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGetters.cs 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGetters.cs 2010-03-29 22:36:27 UTC (rev 20) @@ -42,6 +42,15 @@ { } + Hashtable mapped_types = new Hashtable (); //Dictionary<string,TypeReference> + + public void MapTypeReferences (ICollection types, TypeReference new_type) + { + foreach (TypeReference inc_type in types) { + mapped_types[inc_type.ToString ()] = new_type; + } + } + public virtual ModuleReference GetModuleReference (ModuleReference module) { string name = module.Name.ToLower (); @@ -96,23 +105,19 @@ type = (type as SentinelType).ElementType; } - TypeReference result = null; + if (mapped_types[type.ToString ()] != null) + return (TypeReference)mapped_types[type.ToString ()]; - Tracer.Trace (2,"Searching: " + type.FullName); - if (m_cfile != null && (type.Name == "<Module>" || type.Name == ExternalAssemblyName)) { - result = m_cfile.MainType; + return m_cfile.MainType; } else { + TypeReference result = null; result = module_GetTypeReference (type); + if (result == null) + throw new NotFoundException (type); + return result; } - - if (result == null) - throw new NotFoundException (type); - - Tracer.Trace(2,"Returning: " + result.ToString ()); - - return result; } MemberReference GetMemberReference (MemberReference member) @@ -219,8 +224,6 @@ MethodReference result = null; - Tracer.Trace(2,"Searching: " + method.ToString ()); - if (m_cfile != null && GetTypeReference (method.DeclaringType) == m_cfile.MainType) { string name = method.Name; @@ -276,7 +279,6 @@ throw new NotFoundException (method); } - Tracer.Trace(2,"Returning: " + result.ToString()); return result; } @@ -299,8 +301,6 @@ { FieldReference result = null; - Tracer.Trace(2,"Searching: " + field.ToString ()); - if (m_cfile != null && (field.DeclaringType.Name == "<MODULE>" || field.DeclaringType == m_cfile.MainType @@ -327,7 +327,6 @@ throw new NotFoundException (field); } - Tracer.Trace(2,"Returning: " + result.ToString ()); return result; } Modified: mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersCached.cs =================================================================== --- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersCached.cs 2010-03-29 22:24:32 UTC (rev 19) +++ mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersCached.cs 2010-03-29 22:36:27 UTC (rev 20) @@ -8,68 +8,42 @@ namespace gcc4cli.util { - public class ReferenceGettersCached : ReferenceGetters + public class ReferenceGettersCached : IReferenceGetters { + IReferenceGetters wrapped; + Hashtable types_cache = new Hashtable (); //Dictionary<string,TypeReference> Hashtable members_cache = new Hashtable (); //Dictionary<string,IMemberReference> - - public ReferenceGettersCached (CFile cfile, bool allowExternalAssembly) - : base (cfile, allowExternalAssembly) + public ReferenceGettersCached (IReferenceGetters _wrapped) { + wrapped = _wrapped; } - public ReferenceGettersCached (CFileBuilder cfile) - : base (cfile) + public void MapTypeReferences (ICollection types, TypeReference new_type) { + wrapped.MapTypeReferences (types, new_type); } - public ReferenceGettersCached (ModuleDefinition module) - : base (module) + public ModuleReference GetModuleReference (ModuleReference module) { + return wrapped.GetModuleReference (module); } public void Add (string name, TypeReference type) { - Tracer.Trace (6,"Add type to Cache: " + name + " as " + type.ToString ()); types_cache[name] = type; } - public void Add (TypeReference type) - { - Add (type.ToString (), type); - } - public void Add (string name, IMemberReference member) { - Tracer.Trace (6,"Add member to Cache: " + name + " as " + member.ToString ()); members_cache[name] = member; } - public void Add (IMemberReference member) + public TypeReference GetTypeReference (TypeReference type) { - Add (member.ToString (),member); - } - - public TypeReference CacheGetType (string name) - { - - if (types_cache.Contains (name)) - return (TypeReference) types_cache[name]; - return null; - } - - public IMemberReference CacheGetSymbol (string name) - { - if (members_cache.Contains (name)) - return (IMemberReference) members_cache[name]; - return null; - } - - public override TypeReference GetTypeReference (TypeReference type) - { if (type == null) return null; @@ -82,19 +56,18 @@ if (types_cache.Contains (fullname)) { result = (TypeReference)types_cache[fullname]; - Tracer.Trace (4,"Found in Cache: " + fullname + " as " + result.FullName); return result; } - result = base.GetTypeReference (type); + result = wrapped.GetTypeReference (type); Add (fullname, result); - Add (result); + Add (result.ToString (), result); return result; } - public override MethodReference GetMethodReference (MethodReference method) + public MethodReference GetMethodReference (MethodReference method) { if (method == null) return null; @@ -104,37 +77,40 @@ if (members_cache.Contains (fullname)) { result = (MethodReference)members_cache[fullname]; - Tracer.Trace (4,"Found in Cache: " + fullname + " as " + result.ToString ()); return result; } - result = base.GetMethodReference (method); + result = wrapped.GetMethodReference (method); Add (fullname, result); - Add (result); + Add (result.ToString (), result); return result; } - public override FieldReference GetFieldReference (FieldReference field) + public FieldReference GetFieldReference (FieldReference field) { FieldReference result = null; string fullname = field.ToString (); if (members_cache.Contains (fullname)) { result = (FieldReference)members_cache[fullname]; - Tracer.Trace (4,"Found in Cache: " + fullname + " as " + result.ToString ()); return result; } - result = base.GetFieldReference (field); + result = wrapped.GetFieldReference (field); Add (fullname, result); - Add (result); + Add (result.ToString (), result); return result; } + public CallSite GetCallSite (CallSite sig) + { + return wrapped.GetCallSite (sig); + } + } } Added: mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersTracer.cs =================================================================== --- mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersTracer.cs (rev 0) +++ mono-based-binutils/branches/aco-dev/tools/gcc4cli/utils/ReferenceGettersTracer.cs 2010-03-29 22:36:27 UTC (rev 20) @@ -0,0 +1,81 @@ + +using System; +using System.IO; +using System.Collections; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace gcc4cli.util { + + public class ReferenceGettersTracer : IReferenceGetters + { + IReferenceGetters wrapped; + int level = 0; + string header = ""; + + public ReferenceGettersTracer (IReferenceGetters _wrapped, int _level, string _header) + { + wrapped = _wrapped; + level = _level; + header = _header; + } + + public ReferenceGettersTracer (IReferenceGetters _wrapped) + : this (_wrapped, 2, "") + { + } + + public void MapTypeReferences (ICollection types, TypeReference new_type) + { + wrapped.MapTypeReferences (types, new_type); + } + + public ModuleReference GetModuleReference (ModuleReference module) + { + ModuleReference result = null; + Tracer.Trace (level, header + "Searching: " + module.ToString ()); + result = wrapped.GetModuleReference (module); + Tracer.Trace (level, header + "Returning: " + result.ToString ()); + return result; + } + + public TypeReference GetTypeReference (TypeReference type) + { + TypeReference result = null; + Tracer.Trace (level, header + "Searching: " + type.FullName); + result = wrapped.GetTypeReference (type); + Tracer.Trace (level, header + "Returning: " + result.ToString ()); + return result; + } + + public MethodReference GetMethodReference (MethodReference method) + { + MethodReference result = null; + Tracer.Trace(level, header + "Searching: " + method.ToString ()); + result = wrapped.GetMethodReference (method); + Tracer.Trace(level, header + "Returning: " + result.ToString()); + return result; + } + + public FieldReference GetFieldReference (FieldReference field) + { + FieldReference result = null; + Tracer.Trace(level, header + "Searching: " + field.ToString ()); + result = wrapped.GetFieldReference (field); + Tracer.Trace(level, header + "Returning: " + result.ToString()); + return result; + } + + public CallSite GetCallSite (CallSite sig) + { + CallSite result = null; + Tracer.Trace(level, header + "Searching: " + sig.ToString ()); + result = wrapped.GetCallSite (sig); + Tracer.Trace(level, header + "Returning: " + result.ToString()); + return result; + } + + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |