DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ B T

⟦4cba71785⟧ TextFile

    Length: 10808 (0x2a38)
    Types: TextFile
    Names: »B«

Derivation

└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
    └─ ⟦77aa8350c⟧ »DATA« 
        └─⟦f794ecd1d⟧ 
            └─⟦24d1ddd49⟧ 
                └─⟦this⟧ 

TextFile

separate (Shared_Code_Generic_Support)
procedure Unchecked_Convert (Source         : Expression;
                             Source_Desc    : Type_Descriptor;
                             Source_Kind    : Expression_Kind;
                             Source_Size    : Integer;  
                             Target_Address : System.Address;
                             Target_Desc    : Type_Descriptor;
                             Target_Kind    : Expression_Kind;
                             Target_Size    : Integer) is
    pragma Routine_Number (Runtime_Ids.Internal);
    pragma Suppress_All;

    S_Size       : Integer;
    T_Size       : Integer;
    T_Expr       : Expression;
    Smaller_Size : Integer;

    function "<="  (R, L : Standard.Target.Integer) return Boolean
        renames Standard.Target."<=";
    function "="   (R, L : Standard.Target.Integer) return Boolean
        renames Standard.Target."=";
    function "mod" (R, L : Standard.Target.Integer)
                   return Standard.Target.Integer renames Standard.Target."mod";

    procedure Sp_Data_Op (Exp_Data : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        Copy_Indirect (Dest   => Target_Address,
                       Source => Exp_Data'Address,
                       Size   => Smaller_Size);
    end Sp_Data_Op;

    procedure Sp_Value_Op (Exp_1 : Expression) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        Cnvt (Target_Address).all := Exp_1;
    end Sp_Value_Op;

    procedure Tp_Data_Op (Exp_Data : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
        Address_Size : Integer;
    begin
        -- This is so we avoid subtracting more than 4 if source happens
        -- to be a record or array of more than four bytes
        if S_Size > Target.Bytes_Per_Integer then  
            Address_Size := Target.Bytes_Per_Integer;
        else
            Address_Size := S_Size;
        end if;

        Copy_Indirect (Dest   => Exp_Data'Address,
                       Source => Get_Scalar_Data_Address
                                    (Source'Address, Address_Size),
                       Size   => Smaller_Size);
    end Tp_Data_Op;

    procedure Tp_Value_Op (Exp_1 : Expression) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        Cnvt (Target_Address).all := Expression (Source);
    end Tp_Value_Op;

    procedure Unconstrained_Array_Op_Raise (Exp_Dope :        Dope_Vector;  
                                            Exp_Data : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        raise Program_Error;
    end Unconstrained_Array_Op_Raise;

    procedure Unconstrained_Record_Op_Raise (Exp_Constrained :        Boolean;  
                                             Exp_Data        : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        raise Program_Error;
    end Unconstrained_Record_Op_Raise;

    procedure Bp_Value_Op (Source_Exp : Expression;  
                           Dest_Exp   : Expression) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        -- Note that when we have Value's, a short pointer is really
        -- a long pointer, and hence we need not special case them.

        -- In case Type_Desc.Size < Bytes_Per_Integer, this will copy
        -- some garbage bytes.  Thats ok!
        Cnvt (Target_Address).all := Source_Exp;
    end Bp_Value_Op;

    procedure Bp_Data_Op (Source_Data : in out Data;  
                          Dest_Data   : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        -- What do we do with short pointers???

        -- if Target.Supports_Segmented_Heaps and then
        --    Type_Desc.Is_Short_Pointer then
        --
        --     Short_Pointer_Ops.Copy_Data_To_Data (Source_Data, Dest_Address);
        --
        --     return;
        -- end if;
        --
        Copy_Indirect (Dest   => Dest_Data'Address,
                       Source => Source_Data'Address,
                       Size   => Smaller_Size);
    end Bp_Data_Op;

    procedure Bp_Value_Data_Op (Source_Exp :        Expression;
                                Dest_Data  : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);  
        Address_Size : Integer;
    begin
        -- if Target.Supports_Segmented_Heaps and then
        --    Type_Desc.Is_Short_Pointer then
        --     Short_Pointer_Ops.Copy_Value_To_Data (Source_Exp, Dest_Address);
        --
        --     return;
        -- end if;
        --

        -- This is so we avoid subtracting more than 4 if source happens
        -- to be a record or array of more than four bytes
        if S_Size > Target.Bytes_Per_Integer then  
            Address_Size := Target.Bytes_Per_Integer;
        else
            Address_Size := S_Size;
        end if;

        Copy_Indirect (Dest   => Dest_Data'Address,
                       Source => Get_Scalar_Data_Address  
                                    (Source_Exp'Address, Address_Size),
                       Size   => Smaller_Size);
    end Bp_Value_Data_Op;

    procedure Bp_Data_Value_Op (Source_Data : in out Data;  
                                Dest_Exp    :        Expression) is
        pragma Routine_Number (Runtime_Ids.Internal);
        Address_Size : Integer;
    begin
        -- if Target.Supports_Segmented_Heaps and then
        --    Type_Desc.Is_Short_Pointer then
        --     Short_Pointer_Ops.Copy_Data_To_Value (Source_Data, Dest_Address);
        --
        --     return;
        -- end if;
        --

        -- This is so we avoid subtracting more than 4 if source happens
        -- to be a record or array of more than four bytes
        if T_Size > Target.Bytes_Per_Integer then  
            Address_Size := Target.Bytes_Per_Integer;
        else
            Address_Size := T_Size;
        end if;

        -- Tricky!  Note that Target must be a Value.  So we put the
        -- result in the PROPER portion of the Target_Address!
        Copy_Indirect (Dest   => Get_Scalar_Data_Address
                                    (Target_Address, Address_Size),
                       Source => Source_Data'Address,
                       Size   => Smaller_Size);
    end Bp_Data_Value_Op;

    procedure Bp_Unconstrained_Array_Op (Source_Dope :        Dope_Vector;
                                         Source_Data : in out Data;
                                         Dest_Dope   :        Dope_Vector;
                                         Dest_Data   : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        raise Program_Error;
    end Bp_Unconstrained_Array_Op;

    procedure Bp_Unconstrained_Record_Op (Source_Constrained :        Boolean;
                                          Source_Data        : in out Data;
                                          Dest_Constrained   :        Boolean;
                                          Dest_Data          : in out Data) is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        raise Program_Error;
    end Bp_Unconstrained_Record_Op;

    -- Sp stands for "Source Private", so this dispatch is used when
    -- the source is private and the target is not.
    procedure Sp_Dispatch is new Unary_Dispatch (Sp_Value_Op,  
                                                 Sp_Data_Op,  
                                                 Unconstrained_Array_Op_Raise,  
                                                 Unconstrained_Record_Op_Raise,  
                                                 Get_Value_Size);

    -- Tp stands for "Target Private", so this dispatch is used when
    -- the target is private and the source is not.
    procedure Tp_Dispatch is new Unary_Dispatch (Tp_Value_Op,  
                                                 Tp_Data_Op,  
                                                 Unconstrained_Array_Op_Raise,  
                                                 Unconstrained_Record_Op_Raise,  
                                                 Get_Value_Size);

    procedure Bp_Dispatch is
       new Two_Kind_Binary_Dispatch (Bp_Value_Op,  
                                     Bp_Data_Op,  
                                     Bp_Value_Data_Op,  
                                     Bp_Data_Value_Op,  
                                     Bp_Unconstrained_Array_Op,  
                                     Bp_Unconstrained_Record_Op,  
                                     Get_Value_Size);
begin  
    if Source_Size = 0 then
        -- Source is private
        S_Size := Get_Value_Size (Source_Desc, Source, Source_Kind);
        if Target_Size = 0 then
            -- Both are private
            T_Expr := Get_Expression (Target_Address, Target_Kind);
            T_Size := Get_Value_Size (Target_Desc, T_Expr, Target_Kind);

            if S_Size <= T_Size then
                Smaller_Size := S_Size;
            else
                Smaller_Size := T_Size;
            end if;

            Bp_Dispatch (Type_Desc_1 => Source_Desc,
                         Exp_1       => Source,
                         Exp_1_Kind  => Source_Kind,
                         Type_Desc_2 => Target_Desc,
                         Exp_2       => T_Expr,
                         Exp_2_Kind  => Target_Kind);
        else
            if S_Size <= Target_Size / 8 then
                Smaller_Size := S_Size;
            else
                Smaller_Size := Target_Size / 8;
            end if;

            Sp_Dispatch (Source_Desc, Source, Source_Kind);
        end if;
    else
        if Target_Size = 0 then
            -- Target is private and source is not
            -- If size is non-zero, then it is size in bits, not bytes, so
            -- we convert to bytes.  If size is not an exact number of bytes,
            -- we set size to include the whole final byte (since it doesn't
            -- hurt us to get our garbage from the source as opposed to the
            -- target).
            S_Size := Source_Size / 8;
            if (Source_Size mod 8) /= 0 then
                S_Size := S_Size + 1;
            end if;

            T_Expr := Get_Expression (Target_Address, Target_Kind);
            T_Size := Get_Value_Size (Target_Desc, T_Expr, Target_Kind);
            if S_Size <= T_Size then
                Smaller_Size := S_Size;
            else
                Smaller_Size := T_Size;
            end if;

            Tp_Dispatch (Target_Desc, T_Expr, Target_Kind);
        else
            raise Program_Error;
        end if;
    end if;
end Unchecked_Convert;
pragma Runtime_Unit (Unit_Number         => Runtime_Ids.Runtime_Compunit,
                     Elab_Routine_Number => Runtime_Ids.Internal);