]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2009-04-24 Emmanuel Briot <briot@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Apr 2009 10:18:20 +0000 (10:18 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Apr 2009 10:18:20 +0000 (10:18 +0000)
* prj-proc.adb, prj.adb, prj.ads, prj-nmsc.adb, prj-env.adb
(Source_Id, Source_Data): use a real list to store sources rather than
using an external table to store the elements. This makes code more
efficient and more readable.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146691 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/prj-env.adb
gcc/ada/prj-nmsc.adb
gcc/ada/prj-proc.adb
gcc/ada/prj.adb
gcc/ada/prj.ads

index ad7279e5e91ed3e1dea1a37e72074970b25bb3c8..b00fcef26a2398f82cdeafd3d15ace2a8174b8ef 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-24  Emmanuel Briot  <briot@adacore.com>
+
+       * prj-proc.adb, prj.adb, prj.ads, prj-nmsc.adb, prj-env.adb
+       (Source_Id, Source_Data): use a real list to store sources rather than
+       using an external table to store the elements. This makes code more
+       efficient and more readable.
+
 2009-04-24  Emmanuel Briot  <briot@adacore.com>
 
        * prj-proc.adb, prj.adb, prj.ads, prj-nmsc.adb, prj-env.adb
index f37ecd422143731d7dc032642a66cfb1cd18e320..eef00fe3c9fa5254a2e77a005a132d50501f7c8e 100644 (file)
@@ -1050,7 +1050,6 @@ package body Prj.Env is
       --  will be set to True.
 
       Source        : Source_Id;
-      Src_Data      : Source_Data;
       Suffix        : File_Name_Type;
       The_Unit_Data : Unit_Data;
       Data          : File_Name_Data;
@@ -1207,22 +1206,20 @@ package body Prj.Env is
                   Source := Prj.Element (Iter);
                   exit when Source = No_Source;
 
-                  Src_Data := In_Tree.Sources.Table (Source);
-
-                  if In_Tree.Sources.Table (Source).Language.Name = Language
-                      and then not Src_Data.Locally_Removed
-                      and then Src_Data.Replaced_By = No_Source
-                      and then Src_Data.Path.Name /= No_Path
+                  if Source.Language.Name = Language
+                      and then not Source.Locally_Removed
+                      and then Source.Replaced_By = No_Source
+                      and then Source.Path.Name /= No_Path
                   then
-                     if Src_Data.Unit /= No_Name then
-                        Get_Name_String (Src_Data.Unit);
+                     if Source.Unit /= No_Name then
+                        Get_Name_String (Source.Unit);
 
-                        if Src_Data.Kind = Spec then
+                        if Source.Kind = Spec then
                            Suffix :=
-                             Src_Data.Language.Config.Mapping_Spec_Suffix;
+                             Source.Language.Config.Mapping_Spec_Suffix;
                         else
                            Suffix :=
-                             Src_Data.Language.Config.Mapping_Body_Suffix;
+                             Source.Language.Config.Mapping_Body_Suffix;
                         end if;
 
                         if Suffix /= No_File then
@@ -1232,10 +1229,10 @@ package body Prj.Env is
                         Put_Name_Buffer;
                      end if;
 
-                     Get_Name_String (Src_Data.File);
+                     Get_Name_String (Source.File);
                      Put_Name_Buffer;
 
-                     Get_Name_String (Src_Data.Path.Name);
+                     Get_Name_String (Source.Path.Name);
                      Put_Name_Buffer;
                   end if;
 
index f6546eadee3332141603faaabea774a3db5f17d9..5098883dee9c8ae811a83b0f3a23951a5742a14f 100644 (file)
@@ -578,8 +578,7 @@ package body Prj.Nmsc is
 
    procedure Remove_Source
      (Id          : Source_Id;
-      Replaced_By : Source_Id;
-      In_Tree     : Project_Tree_Ref);
+      Replaced_By : Source_Id);
    --  ??? needs comment
 
    procedure Report_No_Sources
@@ -698,19 +697,13 @@ package body Prj.Nmsc is
       Index               : Int       := 0;
       Source_To_Replace   : Source_Id := No_Source)
    is
-      Src_Data : Source_Data := No_Source_Data;
       Config   : constant Language_Config := Lang_Id.Config;
 
    begin
-      --  This is a new source so create an entry for it in the Sources table
-
-      Source_Data_Table.Increment_Last (In_Tree.Sources);
-      Id := Source_Data_Table.Last (In_Tree.Sources);
+      Id := new Source_Data;
 
       if Current_Verbosity = High then
