|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 8075 (0x1f8b)
Types: TextFile
Names: »B«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
└─⟦77aa8350c⟧ »DATA«
└─⟦f794ecd1d⟧
└─⟦24d1ddd49⟧
└─⟦this⟧
with Storage_Management;
separate (Shared_Code_Generic_Support)
function Allocate (Type_Desc : Type_Descriptor;
Collection_Or_Heap : System.Address;
Is_Collection : Boolean;
Is_Homogenous : Boolean;
Initial_Value : Expression;
Initial_Value_Kind : Expression_Kind;
Master_Layer : System.Address;
Activation_Group : System.Address) return System.Address is
pragma Routine_Number (Runtime_Ids.Internal);
pragma Suppress_All;
Alloc : System.Address;
function Allocate_Storage
(Collection_Or_Heap : System.Address;
Is_Collection : Boolean;
Units : Integer) return System.Address is
pragma Routine_Number (Runtime_Ids.Internal);
begin
if Is_Collection then
return Storage_Management.Allocate_Fixed_Cell
(Units => Standard.Integer (Units),
Collection => Collection_Or_Heap);
else
--[] Segmented heap
[statement]
end if;
end Allocate_Storage;
-- pragma Inline (Allocate_Storage);
procedure Allocate_Uninitialized
(Type_Desc : Type_Descriptor;
Collection_Or_Heap : System.Address;
Is_Collection : Boolean;
Is_Homogenous : Boolean;
Master_Layer : System.Address;
Activation_Group : System.Address) is
pragma Routine_Number (Runtime_Ids.Internal);
With_Tasks : constant Boolean := Master_Layer /= System.Address_Zero;
begin
if Type_Desc.Allocate_Subp.Code = Nil_Code then
Alloc := Allocate_Storage (Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Units => Type_Desc.Size);
if Type_Desc.Init_Subp.Code /= Nil_Code then
if With_Tasks then
Asm_Interface.Init_With_Tasks
(Type_Desc.Init_Subp, Type_Desc, Alloc,
Master_Layer, Activation_Group);
else
Asm_Interface.Init (Type_Desc.Init_Subp, Type_Desc, Alloc);
end if;
end if;
else
if With_Tasks then
Alloc := Asm_Interface.Allocate_With_Tasks
(Subp => Type_Desc.Allocate_Subp,
Type_Desc => Type_Desc,
Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Is_Homogeneous => Is_Homogenous,
Master_Layer => Master_Layer,
Activation_Group => Activation_Group);
else
Alloc := Asm_Interface.Allocate
(Subp => Type_Desc.Allocate_Subp,
Type_Desc => Type_Desc,
Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Is_Homogeneous => Is_Homogenous);
end if;
end if;
end Allocate_Uninitialized;
-- pragma Inline (Allocate_Uninitialized);
procedure Data_Op (Exp_Data : in out Data) is
pragma Routine_Number (Runtime_Ids.Internal);
Value_Size : constant Integer := Exp_Data'Length;
-- Note that this way of getting the value size is cheaper
-- than calling Get_Value_Size since we already have Exp_
-- Data.
begin
Alloc := Allocate_Storage
(Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Units => Value_Size);
-- Copy
Copy_Indirect (Dest => Alloc,
Source => Exp_Data'Address,
Size => Value_Size);
end Data_Op;
-- pragma Inline (Data_Op);
procedure Value_Op (Exp_1 : Expression) is
pragma Routine_Number (Runtime_Ids.Internal);
begin
Alloc := Allocate_Storage
(Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Units => Type_Desc.Size);
-- Copy
Copy_Indirect (Dest => Alloc,
Source => Get_Scalar_Data_Address
(Exp_1'Address, Type_Desc.Size),
Size => Type_Desc.Size);
end Value_Op;
-- pragma Inline (Value_Op);
procedure Unconstrained_Array_Op (Exp_Dope : Dope_Vector;
Exp_Data : in out Data) is
pragma Routine_Number (Runtime_Ids.Internal);
Dope_Vector_Size : constant Integer :=
Get_Dope_Vector_Size (Type_Desc.Constraints);
-- Note that Dope_Vector_Size =
-- Exp_Dope'Length * Bytes_Per_Dope_Vector_Element
Value_Size : constant Integer := Exp_Data'Length;
-- Note that this way of getting the value size is cheaper
-- than calling Get_Value_Size since we already have Exp_
-- Data.
begin
if Is_Homogenous then
-- Allocate Value_Size only
Alloc := Allocate_Storage (Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Units => Value_Size);
-- Copy data
Copy_Indirect (Dest => Alloc,
Source => Exp_Data'Address,
Size => Value_Size);
else
-- Allocate Value_Size + Dope_Vector_Size (for the Dope_Vector)
Alloc := Allocate_Storage (Collection_Or_Heap => Collection_Or_Heap,
Is_Collection => Is_Collection,
Units => Value_Size + Dope_Vector_Size);
-- Copy dope vector
Copy_Indirect (Dest => Alloc,
Source => Exp_Dope'Address,
Size => Dope_Vector_Size);
-- Copy data
Copy_Indirect (Dest => Alloc + Dope_Vector_Size,
Source => Exp_Data'Address,
Size => Value_Size);
end if;
end Unconstrained_Array_Op;
-- pragma Inline (Unconstrained_Array_Op);
procedure Unconstrained_Record_Op (Exp_Constrained : Boolean;
Exp_Data : in out Data) is
pragma Routine_Number (Runtime_Ids.Internal);
begin
-- Allocation of an unconstrained record yeilds a constrained
-- object
Data_Op (Exp_Data);
end Unconstrained_Record_Op;
-- pragma Inline (Unconstrained_Record_Op);
procedure Dispatch is new Unary_Dispatch (Value_Op,
Data_Op,
Unconstrained_Array_Op,
Unconstrained_Record_Op,
Get_Value_Size);
-- pragma Inline (Dispatch);
begin
if Initial_Value_Kind = Nil_Kind then
Allocate_Uninitialized (Type_Desc, Collection_Or_Heap, Is_Collection,
Is_Homogenous, Master_Layer, Activation_Group);
else
Dispatch (Type_Desc, Initial_Value, Initial_Value_Kind);
end if;
return Alloc;
end Allocate;
pragma Runtime_Unit (Unit_Number => Runtime_Ids.Runtime_Compunit,
Elab_Routine_Number => Runtime_Ids.Internal);