MODULE****************************************************************** 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*>M3AST_SM_Walk EXPORTSM3AST_SM_F ; IMPORT AST, M3AST_AS, M3AST_AS_F; IMPORT AST_WalkRep, AST_Iter; IMPORT SeqM3AST_AS_Actual; IMPORT M3AST_AS_Iter_rep; PROCEDUREWalk_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; PROCEDURENewIter_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; PROCEDURECall_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;
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.