* InstrTable.cs: Add Calli, detabify
[mono.git] / mcs / ilasm / codegen / ClassTable.cs
index f8ef369b678d0ec8ba738dd347755f865ad7ba1e..02df198ab5ec50e93998295773a1b191407650e6 100644 (file)
@@ -22,8 +22,9 @@ namespace Mono.ILASM {
                        private int flags;
 
                        public ArrayList LocationList;
-                       public Class Class;
+                       public ClassDef Class;
                        public MethodTable method_table;
+                       public FieldTable field_table;
 
                        public ClassTableItem (ClassDef klass, Location location)
                        {
@@ -32,6 +33,7 @@ namespace Mono.ILASM {
                                LocationList = new ArrayList ();
                                LocationList.Add (location);
                                method_table = new MethodTable (klass);
+                               field_table = new FieldTable (klass);
                        }
                
                        public bool Defined {
@@ -44,9 +46,28 @@ namespace Mono.ILASM {
                                }
                        }
 
+                       public bool CheckDefined ()
+                       {
+                               if (!Defined)
+                                       return false;
+                               
+                               if (!FieldTable.CheckDefined ())
+                                       return false;
+                               
+                               if (!MethodTable.CheckDefined ())
+                                       return false;
+                               
+                               return true;
+                       }
+
                        public MethodTable MethodTable {
                                get { return method_table; }
                        }
+
+                       public FieldTable FieldTable {
+                               get { return field_table; }
+                       }
+                       
                }
 
                protected readonly TypeAttr DefaultAttr;
@@ -99,17 +120,35 @@ namespace Mono.ILASM {
                        return item.MethodTable;
                }
 
+               public FieldTable GetFieldTable (string full_name, Location location)
+               {
+                       ClassTableItem item = table[full_name] as ClassTableItem;
+                       
+                       if (item == null) {
+                               GetReference (full_name, location);
+                               return GetFieldTable (full_name, location);
+                       }
+
+                       return item.FieldTable;
+               }
+
                public ClassDef AddDefinition (string name_space, string name, 
                        TypeAttr attr, Location location) 
                {
                        string full_name = String.Format ("{0}.{1}", name_space, name);
                        
-                       CheckExists (full_name);                                
+                       ClassTableItem item = (ClassTableItem) table[full_name];
+
+                       if (item == null) {
+                               ClassDef klass = pefile.AddClass (attr, name_space, name);
+                               AddDefined (full_name, klass, location);
+                               return klass;
+                       }
 
-                       ClassDef klass = pefile.AddClass (attr, name_space, name);
-                       AddDefined (full_name, klass, location);
+                       item.Class.AddAttribute (attr);
+                       item.Defined = true;
 
-                       return klass;
+                       return item.Class;
                }
 
                public ClassDef AddDefinition (string name_space, string name, 
@@ -117,12 +156,19 @@ namespace Mono.ILASM {
                {
                        string full_name = String.Format ("{0}.{1}", name_space, name);
 
-                       CheckExists (full_name);                                
+                       ClassTableItem item = (ClassTableItem) table[full_name];
 
-                       ClassDef klass = pefile.AddClass (attr, name_space, name, parent);
-                       AddDefined (full_name, klass, location);
+                       if (item == null) {
+                               ClassDef klass = pefile.AddClass (attr, name_space, name, parent);
+                               AddDefined (full_name, klass, location);
+                               return klass;
+                       }
+                       
+                       /// TODO: Need to set parent, will need to modify PEAPI for this.
+                       item.Class.AddAttribute (attr);
+                       item.Defined = true;
 
-                       return klass;
+                       return item.Class;
                }
 
                /// <summary>
@@ -133,7 +179,7 @@ namespace Mono.ILASM {
                {
                        foreach (DictionaryEntry dic_entry in table) {
                                ClassTableItem table_item = (ClassTableItem) dic_entry.Value;
-                               if (table_item.Defined)
+                               if (table_item.CheckDefined ())
                                        continue;
                                throw new Exception (String.Format ("Type: {0} is not defined.", dic_entry.Key));
                        }