[Indigo]<Rosemary>®>Rosemary.DF=>RoseTypesImpl.Mesa
Last Edited by: Spreitzer, July 11, 1985 6:56:25 pm PDT
DIRECTORY BitTwiddling, IO, Rope, RoseTypes;
RoseTypesImpl:
CEDAR
PROGRAM
IMPORTS BitTwiddling, IO, Rope
EXPORTS RoseTypes =
BEGIN OPEN BitTwiddling, RoseTypes;
Error: PUBLIC ERROR [msg: ROPE, data: REF ANY ← NIL] = CODE;
Warning: PUBLIC SIGNAL [msg: ROPE, data: REF ANY ← NIL] = CODE;
Stop: PUBLIC SIGNAL [msg: ROPE, data: REF ANY ← NIL] = CODE;
UpToInt: ARRAY BOOL OF INT = [FALSE: -1, TRUE: 1];
Conforming:
PUBLIC
PROC [t1, t2: NodeType]
RETURNS [c:
BOOL] = {
An:
PROC [nt: NodeType]
RETURNS [flavor:
ATOM, length:
INTEGER] = {
WITH nt
SELECT
FROM
x: AtomNodeType => {flavor ← x.flavor; length ← 1};
x: ArrayNodeType => {flavor ← x.element.flavor; length ← x.length};
ENDCASE => ERROR;
};
c ← An[t1] = An[t2];
};
Equivalent:
PUBLIC
PROC [nt1, nt2: NodeType]
RETURNS [eq:
BOOL] = {
eq ← nt1 = nt2;
IF nt1.procs.Equivalent # NIL AND NOT eq THEN eq ← nt1.procs.Equivalent[nt1, nt2];
IF nt2.procs.Equivalent # NIL AND NOT eq THEN eq ← nt2.procs.Equivalent[nt2, nt1];
};
TransduceNeeded:
PUBLIC
PROC [nt1, nt2: NodeType]
RETURNS [needed:
BOOL] = {
IF NOT Conforming[nt1, nt2] THEN ERROR --you shouldn't even be asking--;
needed ← NOT Equivalent[nt1, nt2];
IF needed AND nt1.simple = nt2.simple THEN ERROR;
};
BothTypes:
PUBLIC
PROC [nt: NodeType]
RETURNS [simple, switch: NodeType] = {
Get:
PROC [get:
PROC [NodeType]
RETURNS [NodeType]]
RETURNS [ont: NodeType] =
{ont ← IF get # NIL THEN get[nt] ELSE NIL};
IF nt.simple
THEN {simple ← nt; switch ← Get[nt.procs.SwitchEquivalent]}
ELSE {switch ← nt; simple ← Get[nt.procs.SimpleEquivalent]};
IF simple # NIL AND switch # NIL AND NOT Conforming[simple, switch] THEN ERROR;
};
SelectorToRope:
PUBLIC
PROC [s: Selector]
RETURNS [r:
ROPE] = {
r ←
WITH s
SELECT
FROM
whole => ".whole",
number => IO.PutFR["[%g]", IO.int[index]],
range =>
SELECT count
FROM
<1 => ERROR,
=1 => IO.PutFR["[%g]", IO.int[first]],
>1 => IO.PutFR["[%g..%g]", IO.int[first], IO.int[first+(count-1)*UpToInt[up]]],
ENDCASE => ERROR,
ENDCASE => ERROR;
};
SlotToPtr:
PUBLIC
PROC [s: Slot, useBryant:
BOOL ←
FALSE]
RETURNS [p: Ptr] =
TRUSTED BEGIN
p ←
IF useBryant
THEN WPField[s.cell.realCellStuff.switchIOAsWP, s.cell.realCellStuff.effectivePorts[s.effectivePortIndex].switch]
ELSE WPField[s.cell.realCellStuff.newIOAsWP, s.cell.realCellStuff.effectivePorts[s.effectivePortIndex].simple];
END;
GetIndex:
PUBLIC
PROC [ports:
REF
ANY, key:
ROPE]
RETURNS [index:
CARDINAL] = {
WITH ports
SELECT
FROM
p: Ports => {
FOR i: PortIndex
IN [0 .. p.length)
DO
IF key.Equal[p[i].name] THEN RETURN [i];
ENDLOOP;
};
ep: EffectivePorts => {
FOR i: EffectivePortIndex
IN [0 .. ep.length)
DO
IF key.Equal[ep[i].name] THEN RETURN [i];
ENDLOOP;
};
ENDCASE => ERROR;
RETURN [notFound];
};
END.