-         Write_Str ("Adding source #");
-         Write_Str (Id'Img);
-         Write_Str (", File : ");
+         Write_Str ("Adding source File: ");
          Write_Str (Get_Name_String (File_Name));
 
          if Lang_Kind = Unit_Based then
@@ -727,39 +720,37 @@ package body Prj.Nmsc is
          Write_Eol;
       end if;
 
-      Src_Data.Project             := Project;
-      Src_Data.Language            := Lang_Id;
-      Src_Data.Lang_Kind           := Lang_Kind;
-      Src_Data.Compiled            :=
+      Id.Project             := Project;
+      Id.Language            := Lang_Id;
+      Id.Lang_Kind           := Lang_Kind;
+      Id.Compiled            :=
         Lang_Id.Config.Compiler_Driver /= Empty_File_Name;
-      Src_Data.Kind                := Kind;
-      Src_Data.Alternate_Languages := Alternate_Languages;
-      Src_Data.Other_Part          := Other_Part;
+      Id.Kind                := Kind;
+      Id.Alternate_Languages := Alternate_Languages;
+      Id.Other_Part          := Other_Part;
 
-      Src_Data.Object_Exists := Config.Object_Generated;
-      Src_Data.Object_Linked := Config.Objects_Linked;
+      Id.Object_Exists := Config.Object_Generated;
+      Id.Object_Linked := Config.Objects_Linked;
 
       if Other_Part /= No_Source then
-         In_Tree.Sources.Table (Other_Part).Other_Part := Id;
+         Other_Part.Other_Part := Id;
       end if;
 
-      Src_Data.Unit                := Unit;
-      Src_Data.Index               := Index;
-      Src_Data.File                := File_Name;
-      Src_Data.Display_File        := Display_File;
-      Src_Data.Dependency          := Lang_Id.Config.Dependency_Kind;
-      Src_Data.Dep_Name            := Dependency_Name
-                                        (File_Name, Src_Data.Dependency);
-      Src_Data.Naming_Exception    := Naming_Exception;
-
-      if Src_Data.Compiled and then Src_Data.Object_Exists then
-         Src_Data.Object   :=
-           Object_Name (File_Name, Config.Object_File_Suffix);
-         Src_Data.Switches := Switches_Name (File_Name);
+      Id.Unit                := Unit;
+      Id.Index               := Index;
+      Id.File                := File_Name;
+      Id.Display_File        := Display_File;
+      Id.Dependency          := Lang_Id.Config.Dependency_Kind;
+      Id.Dep_Name            := Dependency_Name (File_Name, Id.Dependency);
+      Id.Naming_Exception    := Naming_Exception;
+
+      if Id.Compiled and then Id.Object_Exists then
+         Id.Object   := Object_Name (File_Name, Config.Object_File_Suffix);
+         Id.Switches := Switches_Name (File_Name);
       end if;
 
       if Path /= No_Path then
-         Src_Data.Path := (Path, Display_Path);
+         Id.Path := (Path, Display_Path);
          Source_Paths_Htable.Set (In_Tree.Source_Paths_HT, Path, Id);
       end if;
 
@@ -772,13 +763,11 @@ package body Prj.Nmsc is
 
       --  Add the source to the language list
 
-      Src_Data.Next_In_Lang := Lang_Id.First_Source;
+      Id.Next_In_Lang := Lang_Id.First_Source;
       Lang_Id.First_Source := Id;
 
-      In_Tree.Sources.Table (Id) := Src_Data;
-
       if Source_To_Replace /= No_Source then
-         Remove_Source (Source_To_Replace, Id, In_Tree);
+         Remove_Source (Source_To_Replace, Id);
       end if;
    end Add_Source;
 
@@ -926,26 +915,18 @@ package body Prj.Nmsc is
                                               Project => Project);
                      Source_Loop : loop
                         Source := Element (Iter);
-                        exit Source_Loop when Source = No_Source;
+                        exit Source_Loop when Source = No_Source
+                          or else Source.Language = Language;
 
-                        declare
-                           Src_Data : Source_Data renames
-                             In_Tree.Sources.Table (Source);
+                        Alt_Lang := Source.Alternate_Languages;
 
-                        begin
-                           exit Source_Loop when Src_Data.Language = Language;
-
-                           Alt_Lang := Src_Data.Alternate_Languages;
-
-                           Alternate_Loop :
-                           while Alt_Lang /= No_Alternate_Language loop
-                              Alt_Lang_Data :=
-                                In_Tree.Alt_Langs.Table (Alt_Lang);
-                              exit Source_Loop
-                                 when Alt_Lang_Data.Language = Language;
-                              Alt_Lang := Alt_Lang_Data.Next;
-                           end loop Alternate_Loop;
-                        end;
+                        Alternate_Loop :
+                        while Alt_Lang /= No_Alternate_Language loop
+                           Alt_Lang_Data := In_Tree.Alt_Langs.Table (Alt_Lang);
+                           exit Source_Loop
+                           when Alt_Lang_Data.Language = Language;
+                           Alt_Lang := Alt_Lang_Data.Next;
+                        end loop Alternate_Loop;
 
                         Next (Iter);
                      end loop Source_Loop;
@@ -2554,7 +2535,7 @@ package body Prj.Nmsc is
             loop
                Source := Prj.Element (Iter);
                exit when Source = No_Source;
-               In_Tree.Sources.Table (Source).In_Interfaces := False;
+               Source.In_Interfaces := False;
                Next (Iter);
             end loop;
 
@@ -2575,36 +2556,26 @@ package body Prj.Nmsc is
                   Source := Prj.Element (Iter);
                   exit when Source = No_Source;
 
-                  declare
-                     Src_Data : Source_Data renames
-                                  In_Tree.Sources.Table (Source);
-
-                  begin
-                     if Src_Data.File = Name then
-                        if not Src_Data.Locally_Removed then
-                           Src_Data.In_Interfaces := True;
-                           Src_Data.Declared_In_Interfaces := True;
-
-                           if Src_Data.Other_Part /= No_Source then
-                              In_Tree.Sources.Table
-                                (Src_Data.Other_Part).In_Interfaces := True;
-                              In_Tree.Sources.Table
-                                (Src_Data.Other_Part).Declared_In_Interfaces :=
-                                  True;
-                           end if;
+                  if Source.File = Name then
+                     if not Source.Locally_Removed then
+                        Source.In_Interfaces := True;
+                        Source.Declared_In_Interfaces := True;
 
-                           if Current_Verbosity = High then
-                              Write_Str ("   interface: ");
-                              Write_Line
-                                (Get_Name_String (Src_Data.Path.Name));
-                           end if;
+                        if Source.Other_Part /= No_Source then
+                           Source.Other_Part.In_Interfaces := True;
+                           Source.Other_Part.Declared_In_Interfaces := True;
                         end if;
 
-                        exit Big_Loop;
+                        if Current_Verbosity = High then
+                           Write_Str ("   interface: ");
+                           Write_Line (Get_Name_String (Source.Path.Name));
+                        end if;
                      end if;
 
-                     Next (Iter);
-                  end;
+                     exit Big_Loop;
+                  end if;
+
+                  Next (Iter);
                end loop;
 
                Project_2 := In_Tree.Projects.Table (Project_2).Extends;
