Copyright (C) 1994, Digital Equipment Corp.
MODULE M3AST_SM_Walk EXPORTS M3AST_SM_F;
IMPORT AST, M3AST_AS, M3AST_AS_F;
IMPORT AST_WalkRep, AST_Iter;
IMPORT SeqM3AST_AS_Actual;
IMPORT M3AST_AS_Iter_rep;
PROCEDURE Walk_NEWCall(n: NEWCall; h: AST_WalkRep.Handle) RAISES ANY=
VAR
m: M3AST_AS.Actual;
iter: SeqM3AST_AS_Actual.Iter;
s: SeqM3AST_AS_Actual.T;
BEGIN
h.Visit(n.as_callexp);
IF n.sm_norm_actual_s = NIL THEN (* not set up yet! *)
s := n.as_param_s;
ELSE
s := n.sm_norm_actual_s;
END;
iter := SeqM3AST_AS_Actual.NewIter(s);
WHILE SeqM3AST_AS_Actual.Next(iter, m) DO h.Visit(m); END;
END Walk_NEWCall;
TYPE
Call_iter = AST_Iter.T OBJECT
n: NEWCall;
iter0: SeqM3AST_AS_Actual.Iter;
norm := FALSE;
OVERRIDES
next := Call_next;
END;
PROCEDURE NewIter_NEWCall(n: NEWCall): AST_Iter.T RAISES {}=
VAR
s: SeqM3AST_AS_Actual.T;
BEGIN
WITH iter = NEW(Call_iter, n := n) DO
IF n.sm_norm_actual_s = NIL THEN (* not set up yet! *)
s := n.as_param_s;
ELSE
s := n.sm_norm_actual_s;
iter.norm := TRUE;
END;
iter.iter0 := SeqM3AST_AS_Actual.NewIter(s);
RETURN iter;
END;
END NewIter_NEWCall;
PROCEDURE Call_next(iter: Call_iter; VAR r: AST.NODE): BOOLEAN RAISES {}=
VAR
node0: M3AST_AS.Actual;
BEGIN
LOOP
CASE iter.slot OF
| 0 =>
r := iter.n.as_callexp;
EXIT;
| 1 =>
IF SeqM3AST_AS_Actual.Next(iter.iter0, node0) THEN
r := node0;
RETURN TRUE;
END;
ELSE
RETURN FALSE;
END;
INC(iter.slot);
END;
INC(iter.slot);
RETURN TRUE;
END Call_next;
******************************************************************
PROCEDURE Update_NEWCall(n: NEWCall; iter: AST_Iter.T; nn: AST.NODE)
RAISES {}=
VAR
narrow_iter:= NARROW(iter, Call_iter);
BEGIN
LOOP
CASE iter.slot OF <*NOWARN*>
0 =>
n.as_callexp := nn;
RETURN ;
1 =>
IF NOT SeqM3AST_AS_Actual.Exhausted(narrow_iter.iter0) THEN
IF narrow_iter.norm THEN
SeqM3AST_AS_Actual.Update(n.sm_norm_actual_s,
narrow_iter.iter0, nn);
ELSE
SeqM3AST_AS_Actual.Update(n.as_param_s, narrow_iter.iter0, nn);
END; (* if
RETURN ;
END;
END;
INC(iter.slot);
END;
END Update_NEWCall;
*****************************************************************************)
BEGIN
END M3AST_SM_Walk.