Merge pull request #487 from mayerwin/patch-1
[mono.git] / mcs / ilasm / codegen / ExternTable.cs
index ff0237d8398ed474598ec644d8e61e436bfe10ac..25a46efbf3180a5898d536eb0b2224a4bc0132f8 100644 (file)
@@ -9,9 +9,11 @@
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Reflection;
 using System.Security;
 using System.Globalization;
+using PEAPI;
 
 namespace Mono.ILASM {
 
@@ -247,11 +249,34 @@ namespace Mono.ILASM {
 
         }
 
+        public class ExternClass
+        {
+            string name;
+            TypeAttr ta;
+            string assemblyReference;
+
+            public ExternClass (string name, TypeAttr ta, string assemblyReference)
+            {
+                this.name = name;
+                this.ta = ta;
+                this.assemblyReference = assemblyReference;
+            }
+
+            public void Resolve (CodeGen code_gen, ExternTable table)
+            {
+                var ar = table.GetAssemblyRef (assemblyReference);
+                if (ar != null)
+                    code_gen.PEFile.AddExternClass (name, ta, ar.AssemblyRef);
+            }
+        }
+
         
         public class ExternTable {
 
                 Hashtable assembly_table;
                 Hashtable module_table;
+                List<ExternClass> class_table;
+
                 bool is_resolved;
                 
                 public void AddCorlib ()
@@ -305,6 +330,14 @@ namespace Mono.ILASM {
                         return em;
                 }
 
+                public void AddClass (string name, TypeAttr ta, string assemblyReference)
+                {
+                    if (class_table == null)
+                        class_table = new List<ExternClass> ();
+
+                    class_table.Add (new ExternClass (name, ta, assemblyReference));
+                }
+
                 public void Resolve (CodeGen code_gen)
                 {
                         if (is_resolved)
@@ -313,12 +346,16 @@ namespace Mono.ILASM {
                         if (assembly_table != null)
                                 foreach (ExternAssembly ext in assembly_table.Values)
                                         ext.Resolve (code_gen);
-                        if (module_table == null)
-                                return;
-                        foreach (ExternModule ext in module_table.Values)
-                                ext.Resolve (code_gen);
 
-                       is_resolved = true;     
+                        if (module_table != null)
+                            foreach (ExternModule ext in module_table.Values)
+                                    ext.Resolve (code_gen);
+
+                        if (class_table != null)
+                            foreach (var entry in class_table)
+                                entry.Resolve (code_gen, this);
+
+                        is_resolved = true;    
                 }
 
                 public ExternTypeRef GetTypeRef (string asmb_name, string full_name, bool is_valuetype)
@@ -356,6 +393,18 @@ namespace Mono.ILASM {
                         return mod.GetTypeRef (full_name, is_valuetype);
                 }
 
+                public ExternAssembly GetAssemblyRef (string assembly_name)
+                {
+                        ExternAssembly ass = null;
+                        if (assembly_table != null)
+                                ass = assembly_table [assembly_name] as ExternAssembly;
+
+                        if (ass == null)
+                                Report.Error ("Assembly " + assembly_name + " is not defined.");
+
+                        return ass;
+                }
+
                 public static void GetNameAndNamespace (string full_name,
                         out string name_space, out string name) {