|
|
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: 8192 (0x2000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, generic, package Subprogram_Implementation, seg_004e7e
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
package Subprogram_Implementation is
-- Low level mechanisms for subprogram variables. This package provides
-- definitions and operations that, when used in specific stylized calls,
-- will allow user code to implement subprogram types and variables.
type Subprogram_Type is private; -- A class of values
-- based on mode profile
Null_Subprogram : constant Subprogram_Type;
type Mode is (In_Mode, Out_Mode, In_Out_Mode, Return_Mode, No_Mode);
-- Each parameter is of one of these modes. No_Mode is used internally.
subtype Offset is Integer range -2 ** 20 .. 2 ** 20 - 1;
type Mode_Vector is array (Natural range <>) of Mode;
-- Rules for modes:
-- 1. No_Mode may not appear
-- 2. Return_Mode may appear in the last poistion only, if at all.
-- 3. If Return_Mode appears, Out_Mode and In_Out_Mode must not.
type Offset_Vector is array (Natural range <>) of Offset;
function Get (Modes : Mode_Vector; Signature : Long_Integer := 0)
return Subprogram_Type;
-- Must be invoked from within a generic subprogram instantiation whose
-- only parameter is the subprogram to be returned. Modes is the
-- mode profile. Signature is a number associated with the type.
-- It is not interpreted in this package but can be interrogated
-- for use by higher levels.
--
-- The subprogram must not be inside a task (either directly or
-- indirectly). It must also be at package level scope (lex level 1).
Missing_Subprogram : exception;
-- Could not find the subprogram. Probably because the call was not in
-- an instantiation with a single subprogram generic parameter.
Illegal_Modes_Combination : exception;
Subprogram_Is_Inside_Task : exception;
Subprogram_Not_At_Package_Level : exception;
procedure Invoke (Modes : Mode_Vector; Offsets : Offset_Vector);
-- Invoke the subprogram represented by the value in the first position
-- in Offsets. The subsequent positions in Offsets represents
-- the parameters to the subprogram in order and with modes
-- corresponding to the values in Modes. If the last element in
-- Modes is Return_Mode, then the last offset is the offset of a
-- variable of the return parameter type that is local within the
-- invoker.
--
-- For a function, the last position in Offsets is the offset of a local
-- in the caller (of Invoke) that will receive the return value. If
-- a constrained (or non-discriminated) object is to be returned,
-- the local is simply a declaration of the object. If an unconstrained
-- object is to be returned, the local must be declared as:
-- Return_Value : constant Return_Type := Make_Return_Value;
-- where Make_Return_Value is an instantiation of Return_Placeholder,
-- below.
--
-- Offsets'length=Modes'length+1 always.
-- Only the modes of the first 32 parameters will be checked for
-- mode conformity.
--
-- All objects referenced by Offsets must be declared within the caller.
-- An offset value cannot reference an object in an enclosing scope.
--
-- Unusual restrictions or semantics:
-- 1. Takes a moderate amount of time to do the call. In addition
-- to checking the Modes and Offsets vectors, each parameter
-- must be loaded on the stack.
-- 2. Parameters of mode "out" (also "in out") will be copied back
-- regardless of whether they are passed by reference.
-- 3. Cannot be used to call generic subprogram instances. Use
-- a separate skin. This is presently not checked and the result
-- will be undefined (probably a wierd exception).
--
Modes_Offsets_Inconsistent : exception; -- Lengths don't follow rules
Unelaborated_Subprogram :
exception; -- Subprogram context nonexistent
Null_Subprogram_Value : exception;
Offsets_Illegal : exception; -- Outside of frame
Illegal_Subprogram : exception;
-- Offsets first position doesn't reference legal subprogram
Nonmatching_Subprogram_Parameter_Modes : exception;
-- Attempt to call a subprogram whose profile does not match Modes
generic
type T is private;
function Return_Placeholder return T;
-- Unconstrained return variables must be initialized to a call to this
-- function. This allows a "constrained" ada object to receive the
-- "unconstrained" return value from the invoked function.
function Signature (Sub_Type : Subprogram_Type) return Long_Integer;
-- return the Signature value associated with the subprogram type.
private
subtype Parm_Count is Natural range 0 .. 127;
type Subprogram_Type is
record
Val_Word : Long_Integer := 0;
Type_Word : Long_Integer := 0;
Context : Long_Integer := 0;
Modes : Mode_Vector (1 .. 32);
In_Parm_Count : Parm_Count := 0;
Out_Parm_Count : Parm_Count := 0; -- out and in out
Signature : Long_Integer;
end record;
Null_Subprogram : constant Subprogram_Type :=
(0, 0, 0, (1 .. 32 => No_Mode), 0, 0, 0);
end Subprogram_Implementation;
nblk1=7
nid=0
hdr6=e
[0x00] rec0=17 rec1=00 rec2=01 rec3=056
[0x01] rec0=15 rec1=00 rec2=02 rec3=05c
[0x02] rec0=00 rec1=00 rec2=07 rec3=018
[0x03] rec0=12 rec1=00 rec2=03 rec3=00c
[0x04] rec0=12 rec1=00 rec2=04 rec3=040
[0x05] rec0=18 rec1=00 rec2=05 rec3=018
[0x06] rec0=0d rec1=00 rec2=06 rec3=000
tail 0x2150094fc81977fdf12bc 0x42a00088462063203