@@ -2637,15 +2608,9 @@ package body Prj.Nmsc is
                Source := Prj.Element (Iter);
                exit when Source = No_Source;
 
-               declare
-                  Src_Data : Source_Data renames
-                               In_Tree.Sources.Table (Source);
-
-               begin
-                  if not Src_Data.Declared_In_Interfaces then
-                     Src_Data.In_Interfaces := False;
-                  end if;
-               end;
+               if not Source.Declared_In_Interfaces then
+                  Source.In_Interfaces := False;
+               end if;
 
                Next (Iter);
             end loop;
@@ -2933,8 +2898,7 @@ package body Prj.Nmsc is
                Iter := For_Each_Source (In_Tree, Project);
                loop
                   Source := Prj.Element (Iter);
-                  exit when Source = No_Source
-                    or else In_Tree.Sources.Table (Source).File = File_Name;
+                  exit when Source = No_Source or else Source.File = File_Name;
                   Next (Iter);
                end loop;
 
@@ -2954,14 +2918,14 @@ package body Prj.Nmsc is
                   --  Check if the file name is already recorded for another
                   --  language or another kind.
 
-                  if In_Tree.Sources.Table (Source).Language /= Lang_Id then
+                  if Source.Language /= Lang_Id then
                      Error_Msg
                        (Project,
                         In_Tree,
                         "the same file cannot be a source of two languages",
                         Element.Location);
 
-                  elsif In_Tree.Sources.Table (Source).Kind /= Kind then
+                  elsif Source.Kind /= Kind then
                      Error_Msg
                        (Project,
                         In_Tree,
@@ -3065,14 +3029,12 @@ package body Prj.Nmsc is
                loop
                   Source := Prj.Element (Iter);
                   exit when Source = No_Source
-                    or else
-                      (In_Tree.Sources.Table (Source).Unit = Unit and then
-                       In_Tree.Sources.Table (Source).Index = Index);
+                    or else (Source.Unit = Unit and then Source.Index = Index);
                   Next (Iter);
                end loop;
 
                if Source /= No_Source then
-                  if In_Tree.Sources.Table (Source).Kind /= Kind then
+                  if Source.Kind /= Kind then
                      Other_Part := Source;
 
                      loop
@@ -3080,18 +3042,15 @@ package body Prj.Nmsc is
                         Source := Prj.Element (Iter);
 
                         exit when Source = No_Source or else
-                          (In_Tree.Sources.Table (Source).Unit = Unit
-                           and then
-                           In_Tree.Sources.Table (Source).Index = Index);
+                          (Source.Unit = Unit and then Source.Index = Index);
                      end loop;
                   end if;
 
                   if Source /= No_Source then
-                     Other_Project := In_Tree.Sources.Table (Source).Project;
+                     Other_Project := Source.Project;
 
                      if Is_Extending (Project, Other_Project, In_Tree) then
-                        Other_Part :=
-                          In_Tree.Sources.Table (Source).Other_Part;
+                        Other_Part := Source.Other_Part;
 
                         --  Record the source to be removed
 
@@ -3481,14 +3440,9 @@ package body Prj.Nmsc is
                Iter := For_Each_Source (In_Tree, Proj);
                loop
                   Src_Id := Prj.Element (Iter);
-                  exit when Src_Id = No_Source;
-
-                  declare
-                     Src : Source_Data renames In_Tree.Sources.Table (Src_Id);
-                  begin
-                     exit when Src.Lang_Kind /= File_Based
-                       or else Src.Kind /= Spec;
-                  end;
+                  exit when Src_Id = No_Source
+                    or else Src_Id.Lang_Kind /= File_Based
+                    or else Src_Id.Kind /= Spec;
                   Next (Iter);
                end loop;
 
@@ -4386,8 +4340,8 @@ package body Prj.Nmsc is
         Prj.Util.Value_Of
           (Name_Default_Language, Data.Decl.Attributes, In_Tree);
 
-      --  ??? Shouldn't these be set to False by default, and only set to True
-      --  when we actually find some source file ?
+      --  Shouldn't these be set to False by default, and only set to True when
+      --  we actually find some source file???
 
       Data.Ada_Sources_Present   := Data.Source_Dirs /= Nil_String;
       Data.Other_Sources_Present := Data.Source_Dirs /= Nil_String;
@@ -4440,7 +4394,7 @@ package body Prj.Nmsc is
 
                   --  Attribute Languages is not specified. So, it defaults to
                   --  a project of language Ada only. No sources of languages
-                  --  other than Ada
+                  --  other than Ada.
 
                   Data.Other_Sources_Present := False;
 
@@ -4458,7 +4412,7 @@ package body Prj.Nmsc is
                NL_Id             : Language_Ptr;
 
             begin
-               --  Assume there are no language declared
+               --  Assume there are no languages declared
 
                Data.Ada_Sources_Present := False;
                Data.Other_Sources_Present := False;
@@ -4487,7 +4441,8 @@ package body Prj.Nmsc is
                      Lang_Name := Name_Find;
 
                      --  If the language was not already specified (duplicates
-                     --  are simply ignored)
+                     --  are simply ignored).
+
                      NL_Id := Data.Languages;
                      while NL_Id /= No_Language_Index loop
                         exit when Lang_Name = NL_Id.Name;
@@ -4496,6 +4451,7 @@ package body Prj.Nmsc is
 
                      if NL_Id = No_Language_Index then
                         if Get_Mode = Ada_Only then
+
                            --  Check for language Ada
 
                            if Lang_Name = Name_Ada then
@@ -4514,6 +4470,7 @@ package body Prj.Nmsc is
                         if Lang_Name = Name_Ada then
                            Index.Config.Kind := Unit_Based;
                            Index.Config.Dependency_Kind := ALI_File;
