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
+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
\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
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
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
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
\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
private uint offset;
private PEAPI.Constant constant;
+ private string at_data_id;
public FieldDef (PEAPI.FieldAttr attr, string name,
ITypeRef type)
datavalue_set = false;
value_set = false;
+ at_data_id = null;
+
is_resolved = false;
}
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)
public void Define (CodeGen code_gen)
{
Resolve (code_gen);
- WriteCode (field_def);
+ WriteCode (code_gen, field_def);
}
/// <summary>
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);
+ }
}
}
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);
}
}
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);
}
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;
this.impl_list = impl_list;
field_table = new Hashtable ();
method_table = new Hashtable ();
- data_list = new ArrayList ();
size = -1;
pack = -1;
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);
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;