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

⟦3e3fe3e73⟧ TextFile

    Length: 12628 (0x3154)
    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)
package body Satisfies_Ops is

    pragma Suppress_All;

    -- Check that the two dope vectors satisfy the given check.  Note that
    -- Dope_1 and Dope_2 will always have the same bounds
    function Dopes_Satisfy_Check (Dope_1 : Dope_Vector;  
                                  Dope_2 : Dope_Vector;
                                  Chk    : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        case Chk is
            when Nil_Check =>
                return True;

            when Length_Check =>
                for I in Dope_1'Range loop
                    if Dope_1 (I).Size /= Dope_2 (I).Size then
                        return False;
                    end if;
                end loop;

                return True;

            when Subtype_Check =>
                return Dope_1 = Dope_2;
        end case;
    end Dopes_Satisfy_Check;


    function Dopes_Satisfy_Check (Dope        : Dope_Vector;  
                                  Constraints : Constraint_Descriptor;  
                                  Chk         : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);

        package Dv_Subtype is new Establish_Dope_Vector_Subtype
                                     (Get_Dope_Vector_Size (Constraints));

        Constraints_Dope_Ref : constant Dv_Subtype.Dope_Ref :=
           Dv_Subtype.Cnvt (Get_Dope_Vector_Address (Constraints));
        Constraints_Dope     : Dv_Subtype.Actual_Dope
            renames Constraints_Dope_Ref.all;
    begin
        return Dopes_Satisfy_Check (Dope_1 => Dope,  
                                    Dope_2 => Constraints_Dope,
                                    Chk    => Chk);
    end Dopes_Satisfy_Check;


    function Dopes_Satisfy_Check (Dope_Vector_Address : System.Address;  
                                  Constraints : Constraint_Descriptor;  
                                  Chk : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);

        package Dv_Subtype is new Establish_Dope_Vector_Subtype
                                     (Get_Dope_Vector_Size (Constraints));

        Dope_Ref             : constant Dv_Subtype.Dope_Ref :=
           Dv_Subtype.Cnvt (Dope_Vector_Address);
        Dope                 : Dv_Subtype.Actual_Dope  
            renames Dope_Ref.all;
        Constraints_Dope_Ref : constant Dv_Subtype.Dope_Ref :=
           Dv_Subtype.Cnvt (Get_Dope_Vector_Address (Constraints));
        Constraints_Dope     : Dv_Subtype.Actual_Dope
            renames Constraints_Dope_Ref.all;
    begin
        return Dopes_Satisfy_Check (Dope_1 => Dope,  
                                    Dope_2 => Constraints_Dope,
                                    Chk    => Chk);
    end Dopes_Satisfy_Check;


    -- Normalize Exp by sign extension (thus the unused bytes in the
    -- Expression get sign extended, and we can convert it to an
    -- integer).
    function Normalize (Exp         : Expression;  
                        Constraints : Constraint_Descriptor;
                        Size        : Integer) return Expression is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        -- Special case an Exp that does not need sign extension.
        if Size = Target.Bytes_Per_Integer then
            return Exp;
        end if;

        declare
            package Data_Subtype is new Establish_Data_Subtype (Size);
            Data_Ref : constant Data_Subtype.Data_Ref :=
               Data_Subtype.Cnvt (Get_Scalar_Data_Address  
                                     (Exp'Address, Size));
        begin
            return Data_To_Expression (Data_Ref.all, Constraints);
        end;
    end Normalize;



    -- Since access types may be constrained, we have the following
    -- three situations to consider:
    --
    --    type Array_Type is array (Integer range <>) of Integer;
    --    type Record_Type (D : Boolean) is
    --        record
    --            X : Integer;
    --        end record;
    --
    --    type    Access_Array              is access Array_Type;
    --    subtype Constrained_Access_Array  is Access_Array (1 .. 5);
    --    type    Access_Record             is access Record_Type;
    --    subtype Constrained_Access_Record is Access_Record (False);
    --
    -- We distinguish between "Normal" access types, and "Constrained"
    -- access types which get their constraints by applying a const-
    -- raint to an access type.  Thus, in the above, we have:
    --
    -- Normal access                : Access_Array, Access_Record
    -- Constrained access to array  : Constrained_Access_Array
    -- Constrained access to record : Constrained_Access_Record
    --
    -- In the case of the two "Constrained" access types, we need to
    -- do constraint checks.
    --
    -- When the Type_Kind is Accesses, we can distinguish between
    -- the above cases as follows:
    --
    --    Dope_Vector_Address (i.e. Constraint_1) is 0 and
    --    Dscrmt_Record_Satisfies_Subp (i.e. Constraint_2) is nil =>
    --          Normal access
    --
    --    Dope_Vector_Address /= 0 =>
    --          Constrained access to array
    --
    --    Dscrmt_Record_Satisfies_Subp is non-nil =>
    --          Constrained access to record
    --
    -- Now for the constraint information:
    --
    --    Normal access                : no constraint information
    --    Constrained access to array  : Constraints as in Constrained_
    --                                   Arrays.
    --    Constrained access to record : Constraints as in Constrained_
    --                                   Records.

    function Satisfies_Accesses (Type_Desc   : Type_Descriptor;
                                 Exp         : Expression;
                                 Constraints : Constraint_Descriptor;
                                 Chk         : Check_Kind) return Boolean is
        pragma Routine_Number (N => Runtime_Ids.Internal);
    begin
        if Get_Dope_Vector_Address (Constraints) /= System.Address_Zero then
            -- Designated type is an array type and the collection is
            -- heterogeneous.  Hence, Exp points at a (Dv,Data) pair.
            -- So the address of the dope vector for Exp is pointed to
            -- by Exp.
            return Dopes_Satisfy_Check
                      (Dope_Vector_Address => System.Address (Exp),
                       Constraints         => Constraints,
                       Chk                 => Chk);
        else
            declare
                Satisfies_Subp : constant Subprogram_Variable :=
                   Get_Dscrmt_Record_Satisfies_Subp (Constraints);
            begin
                if Satisfies_Subp.Code /= Nil_Code then
                    -- Designated type is a discriminated record.  We will
                    -- pretend that the Exp_Kind is Allocator so that the
                    -- Satisfies_Subp will know that Exp points to the data.
                    return Asm_Interface.Dscrmt_Record_Satisfies
                              (Subp      => Satisfies_Subp,
                               Type_Desc => Type_Desc,
                               Exp       => Exp,
                               Exp_Kind  => Allocator);
                else
                    -- Collection is homogeneous
                    return True;
                end if;
            end;
        end if;
    end Satisfies_Accesses;


    -- Exported subprograms follow


    function Satisfies_Value (Type_Desc   : Type_Descriptor;
                              Exp         : Expression;
                              Constraints : Constraint_Descriptor;
                              Type_Kind   : Formal_Type_Kind;
                              Size        : Integer;
                              Chk         : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        if Chk = Nil_Check then
            return True;
        end if;

        if Type_Kind = Accesses then
            return Satisfies_Accesses (Type_Desc, Exp, Constraints, Chk);
        end if;

        -- Must be Scalars
        declare
            Normalized_Exp : Expression;
        begin
            Normalized_Exp := Normalize (Exp, Constraints, Size);
            return Integer (System.To_Integer
                               (System.Address (Normalized_Exp))) in
                   Get_Scalar_Lower_Bound (Constraints) ..
                      Get_Scalar_Upper_Bound (Constraints);
        end;
    end Satisfies_Value;


    function Satisfies_Data  
                (Type_Desc   : Type_Descriptor;
                 Exp_Data    : Data;  
                 Constraints : Constraint_Descriptor;
                 Type_Kind   : Formal_Type_Kind;
                 Size        : Integer;
                 Chk         : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin  
        if Chk = Nil_Check then
            return True;
        end if;

        case Type_Kind is
            when Scalars | Accesses =>
                return Satisfies_Value (Type_Desc, Data_To_Expression
                                                      (Exp_Data, Constraints),  
                                        Constraints, Type_Kind, Size, Chk);
            when Long_Scalars =>
                return Cnvt (Exp_Data'Address).all in
                          Get_Long_Scalar_Lower_Bound (Constraints) ..
                             Get_Long_Scalar_Upper_Bound (Constraints);
            when Constrained_Arrays =>
                -- Can only do a length check
                return Exp_Data'Length = Size;
            when Unconstrained_Arrays =>
                -- Impossible
                raise Program_Error;
            when Simple_Records =>
                -- Trivially true
                return True;
            when Constrained_Records |  
                 Unconstrained_Records =>
                declare
                    Satisfies_Subp   : constant Subprogram_Variable :=
                       Get_Dscrmt_Record_Satisfies_Subp (Constraints);
                    Exp_Data_Address : constant System.Address      :=
                       Exp_Data'Address;
                begin
                    if Satisfies_Subp.Code /= Nil_Code then
                        -- Designated type is a discriminated record.  We
                        -- will pretend that the Exp_Kind is Allocator so
                        -- that the Satisfies_Subp will know that Exp points
                        -- to the data.
                        --[] Does not code with the following
                        -- return Asm_Interface.Dscrmt_Record_Satisfies
                        --           (Subp     => Satisfies_Subp,
                        --            Exp      => Expression (Exp_Data'Address),
                        --            Exp_Kind => Allocator);
                        return Asm_Interface.Dscrmt_Record_Satisfies
                                  (Subp      => Satisfies_Subp,
                                   Type_Desc => Type_Desc,
                                   Exp       => Expression (Exp_Data_Address),
                                   Exp_Kind  => Allocator);
                    end if;

                    -- The satisfies subprogram did not exist.  This can
                    -- happen for Unconstrained_Records  when the Constr-
                    -- aints are from the type descriptor.
                    return True;
                end;

            when Tasks =>
                -- Trivially True
                return True;
        end case;
    end Satisfies_Data;


    function Satisfies_Unconstrained_Array  
                (Exp_Dope    : Dope_Vector;
                 Constraints : Constraint_Descriptor;
                 Chk         : Check_Kind) return Boolean is
        pragma Routine_Number (Runtime_Ids.Internal);
    begin
        if Chk = Nil_Check then
            return True;
        end if;

        if Get_Dope_Vector_Address (Constraints) /= System.Address_Zero then
            return Dopes_Satisfy_Check (Dope        => Exp_Dope,  
                                        Constraints => Constraints,
                                        Chk         => Chk);
        else
            return True;
        end if;
    end Satisfies_Unconstrained_Array;

end Satisfies_Ops;
pragma Runtime_Unit (Unit_Number         => Runtime_Ids.Runtime_Compunit,
                     Elab_Routine_Number => Runtime_Ids.Internal);