+
                         else
                            Index.Config.Kind := File_Based;
                            Index.Config.Dependency_Kind := None;
@@ -4734,8 +4691,8 @@ package body Prj.Nmsc is
                               Project, In_Tree, Extending)
                            then
                               --  There is a body for this unit.
-                              --  If there is no spec, we need to check
-                              --  that it is not a subunit.
+                              --  If there is no spec, we need to check that it
+                              --  is not a subunit.
 
                               if The_Unit_Data.File_Names
                                 (Specification).Name = No_File
@@ -4763,9 +4720,8 @@ package body Prj.Nmsc is
                                  end;
                               end if;
 
-                              --  The unit is not a subunit, so we add
-                              --  to the Interface ALIs the ALI file
-                              --  corresponding to the body.
+                              --  The unit is not a subunit, so we add the
+                              --  ALI file for its body to the Interface ALIs.
 
                               Add_ALI_For
                                 (The_Unit_Data.File_Names (Body_Part).Name);
@@ -4779,18 +4735,18 @@ package body Prj.Nmsc is
                            end if;
 
                         elsif The_Unit_Data.File_Names
-                          (Specification).Name /= No_File
+                                (Specification).Name /= No_File
                           and then The_Unit_Data.File_Names
-                            (Specification).Path.Name /= Slash
+                                     (Specification).Path.Name /= Slash
                           and then Check_Project
-                            (The_Unit_Data.File_Names
-                                 (Specification).Project,
-                             Project, In_Tree, Extending)
+                                     (The_Unit_Data.File_Names
+                                        (Specification).Project,
+                                      Project, In_Tree, Extending)
 
                         then
-                           --  The unit is part of the project, it has
-                           --  a spec, but no body. We add to the Interface
-                           --  ALIs the ALI file corresponding to the spec.
+                           --  The unit is part of the project, it has a spec,
+                           --  but no body. We add the ALI for its spec to the
+                           --  Interface ALIs.
 
                            Add_ALI_For
                              (The_Unit_Data.File_Names (Specification).Name);
@@ -4813,8 +4769,7 @@ package body Prj.Nmsc is
 
                      loop
                         while Prj.Element (Iter) /= No_Source and then
-                           In_Tree.Sources.Table (Prj.Element (Iter)).Unit /=
-                              Unit
+                           Prj.Element (Iter).Unit /= Unit
                         loop
                            Next (Iter);
                         end loop;
@@ -4829,25 +4784,20 @@ package body Prj.Nmsc is
                      end loop;
 
                      if Source /= No_Source then
-                        if In_Tree.Sources.Table (Source).Kind = Sep then
+                        if Source.Kind = Sep then
                            Source := No_Source;
 
-                        elsif In_Tree.Sources.Table (Source).Kind = Spec
-                          and then
-                          In_Tree.Sources.Table (Source).Other_Part /=
-                          No_Source
+                        elsif Source.Kind = Spec
+                          and then Source.Other_Part /= No_Source
                         then
-                           Source := In_Tree.Sources.Table (Source).Other_Part;
+                           Source := Source.Other_Part;
                         end if;
                      end if;
 
                      if Source /= No_Source then
-                        if In_Tree.Sources.Table (Source).Project /= Project
+                        if Source.Project /= Project
                           and then
-                            not Is_Extending
-                              (Project,
-                               In_Tree.Sources.Table (Source).Project,
-                               In_Tree)
+                            not Is_Extending (Project, Source.Project, In_Tree)
                         then
                            Source := No_Source;
                         end if;
@@ -4861,11 +4811,10 @@ package body Prj.Nmsc is
                                 (Interfaces).Location);
 
                      else
-                        if In_Tree.Sources.Table (Source).Kind = Spec and then
-                          In_Tree.Sources.Table (Source).Other_Part /=
-                            No_Source
+                        if Source.Kind = Spec and then
+                          Source.Other_Part /= No_Source
                         then
-                           Source := In_Tree.Sources.Table (Source).Other_Part;
+                           Source := Source.Other_Part;
                         end if;
 
                         String_Element_Table.Increment_Last
@@ -4873,11 +4822,9 @@ package body Prj.Nmsc is
                         In_Tree.String_Elements.Table
                           (String_Element_Table.Last
                              (In_Tree.String_Elements)) :=
