* CodeGen.cs: Add methods for adding data. CodeGen now takes a
authorJackson Harper <jackson@novell.com>
Mon, 22 Sep 2003 03:07:55 +0000 (03:07 -0000)
committerJackson Harper <jackson@novell.com>
Mon, 22 Sep 2003 03:07:55 +0000 (03:07 -0000)
report object for giving users errors/warnings/info.
* FieldDef.cs: When a data constant is assigned to a field the
constant might not exist yet. So just take the constants name and
look it up when writting code.
* Local.cs: Starting to add some error handling. Still playing
with diff ways to do this.
* MethodDef.cs: Add some error handling for local var lookups
* TypeDef.cs: Data is allways global so it should never be added
to a class
* TypeRef.cs: Error message for lookups.

svn path=/trunk/mcs/; revision=18259

mcs/ilasm/codegen/ChangeLog
mcs/ilasm/codegen/CodeGen.cs
mcs/ilasm/codegen/FieldDef.cs
mcs/ilasm/codegen/Local.cs
mcs/ilasm/codegen/MethodDef.cs
mcs/ilasm/codegen/TypeDef.cs
mcs/ilasm/codegen/TypeRef.cs

index e09eb71922e76d34c9e387d8fb66cae7cf40b35e..0d67f097d5a1219abc6f76ec61287dd1e246f1a1 100644 (file)
@@ -1,3 +1,17 @@
+2003-09-21 Jackson Harper <jackson@latitudegeo.com>
+
+       * CodeGen.cs: Add methods for adding data. CodeGen now takes a
+       report object for giving users errors/warnings/info.
+       * FieldDef.cs: When a data constant is assigned to a field the
+       constant might not exist yet. So just take the constants name and
+       look it up when writting code.
+       * Local.cs: Starting to add some error handling. Still playing
+       with diff ways to do this.
+       * MethodDef.cs: Add some error handling for local var lookups
+       * TypeDef.cs: Data is allways global so it should never be added
+       to a class
+       * TypeRef.cs: Error message for lookups.
+       
 2003-09-20 Jackson Harper <jackson@latitudegeo.com>
 
        * TypeDef.cs: Rework so multiple constraints can be added to a
