|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13312 (0x3400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Branch_Utilities, seg_00461a
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Lrm_Utilities;
with Statement_Traversal;
with Bounds_Utilities;
with Lrm_Renames;
use Lrm_Renames;
package body Branch_Utilities is
type Depth_Data is
record
Current_Depth : Natural;
Max_Depth : Natural;
end record;
procedure Find_Pre_Op (Program_Element : Ada.Element;
State : in out Boolean;
Control : in out Ada.Traversal_Control) is
begin
case Kind (Program_Element) is
when Not_A_Branch =>
Control := Ada.Continue;
when others =>
State := True;
Control := Ada.Terminate_Immediately;
Control := Ada.Continue;
end case;
end Find_Pre_Op;
procedure Find_Post_Op (Program_Element : Ada.Element;
State : in out Boolean;
Control : in out Ada.Traversal_Control) is
begin
Control := Ada.Continue;
end Find_Post_Op;
procedure Check_For_Branches is new Statement_Traversal
(Boolean, Find_Pre_Op, Find_Post_Op);
procedure Pre_Op (A_Statement : Ada.Statement;
State : in out Depth_Data;
Control : in out Ada.Traversal_Control) is
begin
case Kind (A_Statement) is
when Not_A_Branch =>
null;
when others =>
State.Current_Depth := State.Current_Depth + 1;
end case;
case Kind (A_Statement) is
when Raise_Statement | Return_Statement =>
Control := Ada.Abandon_Siblings;
when others =>
Control := Ada.Continue;
end case;
end Pre_Op;
procedure Post_Op (A_Statement : Ada.Statement;
State : in out Depth_Data;
Control : in out Ada.Traversal_Control) is
begin
case Kind (A_Statement) is
when Not_A_Branch =>
null;
when others =>
if State.Current_Depth > State.Max_Depth then
State.Max_Depth := State.Current_Depth;
end if;
State.Current_Depth := State.Current_Depth - 1;
end case;
case Kind (A_Statement) is
when Raise_Statement | Return_Statement =>
Control := Ada.Abandon_Siblings;
when others =>
Control := Ada.Continue;
end case;
end Post_Op;
procedure Traverse_Statements is
new Statement_Traversal (Depth_Data, Pre_Op, Post_Op);
function Branching_Depth
(For_Subprogram : Ada_Program.Declaration) return Natural is
Data : Depth_Data := (0, 0);
The_Control : Ada.Traversal_Control := Ada.Continue;
begin
Traverse_Statements (For_Subprogram, Data, The_Control);
return Data.Max_Depth;
end Branching_Depth;
function Kind (The_Statement : Ada_Program.Statement) return Branch_Kind is
Static : Boolean;
Upper, Lower : Long_Integer;
Upper_Exp, Lower_Exp : Ada.Element;
begin
case Stmts.Kind (The_Statement) is
when Stmts.A_Case_Statement =>
return Case_Statement;
when Stmts.An_If_Statement =>
return If_Statement;
when Stmts.An_Exit_Statement =>
if not (Ada.Is_Nil (Stmts.Exit_Condition (The_Statement))) then
return Exit_When;
else
return Not_A_Branch;
end if;
when Stmts.A_Loop_Statement =>
case Stmts.Loop_Kind (The_Statement) is
when Stmts.A_While_Loop =>
return While_Loop;
when Stmts.A_For_Loop =>
Bounds_Utilities.Find_Range
(Stmts.For_Loop_Index (The_Statement),
Lower,
Upper,
Static,
Lower_Exp,
Upper_Exp);
if not Static then
return Non_Static_For_Loop;
else
return Not_A_Branch;
end if;
when others =>
return Not_A_Branch;
end case;
when Stmts.A_Select_Statement =>
return Select_Statement;
when Stmts.A_Raise_Statement =>
return Raise_Statement;
when Stmts.A_Return_Statement =>
return Return_Statement;
when Stmts.Not_A_Statement =>
raise Ada.Inappropriate_Program_Element;
when others =>
return Not_A_Branch;
end case;
end Kind;
function No_Branches (In_Statement_List : Ada_Program.Element_Iterator)
return Boolean is
Iter : Ada.Element_Iterator := In_Statement_List;
Found : Boolean := False;
The_Control : Ada.Traversal_Control := Ada.Continue;
begin
while not Ada.Done (Iter) loop
Check_For_Branches (Ada.Value (Iter), Found, The_Control);
if Found then
return False;
end if;
Ada.Next (Iter);
end loop;
return True;
end No_Branches;
function No_Else_Part
(If_Statement : Ada_Program.Statement) return Boolean is
Arms : Ada.Element_Iterator := Stmts.If_Arm_List (If_Statement);
begin
while not Ada.Done (Arms) loop
if Stmts.Is_Else_Arm (Ada.Value (Arms)) then
return False;
end if;
Ada.Next (Arms);
end loop;
return True;
end No_Else_Part;
function Width (Of_Branch_Statement : Ada_Program.Statement)
return Positive is
The_Kind : Branch_Kind := Kind (Of_Branch_Statement);
Arms : Ada.Element_Iterator;
begin
case The_Kind is
when If_Statement =>
Arms := Stmts.If_Arm_List (Of_Branch_Statement);
return Lrm_Utilities.Count (Arms);
when Case_Statement =>
Arms := Stmts.Case_Arms_List (Of_Branch_Statement);
return Lrm_Utilities.Count (Arms);
when While_Loop | Non_Static_For_Loop | Exit_When =>
return 2;
when Select_Statement =>
Arms := Stmts.Select_Alternatives (Of_Branch_Statement);
return Lrm_Utilities.Count (Arms);
when Raise_Statement | Return_Statement =>
return 1;
when Not_A_Branch =>
return 1;
end case;
end Width;
end Branch_Utilities;
nblk1=c
nid=0
hdr6=18
[0x00] rec0=1f rec1=00 rec2=01 rec3=046
[0x01] rec0=00 rec1=00 rec2=0c rec3=00c
[0x02] rec0=1e rec1=00 rec2=02 rec3=020
[0x03] rec0=19 rec1=00 rec2=03 rec3=06a
[0x04] rec0=01 rec1=00 rec2=0b rec3=01c
[0x05] rec0=18 rec1=00 rec2=04 rec3=028
[0x06] rec0=00 rec1=00 rec2=0a rec3=02c
[0x07] rec0=17 rec1=00 rec2=05 rec3=046
[0x08] rec0=1b rec1=00 rec2=06 rec3=006
[0x09] rec0=01 rec1=00 rec2=09 rec3=026
[0x0a] rec0=19 rec1=00 rec2=07 rec3=008
[0x0b] rec0=08 rec1=00 rec2=08 rec3=000
tail 0x217002458815c65c1c6a4 0x42a00088462061e03