-                          (Value         =>
-                             Name_Id (In_Tree.Sources.Table (Source).Dep_Name),
+                          (Value         => Name_Id (Source.Dep_Name),
                            Index         => 0,
-                           Display_Value =>
-                             Name_Id (In_Tree.Sources.Table (Source).Dep_Name),
+                           Display_Value => Name_Id (Source.Dep_Name),
                            Location      =>
                              In_Tree.String_Elements.Table
                                (Interfaces).Location,
@@ -4922,7 +4869,7 @@ package body Prj.Nmsc is
 
                   else
                      --  Library_Auto_Init cannot be "true" if auto init is not
-                     --  supported
+                     --  supported.
 
                      Error_Msg
                        (Project, In_Tree,
@@ -7291,26 +7238,20 @@ package body Prj.Nmsc is
                Source := Prj.Element (Iter);
                exit when Source = No_Source;
 
-               declare
-                  Src_Data : Source_Data renames
-                               In_Tree.Sources.Table (Source);
-
-               begin
-                  if Src_Data.Naming_Exception
-                    and then Src_Data.Path = No_Path_Information
-                  then
-                     if Src_Data.Unit /= No_Name then
-                        Error_Msg_Name_1 := Name_Id (Src_Data.Display_File);
-                        Error_Msg_Name_2 := Name_Id (Src_Data.Unit);
-                        Error_Msg
-                          (Project, In_Tree,
-                           "source file %% for unit %% not found",
-                           No_Location);
-                     end if;
-
-                     Remove_Source (Source, No_Source, In_Tree);
+               if Source.Naming_Exception
+                 and then Source.Path = No_Path_Information
+               then
+                  if Source.Unit /= No_Name then
+                     Error_Msg_Name_1 := Name_Id (Source.Display_File);
+                     Error_Msg_Name_2 := Name_Id (Source.Unit);
+                     Error_Msg
+                       (Project, In_Tree,
+                        "source file %% for unit %% not found",
+                        No_Location);
                   end if;
-               end;
+
+                  Remove_Source (Source, No_Source);
+               end if;
 
                Next (Iter);
             end loop;
@@ -7704,8 +7645,7 @@ package body Prj.Nmsc is
                Check_Name := True;
 
             else
-               In_Tree.Sources.Table (Name_Loc.Source).Path :=
-                 (Path_Id, Display_Path_Id);
+               Name_Loc.Source.Path := (Path_Id, Display_Path_Id);
 
                Source_Paths_Htable.Set
                  (In_Tree.Source_Paths_HT,
@@ -7714,15 +7654,14 @@ package body Prj.Nmsc is
 
                --  Check if this is a subunit
 
-               if In_Tree.Sources.Table (Name_Loc.Source).Unit /= No_Name
-                 and then
-                   In_Tree.Sources.Table (Name_Loc.Source).Kind = Impl
+               if Name_Loc.Source.Unit /= No_Name
+                 and then Name_Loc.Source.Kind = Impl
                then
                   Src_Ind := Sinput.P.Load_Project_File
                     (Get_Name_String (Path_Id));
 
                   if Sinput.P.Source_File_Is_Subunit (Src_Ind) then
-                     In_Tree.Sources.Table (Name_Loc.Source).Kind := Sep;
+                     Name_Loc.Source.Kind := Sep;
                   end if;
                end if;
             end if;
@@ -7766,93 +7705,86 @@ package body Prj.Nmsc is
                Source := Prj.Element (Iter);
                exit when Source = No_Source;
 
-               declare
-                  Src_Data : Source_Data renames
-                               In_Tree.Sources.Table (Source);
+               if Unit /= No_Name
+                 and then Source.Unit = Unit
+                 and then
+                   ((Source.Kind = Spec and then Kind = Impl)
+                    or else
+                      (Source.Kind = Impl and then Kind = Spec))
+               then
+                  Other_Part := Source;
 
-               begin
-                  if Unit /= No_Name
-                    and then Src_Data.Unit = Unit
-                    and then
-                      ((Src_Data.Kind = Spec and then Kind = Impl)
+               elsif (Unit /= No_Name
+                      and then Source.Unit = Unit
+                      and then
+                        (Source.Kind = Kind
                          or else
-                       (Src_Data.Kind = Impl and then Kind = Spec))
-                  then
-                     Other_Part := Source;
-
-                  elsif (Unit /= No_Name
-                         and then Src_Data.Unit = Unit
-                         and then
-                           (Src_Data.Kind = Kind
-                             or else
-                               (Src_Data.Kind = Sep  and then Kind = Impl)
-                             or else
-                               (Src_Data.Kind = Impl and then Kind = Sep)))
-                    or else
-                      (Unit = No_Name and then Src_Data.File = File_Name)
-                  then
-                     --  Duplication of file/unit in same project is only
-                     --  allowed if order of source directories is known.
+                           (Source.Kind = Sep  and then Kind = Impl)
+                         or else
+                           (Source.Kind = Impl and then Kind = Sep)))
+                 or else
+                   (Unit = No_Name and then Source.File = File_Name)
+               then
+                  --  Duplication of file/unit in same project is only
+                  --  allowed if order of source directories is known.
 
-                     if Project = Src_Data.Project then
-                        if Data.Known_Order_Of_Source_Dirs then
-                           Add_Src := False;
+                  if Project = Source.Project then
+                     if Data.Known_Order_Of_Source_Dirs then
+                        Add_Src := False;
 
-                        elsif Unit /= No_Name then
-                           Error_Msg_Name_1 := Unit;
-                           Error_Msg
-                             (Project, In_Tree, "duplicate unit %%",
-                              No_Location);
-                           Add_Src := False;
+                     elsif Unit /= No_Name then
+                        Error_Msg_Name_1 := Unit;
+                        Error_Msg
+                          (Project, In_Tree, "duplicate unit %%",
+                           No_Location);
+                        Add_Src := False;
 
-                        else
-                           Error_Msg_File_1 := File_Name;
-                           Error_Msg
-                             (Project, In_Tree, "duplicate source file name {",
-                              No_Location);
-                           Add_Src := False;
-                        end if;
+                     else
+                        Error_Msg_File_1 := File_Name;
+                        Error_Msg
+                          (Project, In_Tree, "duplicate source file name {",
+                           No_Location);
+                        Add_Src := False;
+                     end if;
 
-                        --  Do not allow the same unit name in different
-                        --  projects, except if one is extending the other.
+                     --  Do not allow the same unit name in different
+                     --  projects, except if one is extending the other.
 
-                        --  For a file based language, the same file name
-                        --  replaces a file in a project being extended, but
-                        --  it is allowed to have the same file name in
-                        --  unrelated projects.
+                     --  For a file based language, the same file name
+                     --  replaces a file in a project being extended, but
+                     --  it is allowed to have the same file name in
+                     --  unrelated projects.
 
-                     elsif Is_Extending
-                       (Project, Src_Data.Project, In_Tree)
-                     then
-                        Source_To_Replace := Source;
+                  elsif Is_Extending
+                    (Project, Source.Project, In_Tree)
+                  then
+                     Source_To_Replace := Source;
 
-                     elsif Unit /= No_Name
-                       and then not Src_Data.Locally_Removed
-                     then
-                        Error_Msg_Name_1 := Unit;
-                        Error_Msg
-                          (Project, In_Tree,
-                           "unit %% cannot belong to several projects",
-                           No_Location);
+                  elsif Unit /= No_Name
+                    and then not Source.Locally_Removed
+                  then
+                     Error_Msg_Name_1 := Unit;
+                     Error_Msg
+                       (Project, In_Tree,
+                        "unit %% cannot belong to several projects",
+                        No_Location);
 
-                        Error_Msg_Name_1 :=
-                          In_Tree.Projects.Table (Project).Name;
-                        Error_Msg_Name_2 := Name_Id (Display_Path_Id);
-                        Error_Msg
-                          (Project, In_Tree, "\  project %%, %%", No_Location);
+                     Error_Msg_Name_1 :=
+                       In_Tree.Projects.Table (Project).Name;
+                     Error_Msg_Name_2 := Name_Id (Display_Path_Id);
+                     Error_Msg
+                       (Project, In_Tree, "\  project %%, %%", No_Location);
 
-                        Error_Msg_Name_1 :=
-                          In_Tree.Projects.Table (Src_Data.Project).Name;
-                        Error_Msg_Name_2 :=
-                          Name_Id (Src_Data.Path.Display_Name);
-                        Error_Msg
-                          (Project, In_Tree, "\  project %%, %%", No_Location);
+                     Error_Msg_Name_1 :=
+                       In_Tree.Projects.Table (Source.Project).Name;
+                     Error_Msg_Name_2 := Name_Id (Source.Path.Display_Name);
+                     Error_Msg
+                       (Project, In_Tree, "\  project %%, %%", No_Location);
 
-                        Add_Src := False;
-                     end if;
+                     Add_Src := False;
                   end if;
+               end if;
 
-               end;
                Next (Iter);
             end loop;
 
@@ -8016,8 +7948,6 @@ package body Prj.Nmsc is
       In_Tree : Project_Tree_Ref)
    is
       Source : Source_Id;
-      File   : File_Name_Type;
-      Unit   : Name_Id;
       Iter   : Source_Iterator;
 
    begin
@@ -8028,13 +7958,10 @@ package body Prj.Nmsc is
          Source := Prj.Element (Iter);
          exit when Source = No_Source;
 
-         File := In_Tree.Sources.Table (Source).File;
-         Unit := In_Tree.Sources.Table (Source).Unit;
-
          --  An excluded file cannot also be an exception file name
 
-         if Excluded_Sources_Htable.Get (File) /= No_File_Found then
-            Error_Msg_File_1 := File;
+         if Excluded_Sources_Htable.Get (Source.File) /= No_File_Found then
+            Error_Msg_File_1 := Source.File;
             Error_Msg
               (Project, In_Tree,
                "{ cannot be both excluded and an exception file name",
@@ -8042,38 +7969,37 @@ package body Prj.Nmsc is
          end if;
 
          if Current_Verbosity = High then
-            Write_Str ("Naming exception: Putting source #");
-            Write_Str (Source'Img);
-            Write_Str (", file ");
-            Write_Str (Get_Name_String (File));
+            Write_Str ("Naming exception: Putting source file ");
+            Write_Str (Get_Name_String (Source.File));
             Write_Line (" in Source_Names");
          end if;
 
          Source_Names.Set
-           (K => File,
+           (K => Source.File,
             E => Name_Location'
-              (Name     => File,
+              (Name     => Source.File,
                Location => No_Location,
                Source   => Source,
-               Except   => Unit /= No_Name,
+               Except   => Source.Unit /= No_Name,
                Found    => False));
 
          --  If this is an Ada exception, record in table Unit_Exceptions
 
-         if Unit /= No_Name then
+         if Source.Unit /= No_Name then
             declare
-               Unit_Except : Unit_Exception := Unit_Exceptions.Get (Unit);
+               Unit_Except : Unit_Exception :=
+                                Unit_Exceptions.Get (Source.Unit);
 
             begin
-               Unit_Except.Name := Unit;
+               Unit_Except.Name := Source.Unit;
 
-               if In_Tree.Sources.Table (Source).Kind = Spec then
-                  Unit_Except.Spec := File;
+               if Source.Kind = Spec then
+                  Unit_Except.Spec := Source.File;
                else
-                  Unit_Except.Impl := File;
+                  Unit_Except.Impl := Source.File;
                end if;
 
-               Unit_Exceptions.Set (Unit, Unit_Except);
+               Unit_Exceptions.Set (Source.Unit, Unit_Except);
             end;
          end if;
 
@@ -8140,8 +8066,8 @@ package body Prj.Nmsc is
                end if;
 
                if Source /= No_Source then
-                  In_Tree.Sources.Table (Source).Locally_Removed := True;
-                  In_Tree.Sources.Table (Source).In_Interfaces := False;
+                  Source.Locally_Removed := True;
+                  Source.In_Interfaces := False;
                end if;
 
                if Current_Verbosity = High then
@@ -8193,10 +8119,8 @@ package body Prj.Nmsc is
                   Source := Prj.Element (Iter);
                   exit when Source = No_Source;
 
-                  if In_Tree.Sources.Table (Source).File = Excluded.File then
-                     Exclude
-                       (In_Tree.Sources.Table (Source).Project,
-                        No_Unit_Index, Specification);
+                  if Source.File = Excluded.File then
+                     Exclude (Source.Project, No_Unit_Index, Specification);
                      exit;
                   end if;
 
@@ -8230,7 +8154,7 @@ package body Prj.Nmsc is
             Src_Id      : Source_Id;
             Source_Name : File_Name_Type;
 
-            procedure Check_Object (Src_Data : Source_Data);
+            procedure Check_Object (Src : Source_Id);
             --  Check if object file name of the current source is already in
             --  hash table Object_File_Names. If it is, report an error. If it
             --  is not, put it there with the file name of the current source.
@@ -8239,12 +8163,12 @@ package body Prj.Nmsc is
             -- Check_Object --
             ------------------
 
-            procedure Check_Object (Src_Data : Source_Data) is
+            procedure Check_Object (Src : Source_Id) is
             begin
-               Source_Name := Object_File_Names.Get (Src_Data.Object);
+               Source_Name := Object_File_Names.Get (Src.Object);
 
                if Source_Name /= No_File then
-                  Error_Msg_File_1 := Src_Data.File;
+                  Error_Msg_File_1 := Src.File;
                   Error_Msg_File_2 := Source_Name;
                   Error_Msg
                     (Project,
@@ -8253,7 +8177,7 @@ package body Prj.Nmsc is
                      No_Location);
 
                else
-                  Object_File_Names.Set (Src_Data.Object, Src_Data.File);
+                  Object_File_Names.Set (Src.Object, Src.File);
                end if;
             end Check_Object;
 
@@ -8266,56 +8190,49 @@ package body Prj.Nmsc is
                Src_Id := Prj.Element (Iter);
                exit when Src_Id = No_Source;
 
-               declare
-                  Src_Data : Source_Data renames
-                               In_Tree.Sources.Table (Src_Id);
-
-               begin
-                  if Src_Data.Compiled and then Src_Data.Object_Exists
-                    and then Is_Extending (Project, Src_Data.Project, In_Tree)
-                  then
-                     if Src_Data.Unit = No_Name then
-                        if Src_Data.Kind = Impl then
-                           Check_Object (Src_Data);
-                        end if;
-
-                     else
-                        case Src_Data.Kind is
-                           when Spec =>
-                              if Src_Data.Other_Part = No_Source then
-                                 Check_Object (Src_Data);
-                              end if;
+               if Src_Id.Compiled and then Src_Id.Object_Exists
+                 and then Is_Extending (Project, Src_Id.Project, In_Tree)
+               then
+                  if Src_Id.Unit = No_Name then
+                     if Src_Id.Kind = Impl then
+                        Check_Object (Src_Id);
+                     end if;
 
-                           when Sep =>
-                              null;
+                  else
+                     case Src_Id.Kind is
+                        when Spec =>
+                           if Src_Id.Other_Part = No_Source then
+                              Check_Object (Src_Id);
+                           end if;
 
-                           when Impl =>
-                              if Src_Data.Other_Part /= No_Source then
-                                 Check_Object (Src_Data);
+                        when Sep =>
+                           null;
 
-                              else
-                                 --  Check if it is a subunit
+                        when Impl =>
+                           if Src_Id.Other_Part /= No_Source then
+                              Check_Object (Src_Id);
 
-                                 declare
-                                    Src_Ind : constant Source_File_Index :=
-                                                Sinput.P.Load_Project_File
-                                                 (Get_Name_String
-                                                   (Src_Data.Path.Name));
-                                 begin
-                                    if Sinput.P.Source_File_Is_Subunit
-                                      (Src_Ind)
-                                    then
-                                       In_Tree.Sources.Table (Src_Id).Kind :=
-                                         Sep;
-                                    else
-                                       Check_Object (Src_Data);
-                                    end if;
-                                 end;
-                              end if;
-                        end case;
-                     end if;
+                           else
+                              --  Check if it is a subunit
+
+                              declare
+                                 Src_Ind : constant Source_File_Index :=
+                                   Sinput.P.Load_Project_File
+                                     (Get_Name_String
+                                          (Src_Id.Path.Name));
+                              begin
+                                 if Sinput.P.Source_File_Is_Subunit
+                                   (Src_Ind)
+                                 then
+                                    Src_Id.Kind := Sep;
+                                 else
+                                    Check_Object (Src_Id);
+                                 end if;
+                              end;
+                           end if;
+                     end case;
                   end if;
-               end;
+               end if;
 
                Next (Iter);
             end loop;
@@ -8716,36 +8633,32 @@ package body Prj.Nmsc is
 
    procedure Remove_Source
      (Id          : Source_Id;
-      Replaced_By : Source_Id;
-      In_Tree     : Project_Tree_Ref)
+      Replaced_By : Source_Id)
    is
-      Src_Data : constant Source_Data := In_Tree.Sources.Table (Id);
       Source   : Source_Id;
 
    begin
       if Current_Verbosity = High then
-         Write_Str ("Removing source #");
-         Write_Line (Id'Img);
+         Write_Str ("Removing source ");
+         Write_Line (Get_Name_String (Id.File));
       end if;
 
       if Replaced_By /= No_Source then
-         In_Tree.Sources.Table (Id).Replaced_By := Replaced_By;
-         In_Tree.Sources.Table (Replaced_By).Declared_In_Interfaces :=
-           In_Tree.Sources.Table (Id).Declared_In_Interfaces;
+         Id.Replaced_By := Replaced_By;
+         Replaced_By.Declared_In_Interfaces := Id.Declared_In_Interfaces;
       end if;
 
-      Source := Src_Data.Language.First_Source;
+      Source := Id.Language.First_Source;
 
       if Source = Id then
-         Src_Data.Language.First_Source := Src_Data.Next_In_Lang;
+         Id.Language.First_Source := Id.Next_In_Lang;
 
       else
-         while In_Tree.Sources.Table (Source).Next_In_Lang /= Id loop
-            Source := In_Tree.Sources.Table (Source).Next_In_Lang;
+         while Source.Next_In_Lang /= Id loop
+            Source := Source.Next_In_Lang;
          end loop;
 
-         In_Tree.Sources.Table (Source).Next_In_Lang :=
-           Src_Data.Next_In_Lang;
+         Source.Next_In_Lang := Id.Next_In_Lang;
       end if;
    end Remove_Source;
 
index 4b26a61f418704de9aaee310d65a64c7030a34d7..ac7fd3c96a2f86613b2ae7c2f5dbbfd25d213425 100644 (file)
@@ -301,7 +301,7 @@ package body Prj.Proc is
             Source1 := Prj.Element (Iter);
             exit when Source1 = No_Source;
 
-            Name := In_Tree.Sources.Table (Source1).Unit;
+            Name := Source1.Unit;
 
             if Name /= No_Name then
                Source2 := Unit_Htable.Get (Name);
@@ -311,8 +311,8 @@ package body Prj.Proc is
 
                else
                   Unit_Htable.Remove (Name);
-                  In_Tree.Sources.Table (Source1).Other_Part := Source2;
-                  In_Tree.Sources.Table (Source2).Other_Part := Source1;
+                  Source1.Other_Part := Source2;
+                  Source2.Other_Part := Source1;
                end if;
             end if;
 
index 8f2491e071a908da3437964c8cdbde6290e4effd..c714a22d2b434f9090ad992d14edf315d1ee2a56 100644 (file)
@@ -153,7 +153,8 @@ package body Prj is
    --  Free memory allocated for Project
 
    procedure Free_List (Languages : in out Language_Ptr);
-   --  Free memory allocated for the list of languages
+   procedure Free_List (Source : in out Source_Id);
+   --  Free memory allocated for the list of languages or sources
 
    procedure Language_Changed (Iter : in out Source_Iterator);
    procedure Project_Changed (Iter : in out Source_Iterator);
@@ -480,7 +481,7 @@ package body Prj is
 
    procedure Next (Iter : in out Source_Iterator) is
    begin
-      Iter.Current := Iter.In_Tree.Sources.Table (Iter.Current).Next_In_Lang;
+      Iter.Current := Iter.Current.Next_In_Lang;
       if Iter.Current = No_Source then
          Iter.Language := Iter.Language.Next;
          Language_Changed (Iter);
@@ -816,6 +817,22 @@ package body Prj is
    -- Free_List --
    ---------------
 
+   procedure Free_List (Source : in out Source_Id) is
+      procedure Unchecked_Free is new Ada.Unchecked_Deallocation
+        (Source_Data, Source_Id);
+      Tmp : Source_Id;
+   begin
+      while Source /= No_Source loop
+         Tmp := Source.Next_In_Lang;
+         Unchecked_Free (Source);
+         Source := Tmp;
+      end loop;
+   end Free_List;
+
+   ---------------
+   -- Free_List --
+   ---------------
+
    procedure Free_List (Languages : in out Language_Ptr) is
       procedure Unchecked_Free is new Ada.Unchecked_Deallocation
         (Language_Data, Language_Ptr);
@@ -823,6 +840,7 @@ package body Prj is
    begin
       while Languages /= null loop
          Tmp := Languages.Next;
+         Free_List (Languages.First_Source);
          Unchecked_Free (Languages);
          Languages := Tmp;
       end loop;
@@ -844,7 +862,6 @@ package body Prj is
          Array_Table.Free (Tree.Arrays);
          Package_Table.Free (Tree.Packages);
          Project_List_Table.Free (Tree.Project_Lists);
-         Source_Data_Table.Free (Tree.Sources);
          Alternate_Language_Table.Free (Tree.Alt_Langs);
          Unit_Table.Free (Tree.Units);
          Units_Htable.Reset (Tree.Units_HT);
@@ -892,7 +909,6 @@ package body Prj is
       Array_Table.Init              (Tree.Arrays);
       Package_Table.Init            (Tree.Packages);
       Project_List_Table.Init       (Tree.Project_Lists);
-      Source_Data_Table.Init        (Tree.Sources);
       Alternate_Language_Table.Init (Tree.Alt_Langs);
       Unit_Table.Init               (Tree.Units);
       Units_Htable.Reset            (Tree.Units_HT);
index 4884b9bd1d6aa2acfb778a031ce44ba80fc184e0..a3bad4a9e8089212a40fcd8bdf3a3f306ea77c74 100644 (file)
@@ -398,9 +398,10 @@ package Prj is
                             Spec_Suffix     => No_File,
                             Body_Suffix     => No_File);
 
-   type Source_Id is new Nat;
+   type Source_Data;
+   type Source_Id is access Source_Data;
 
-   No_Source : constant Source_Id := 0;
+   No_Source : constant Source_Id := null;
 
    type Path_Syntax_Kind is
      (Canonical,
@@ -629,7 +630,7 @@ package Prj is
 
       Language            : Language_Ptr        := No_Language_Index;
       --  Index of the language. This is an index into
-      --  project_tree.languages_data
+      --  Project_Tree.Languages_Data.
 
       Lang_Kind           : Language_Kind         := File_Based;
       --  Kind of the language
@@ -645,8 +646,8 @@ package Prj is
       --  True when source is declared in attribute Interfaces
 
       Alternate_Languages : Alternate_Language_Id := No_Alternate_Language;
-      --  List of languages a header file may also be, in addition of
-      --  language Language_Name.
+      --  List of languages a header file may also be, in addition of language
+      --  Language_Name.
 
       Kind                : Source_Kind           := Spec;
       --  Kind of the source: spec, body or subunit
@@ -775,14 +776,6 @@ package Prj is
                        Naming_Exception       => False,
                        Next_In_Lang           => No_Source);
 
-   package Source_Data_Table is new GNAT.Dynamic_Tables
-     (Table_Component_Type => Source_Data,
-      Table_Index_Type     => Source_Id,
-      Table_Low_Bound      => 1,
-      Table_Initial        => 1000,
-      Table_Increment      => 100);
-   --  The table for the sources
-
    package Source_Paths_Htable is new Simple_HTable
      (Header_Num => Header_Num,
       Element    => Source_Id,
@@ -1452,7 +1445,6 @@ package Prj is
          Packages          : Package_Table.Instance;
          Project_Lists     : Project_List_Table.Instance;
          Projects          : Project_Table.Instance;
-         Sources           : Source_Data_Table.Instance;
          Alt_Langs         : Alternate_Language_Table.Instance;
          Units             : Unit_Table.Instance;
          Units_HT          : Units_Htable.Instance;