index 5b76e34bdb08eb86f1a8afbc126bee13f714a235..d9616a3c86bddf404abc1b0c00b4289fe83b976c 100644 (file)
@@ -22,6 +22,7 @@ namespace Mono.ILASM {
 \r
                 private PEFile pefile;\r
                 private string assembly_name;\r
+                private Report report;\r
                 private string current_namespace;\r
                 private TypeDef current_typedef;\r
                 private MethodDef current_methoddef;\r
@@ -31,7 +32,7 @@ namespace Mono.ILASM {
                 private ExternTable extern_table;\r
                 private Hashtable global_field_table;\r
                 private Hashtable global_method_table;\r
-                private ArrayList global_data_list;\r
+                private ArrayList data_list;\r
 \r
                 private ArrayList defcont_list;\r
 \r
@@ -43,18 +44,20 @@ namespace Mono.ILASM {
                 private bool is_dll;\r
                 private bool is_assembly;\r
 \r
-                public CodeGen (string output_file, bool is_dll, bool is_assembly)\r
+                public CodeGen (string output_file, bool is_dll, bool is_assembly, Report report)\r
                 {\r
                         this.output_file = output_file;\r
                         this.is_dll = is_dll;\r
                         this.is_assembly = is_assembly;\r
+                        this.report = report;\r
 \r
                         type_manager = new TypeManager (this);\r
                         extern_table = new ExternTable ();\r
                         typedef_stack = new Stack ();\r
                         global_field_table = new Hashtable ();\r
                         global_method_table = new Hashtable ();\r
-                        global_data_list = new ArrayList ();\r
+\r
+                        data_list = new ArrayList ();\r
 \r
                         defcont_list = new ArrayList ();\r
 \r
@@ -67,6 +70,10 @@ namespace Mono.ILASM {
                         get { return pefile; }\r
                 }\r
 \r
+                public Report Report {\r
+                        get { return report; }\r
+                }\r
+\r
                 public string CurrentNameSpace {\r
                         get { return current_namespace; }\r
                         set { current_namespace = value; }\r
@@ -156,11 +163,17 @@ namespace Mono.ILASM {
 \r
                 public void AddDataDef (DataDef datadef)\r
                 {\r
-                        if (current_typedef != null) {\r
-                                current_typedef.AddDataDef (datadef);\r
-                        } else {\r
-                                global_data_list.Add (datadef);\r
+                        data_list.Add (datadef);\r
+                }\r
+\r
+                public PEAPI.DataConstant GetDataConst (string name)\r
+                {\r
+                        foreach (DataDef def in data_list) {\r
+                                if (def.Name == name)\r
+                                        return (DataConstant) def.PeapiConstant;\r
                         }\r
+                        return null;\r
+\r
                 }\r
 \r
                 public void BeginMethodDef (MethodDef methoddef)\r
index f491a9b7c67ee659458d8d256cb224f1614770c7..f1c06aaa3c92c55d53ca41808fd05cc978e1b2df 100644 (file)
@@ -27,6 +27,7 @@ namespace Mono.ILASM {
 
                 private uint offset;
                 private PEAPI.Constant constant;
+                private string at_data_id;
 
                 public FieldDef (PEAPI.FieldAttr attr, string name,
                                 ITypeRef type)
@@ -39,6 +40,8 @@ namespace Mono.ILASM {
                         datavalue_set = false;
                         value_set = false;
 
+                        at_data_id = null;
+
                         is_resolved = false;
                 }
 
@@ -62,9 +65,9 @@ namespace Mono.ILASM {
                         this.constant = constant;
                 }
 
-                public void AddDataValue (PEAPI.DataConstant constant)
+                public void AddDataValue (string at_data_id)
                 {
-
+                        this.at_data_id = at_data_id;
                 }
 
                 public PEAPI.FieldDef Resolve (CodeGen code_gen)
@@ -99,7 +102,7 @@ namespace Mono.ILASM {
                 public void Define (CodeGen code_gen)
                 {
                         Resolve (code_gen);
-                        WriteCode (field_def);
+                        WriteCode (code_gen, field_def);
                 }
 
                 /// <summary>
@@ -108,16 +111,21 @@ namespace Mono.ILASM {
                 public void Define (CodeGen code_gen, PEAPI.ClassDef class_def)
                 {
                         Resolve (code_gen, class_def);
-                        WriteCode (field_def);
+                        WriteCode (code_gen, field_def);
                 }
 
-                protected void WriteCode (PEAPI.FieldDef field_def)
+                protected void WriteCode (CodeGen code_gen, PEAPI.FieldDef field_def)
                 {
                         if (offset_set)
                                 field_def.SetOffset (offset);
 
                         if (value_set)
                                 field_def.AddValue (constant);
+
+                        if (at_data_id != null) {
+                                PEAPI.DataConstant dc = code_gen.GetDataConst (at_data_id);
+                                field_def.AddDataValue (dc);
+                        }
                 }
         }
 
index d2b6de479084bdb4aa3e35424977046b926337c8..f74170f5f66a377d2b832f09e2d50550355fef07 100644 (file)
@@ -44,8 +44,12 @@ namespace Mono.ILASM {
 
                 public PEAPI.Local GetPeapiLocal (CodeGen code_gen)
                 {
+                        int ec = code_gen.Report.ErrorCount;
                         type.Resolve (code_gen);
 
+                        if (code_gen.Report.ErrorCount > ec)
+                                return null;
+
                         return new PEAPI.Local (name, type.PeapiType);
                 }
         }
index b7bc2c867f9545481dcd8c7b672d901354d7878c..30423373f777da9a7aff5766d2644f71d2d873d9 100644 (file)
@@ -274,12 +274,16 @@ namespace Mono.ILASM {
                                 methoddef.DeclareEntryPoint ();
 
                         if (local_list != null) {
+                                int ec = code_gen.Report.ErrorCount;
                                 PEAPI.Local[] local_array = new PEAPI.Local[local_list.Count];
                                 int i = 0;
 
                                 foreach (Local local in local_list)
                                         local_array[local.Slot]  = local.GetPeapiLocal (code_gen);
 
+                                if (code_gen.Report.ErrorCount > ec)
+                                        return;
+
                                 methoddef.AddLocals (local_array, init_locals);
                         }
 
index a0d7f76f41127fffdd4991804247b2e0d7689cc1..35700c9c591f80285cadf9267a15ca032a66c1a3 100644 (file)
@@ -30,7 +30,6 @@ namespace Mono.ILASM {
                 private PEAPI.ClassDef classdef;
                 private Hashtable field_table;
                 private Hashtable method_table;
-                private ArrayList data_list;
                 private ArrayList customattr_list;
                 private ArrayList event_list;
                 private ArrayList property_list;
@@ -58,7 +57,6 @@ namespace Mono.ILASM {
                         this.impl_list = impl_list;
                         field_table = new Hashtable ();
                         method_table = new Hashtable ();
-                        data_list = new ArrayList ();
 
                         size = -1;
                         pack = -1;
@@ -149,20 +147,6 @@ namespace Mono.ILASM {
                         field_table.Add (fielddef.Name, fielddef);
                 }
 
-                public void AddDataDef (DataDef datadef)
-                {
-                        data_list.Add (datadef);
-                }
-
-                public DataDef GetDataDef (string name)
-                {
-                        foreach (DataDef def in data_list) {
-                                if (def.Name == name)
-                                        return def;
-                        }
-                        return null;
-                }
-
                 public void AddMethodDef (MethodDef methoddef)
                 {
                         method_table.Add (methoddef.Signature, methoddef);
index c2d41ad8d9595f50e9ad47809fbf96b38ff4365f..c65a8e9174cd83c4a156878b9d65292f592098f4 100644 (file)
@@ -83,6 +83,12 @@ namespace Mono.ILASM {
                         PEAPI.Type base_type;
 
                         base_type = code_gen.TypeManager.GetPeapiType (full_name);
+
+                        if (base_type == null) {
+                                code_gen.Report.Error ("Reference to undefined class '" +
+                                                       FullName + "'");
+                                return;
+                        }
                         type = Modify (code_gen, base_type);
 
                         is_resolved = true;