2002-03-16 Miguel de Icaza <miguel@ximian.com>
authorMiguel de Icaza <miguel@gnome.org>
Sat, 16 Mar 2002 16:22:43 +0000 (16:22 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Sat, 16 Mar 2002 16:22:43 +0000 (16:22 -0000)
* 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.

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

mcs/mcs/ChangeLog
mcs/mcs/cs-parser.jay
mcs/mcs/driver.cs
mcs/mcs/tree.cs
mcs/mcs/typemanager.cs

index 741e6d7084dd6480fc6924ee5cfbdabebb0961c5..868417aad006beafa0cca4d960ef4b03446bf638 100755 (executable)
@@ -1,5 +1,12 @@
 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.
 
index 82fff30d0aab84cac0851f8fda37f1d2c743b80e..e258a78fba5592371ba014c4051bbfea3cd29160 100755 (executable)
@@ -3620,7 +3620,7 @@ CheckDef (AdditionResult result, string name)
        
        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;
index cdead25d31087d276e73ee44193acd304df52715..079c3441af6bead3157d57fc39e358ca5b96a452 100755 (executable)
@@ -700,6 +700,8 @@ namespace Mono.CSharp
 
                        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
@@ -711,8 +713,6 @@ namespace Mono.CSharp
                        if (timestamps)
                                ShowTime ("   Core Types done");
 
-                       RootContext.TypeManager.AddModule (RootContext.CodeGen.ModuleBuilder);
-                       
                        //
                        // The second pass of the compiler
                        //
index dee4078c351767a9fd6b9fb52f1985a07a95b06e..066330d5c3ed8a170da7a80511fcfdea74b5ba0a 100755 (executable)
@@ -63,13 +63,26 @@ namespace Mono.CSharp
                        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)
@@ -77,7 +90,7 @@ namespace Mono.CSharp
                        if (structs == null)
                                structs = new Hashtable ();
 
-                       structs.Add (name, s);
+                       RecordDecl (structs, name, s);
                }
                
                public void RecordClass (string name, Class c)
@@ -85,7 +98,7 @@ namespace Mono.CSharp
                        if (classes == null)
                                classes = new Hashtable ();
 
-                       classes.Add (name, c);
+                       RecordDecl (classes, name, c);
                }
 
                public void RecordEnum (string name, Enum e)
@@ -93,7 +106,7 @@ namespace Mono.CSharp
                        if (enums == null)
                                enums = new Hashtable ();
 
-                       enums.Add (name, e);
+                       RecordDecl (enums, name, e);
                }
 
                public Namespace RecordNamespace (Namespace parent, string file, string name)
index beb51c2f81b9beb7580a5a9e1752d0837b99224c..797c0002717565d844aca1b11019c2bceed7ba68 100755 (executable)
@@ -162,7 +162,7 @@ public class TypeManager {
 
        public TypeManager ()
        {
-               assemblies = null;
+               assemblies = new Assembly [0];
                modules = null;
                user_types = new ArrayList ();
                types = new Hashtable ();
@@ -183,8 +183,12 @@ public class TypeManager {
 
        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)
@@ -251,11 +255,11 @@ public class TypeManager {
        /// </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;
        }