3 type Phase_Enum
is (None_Phase
, FE_Init_Phase
, FE_Phase
);
5 type Message_State
is (No_Messages
, Some_Messages
);
7 type Module_List_Array
is array (Phase_Enum
, Message_State
) of List
;
9 type Private_Module_Factory
is limited record
10 Module_Lists
: Module_List_Array
;
13 type Element_Array
is array (Positive range <>) of Module_Factory_Ptr
;
15 type Hash_Table
is array (Positive range <>) of aliased Module_Factory_Ptr
;
17 type Heap_Data_Rec
(Table_Last
: Positive) is limited record
18 Number_Of_Elements
: Positive;
19 Table
: Hash_Table
(1 .. Table_Last
);
22 type Heap_Data_Ptr
is access Heap_Data_Rec
;
24 type Table
is limited record
28 function All_Elements
(M
: Table
) return Element_Array
is
29 Result
: Element_Array
(1 .. Natural (M
.Data
.Number_Of_Elements
));
32 for H
in M
.Data
.Table
'Range loop
34 Result
(Last
) := M
.Data
.Table
(H
);
39 The_Factories
: Table
;
41 subtype Language_Array
is Element_Array
;
42 type Language_Array_Ptr
is access Language_Array
;
43 All_Languages
: Language_Array_Ptr
:= null;
47 if All_Languages
= null then
48 All_Languages
:= new Language_Array
'(All_Elements (The_Factories));
52 function Is_Empty (L : List) return Boolean is
54 return Link_Constant (L.Next) = L'Unchecked_Access;
57 function First (L : List) return Linkable_Ptr is
59 return Links_Type (L.Next.all).Container.all'Access;
63 Check_New_Dependences : Boolean := False;
66 for Lang_Index in All_Languages'Range loop
67 for Has_Messages in Message_State loop
70 All_Languages (Lang_Index).Priv.Module_Lists
71 (FE_Init_Phase, Has_Messages);
73 while not Is_Empty (L) loop
75 Module_In_Init_State : constant Module_Ptr :=
76 Module_Ptr (First (L));
77 Pin_Dependence : Pinned (Module_In_Init_State);
79 Check_New_Dependences := True;
85 exit when not Check_New_Dependences;