[w32handle] Stop returning 0 in every cases for locking/unlocking (#3926)
[mono.git] / mcs / tools / linker / Mono.Linker.Steps / BlacklistStep.cs
index 08761871fd6c2ce4e517009daf8b127357828edf..6c6344bc3c23311aae12fe03e329e8536fd8910a 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System;
+using System.Linq;
 using System.IO;
 using System.Reflection;
+using System.Xml;
 using System.Xml.XPath;
 
 using Mono.Cecil;
@@ -44,10 +47,38 @@ namespace Mono.Linker.Steps {
                protected override void Process ()
                {
                        foreach (string name in Assembly.GetExecutingAssembly ().GetManifestResourceNames ()) {
-                               if (!IsReferenced (GetAssemblyName (name)))
+                               if (!name.EndsWith (".xml", StringComparison.OrdinalIgnoreCase) || !IsReferenced (GetAssemblyName (name)))
                                        continue;
 
-                               Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetResolveStep (name));
+                               try {
+                                       if (Context.LogInternalExceptions)
+                                               Console.WriteLine ("Processing resource linker descriptor: {0}", name);
+                                       Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetResolveStep (name));
+                               } catch (XmlException ex) {
+                                       /* This could happen if some broken XML file is included. */
+                                       if (Context.LogInternalExceptions)
+                                               Console.WriteLine ("Error processing {0}: {1}", name, ex);
+                               }
+                       }
+
+                       foreach (var asm in Context.GetAssemblies ()) {
+                               foreach (var rsc in asm.Modules
+                                                                       .SelectMany (mod => mod.Resources)
+                                                                       .Where (res => res.ResourceType == ResourceType.Embedded)
+                                                                       .Where (res => res.Name.EndsWith (".xml", StringComparison.OrdinalIgnoreCase))
+                                                                       .Where (res => IsReferenced (GetAssemblyName (res.Name)))
+                                                                       .Cast<EmbeddedResource> ()) {
+                                       try {
+                                               if (Context.LogInternalExceptions)
+                                                       Console.WriteLine ("Processing embedded resource linker descriptor: {0}", rsc.Name);
+
+                                               Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetExternalResolveStep (rsc, asm));
+                                       } catch (XmlException ex) {
+                                               /* This could happen if some broken XML file is embedded. */
+                                               if (Context.LogInternalExceptions)
+                                                       Console.WriteLine ("Error processing {0}: {1}", rsc.Name, ex);
+                                       }
+                               }
                        }
                }
 
@@ -69,9 +100,21 @@ namespace Mono.Linker.Steps {
                        return false;
                }
 
+               static ResolveFromXmlStep GetExternalResolveStep (EmbeddedResource resource, AssemblyDefinition assembly)
+               {
+                       return new ResolveFromXmlStep (GetExternalDescriptor (resource), "resource " + resource.Name + " in " + assembly.FullName);
+               }
+
                static ResolveFromXmlStep GetResolveStep (string descriptor)
                {
-                       return new ResolveFromXmlStep (GetDescriptor (descriptor));
+                       return new ResolveFromXmlStep (GetDescriptor (descriptor), "descriptor " + descriptor + " from " + Assembly.GetExecutingAssembly ().FullName);
+               }
+
+               static XPathDocument GetExternalDescriptor (EmbeddedResource resource)
+               {
+                       using (var sr = new StreamReader (resource.GetResourceStream ())) {
+                               return new XPathDocument (new StringReader (sr.ReadToEnd ()));
+                       }
                }
 
                static XPathDocument GetDescriptor (string descriptor)