2002-03-16 Miguel de Icaza <miguel@ximian.com>
+ * typemanager.cs: Make the assemblies array always be non-null
+ (empty, but non-null)
+
+ * tree.cs (RecordDecl): New function that abstracts the recording
+ of names. This reports error 101, and provides a pointer to the
+ previous declaration. Fixes a crash in the compiler.
+
* cs-parser.jay (constructor_declaration): Update to new grammar,
and provide a constructor_body that can be empty.
switch (result){
case AdditionResult.NameExists:
- Report.Error (102, l, "The namespace `" + current_container.Name +
+ Report.Error (102, l, "The container `" + current_container.Name +
"' already contains a definition for `"+
name + "'");
break;
RootContext.CodeGen = new CodeGen (output_file, output_file);
+ RootContext.TypeManager.AddModule (RootContext.CodeGen.ModuleBuilder);
+
//
// Before emitting, we need to get the core
// types emitted from the user defined types
if (timestamps)
ShowTime (" Core Types done");
- RootContext.TypeManager.AddModule (RootContext.CodeGen.ModuleBuilder);
-
//
// The second pass of the compiler
//
root_types = new TypeContainer (null, "", new Location (-1));
}
-
+ void RecordDecl (Hashtable decl, string name, DeclSpace ds)
+ {
+ if (decl.Contains (name)){
+ Report.Error (
+ 101, ds.Location,
+ "There is already a definition for `" + name + "'");
+ DeclSpace other = (DeclSpace) decl [name];
+ Report.Error (0,
+ other.Location, "(Location of symbol related to previous error)");
+ return;
+ }
+ decl.Add (name, ds);
+ }
+
public void RecordInterface (string name, Interface iface)
{
if (ifaces == null)
ifaces = new Hashtable ();
- ifaces.Add (name, iface);
+ RecordDecl (ifaces, name, iface);
}
public void RecordStruct (string name, Struct s)
if (structs == null)
structs = new Hashtable ();
- structs.Add (name, s);
+ RecordDecl (structs, name, s);
}
public void RecordClass (string name, Class c)
if (classes == null)
classes = new Hashtable ();
- classes.Add (name, c);
+ RecordDecl (classes, name, c);
}
public void RecordEnum (string name, Enum e)
if (enums == null)
enums = new Hashtable ();
- enums.Add (name, e);
+ RecordDecl (enums, name, e);
}
public Namespace RecordNamespace (Namespace parent, string file, string name)
public TypeManager ()
{
- assemblies = null;
+ assemblies = new Assembly [0];
modules = null;
user_types = new ArrayList ();
types = new Hashtable ();
public void AddUserType (string name, TypeBuilder t)
{
- types.Add (name, t);
- user_types.Add (t);
+ try {
+ types.Add (name, t);
+ user_types.Add (t);
+ } catch {
+ Report.Error (-17, "The type `" + name + "' has already been defined");
+ }
}
public void AddUserType (string name, TypeBuilder t, TypeContainer tc)
/// </summary>
public void AddAssembly (Assembly a)
{
- int top = assemblies != null ? assemblies.Length : 0;
+ int top = assemblies.Length;
Assembly [] n = new Assembly [top + 1];
- if (assemblies != null)
- assemblies.CopyTo (n, 0);
+ assemblies.CopyTo (n, 0);
+
n [top] = a;
assemblies = n;
}