From 5e63108ce0e086d4a6fcfbd374842aad93efc054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Mon, 3 Feb 2020 13:09:32 +0000 Subject: [PATCH] Fix type references processing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove assembly attributes from ignore list (not required as they will be added as non used items). - Remove minimize command. Now all assemblies are minimized by default. - Add missing call to RemoveUnusedItems() in TypeReferencesTable. - Improve dumping of type references entry: wasn't getting the correct scope. Signed-off-by: José Simões --- source/MetadataProcessor.Console/Program.cs | 39 +++---------------- .../Tables/nanoTablesContext.cs | 30 +------------- .../Tables/nanoTypeReferenceTable.cs | 2 +- .../nanoAssemblyBuilder.cs | 1 + .../nanoDumperGenerator.cs | 6 +-- 5 files changed, 10 insertions(+), 68 deletions(-) diff --git a/source/MetadataProcessor.Console/Program.cs b/source/MetadataProcessor.Console/Program.cs index 97eacd02..654f73a1 100644 --- a/source/MetadataProcessor.Console/Program.cs +++ b/source/MetadataProcessor.Console/Program.cs @@ -69,36 +69,12 @@ public void Compile( _assemblyBuilder.Write(GetBinaryWriter(writer)); } - using (var writer = XmlWriter.Create(Path.ChangeExtension(fileName, "pdbx"))) - { - _assemblyBuilder.Write(writer); - } - - if(DumpMetadata) - { - nanoDumperGenerator dumper = new nanoDumperGenerator( - _assemblyBuilder.TablesContext, - Path.ChangeExtension(fileName, "dump.txt")); - dumper.DumpAll(); - } - } - catch (Exception) - { - System.Console.Error.WriteLine( - "Unable to compile output assembly file '{0}' - check parse command results.", fileName); - throw; - } - } - - public void Minimize( - string fileName) - { - try - { if (Verbose) System.Console.WriteLine("Minimizing assembly..."); _assemblyBuilder.Minimize(); + if (Verbose) System.Console.WriteLine("Recompiling assembly..."); + using (var stream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite)) using (var writer = new BinaryWriter(stream)) { @@ -110,7 +86,7 @@ public void Minimize( _assemblyBuilder.Write(writer); } - if (DumpMetadata) + if(DumpMetadata) { nanoDumperGenerator dumper = new nanoDumperGenerator( _assemblyBuilder.TablesContext, @@ -118,10 +94,10 @@ public void Minimize( dumper.DumpAll(); } } - catch (Exception ex) + catch (Exception) { System.Console.Error.WriteLine( - "Unable to minimize assembly file '{0}'.", fileName); + "Unable to compile output assembly file '{0}' - check parse command results.", fileName); throw; } } @@ -232,7 +208,6 @@ public static void Main(string[] args) System.Console.WriteLine("-excludeClassByName Removes the class from an assembly."); System.Console.WriteLine("-generateskeleton Generate skeleton files with stubs to add native code for an assembly."); System.Console.WriteLine("-generateDependency Generates an XML file with the relationship between assemblies."); - System.Console.WriteLine("-minimize Minimizes the assembly, removing unwanted elements."); System.Console.WriteLine("-verbose Outputs each command before executing it."); System.Console.WriteLine("-verboseMinimize Turns on verbose level for the minimization phase."); System.Console.WriteLine("-dump_all Generates a report of an assembly's metadata."); @@ -263,10 +238,6 @@ public static void Main(string[] args) { md.AddClassToExclude(args[++i]); } - else if (arg == "-minimize") - { - md.Minimize(md.PeFileName); - } else if (arg == "-verbose") { md.Verbose = true; diff --git a/source/MetadataProcessor.Core/Tables/nanoTablesContext.cs b/source/MetadataProcessor.Core/Tables/nanoTablesContext.cs index c02f8d6a..88a6295a 100644 --- a/source/MetadataProcessor.Core/Tables/nanoTablesContext.cs +++ b/source/MetadataProcessor.Core/Tables/nanoTablesContext.cs @@ -19,14 +19,6 @@ public sealed class nanoTablesContext // Assembly-level attributes "System.Runtime.InteropServices.ComVisibleAttribute", "System.Runtime.InteropServices.GuidAttribute", - "System.Reflection.AssemblyTitleAttribute", - "System.Reflection.AssemblyDescriptionAttribute", - "System.Reflection.AssemblyConfigurationAttribute", - "System.Reflection.AssemblyCompanyAttribute", - "System.Reflection.AssemblyProductAttribute", - "System.Reflection.AssemblyCopyrightAttribute", - "System.Reflection.AssemblyTrademarkAttribute", - "System.Reflection.AssemblyFileVersionAttribute", // Compiler-specific attributes //"System.ParamArrayAttribute", @@ -108,17 +100,7 @@ public nanoTablesContext( AssemblyReferenceTable = new nanoAssemblyReferenceTable( mainModule.AssemblyReferences, this); - var typeReferences = mainModule.GetTypeReferences().ToList(); - - // remove types in ignore list - foreach (var a in _ignoringAttributes) - { - var typeToExclude = typeReferences.FirstOrDefault(t => t.FullName == a); - if (typeToExclude != null) - { - typeReferences.Remove(typeToExclude); - } - } + var typeReferences = mainModule.GetTypeReferences(); TypeReferencesTable = new nanoTypeReferenceTable( typeReferences, this); @@ -140,16 +122,6 @@ public nanoTablesContext( var types = GetOrderedTypes(mainModule, explicitTypesOrder); - // remove types in ignore list - foreach (var a in _ignoringAttributes) - { - var typeToExclude = types.FirstOrDefault(t => t.FullName == a); - if(typeToExclude != null) - { - types.Remove(typeToExclude); - } - } - TypeDefinitionTable = new nanoTypeDefinitionTable(types, this); var fields = types diff --git a/source/MetadataProcessor.Core/Tables/nanoTypeReferenceTable.cs b/source/MetadataProcessor.Core/Tables/nanoTypeReferenceTable.cs index ad5b8c38..3e8ecfc3 100644 --- a/source/MetadataProcessor.Core/Tables/nanoTypeReferenceTable.cs +++ b/source/MetadataProcessor.Core/Tables/nanoTypeReferenceTable.cs @@ -92,7 +92,7 @@ protected override void AllocateSingleItemStrings( GetOrCreateStringId(item.Name); } - private ushort GetScope( + internal ushort GetScope( TypeReference typeReference) { if (typeReference.DeclaringType == null) diff --git a/source/MetadataProcessor.Core/nanoAssemblyBuilder.cs b/source/MetadataProcessor.Core/nanoAssemblyBuilder.cs index b2826a16..650bca3e 100644 --- a/source/MetadataProcessor.Core/nanoAssemblyBuilder.cs +++ b/source/MetadataProcessor.Core/nanoAssemblyBuilder.cs @@ -156,6 +156,7 @@ public void Minimize() // need to reset several tables so they are recreated only with the used items _tablesContext.ResetStringsTable(); _tablesContext.AssemblyReferenceTable.RemoveUnusedItems(set); + _tablesContext.TypeReferencesTable.RemoveUnusedItems(set); _tablesContext.FieldsTable.RemoveUnusedItems(set); _tablesContext.FieldReferencesTable.RemoveUnusedItems(set); _tablesContext.MethodDefinitionTable.RemoveUnusedItems(set); diff --git a/source/MetadataProcessor.Core/nanoDumperGenerator.cs b/source/MetadataProcessor.Core/nanoDumperGenerator.cs index 8af2c257..d83c0a18 100644 --- a/source/MetadataProcessor.Core/nanoDumperGenerator.cs +++ b/source/MetadataProcessor.Core/nanoDumperGenerator.cs @@ -235,18 +235,16 @@ private void DumpTypeReferences(DumpAllTable dumpTable) { ushort refId; - var metadataScopeType = _tablesContext.AssemblyReferenceTable.Items.FirstOrDefault(a => a == t.Scope); - var typeRef = new TypeRef() { Name = t.Name, - Scope = _tablesContext.AssemblyReferenceTable.GetReferenceId(metadataScopeType).ToString("x8") + Scope = _tablesContext.TypeReferencesTable.GetScope(t).ToString("x8") }; if (_tablesContext.TypeReferencesTable.TryGetTypeReferenceId(t, out refId)) { typeRef.ReferenceId = "0x" + refId.ToString("x8"); - typeRef.Name = t.Name; + typeRef.Name = t.FullName; } // TODO