Trailing-Edge
-
PDP-10 Archives
-
bb-bt99g-bb
-
regal2.c13
There is 1 other file named regal2.c13 in the archive. Click here to see a list.
REP 19/1 ;13C1
!AUTHOR: S.MURPHY/HPW/MD/DCE/SJW/JNG/EGM/EDS/TFV/RVM/CDM/TJK
WIT
!AUTHOR: S.MURPHY/HPW/MD/DCE/SJW/JNG/EGM/EDS/TFV/RVM/CDM/TJK/MEM
REP 24/1 ;13C2
GLOBAL BIND REGALV = #10^24 + 0^18 + #2402; ! Version Date: 19-Jun-84
WIT
GLOBAL BIND REGALV = #10^24 + 0^18 + #2554; ! Version Date: 31-Oct-85
INS 229/1 ;13C3
2554 MEM 31-Oct-85
When a SFN calls a user function, VARCLOBB must be called on all
variables that are passed from the SFN to this user function. Also
if this SFN calls another SFN which contains a function call, then
call VARCLOBB on all the parameters to the function call within
the second SFN.
INS 262/1 ;13C4
%2554% UFNCLOBARGS(1), ! Call VARCLOBB on args to user fncalls in SFN
INS 1/19 ;13C5
GLOBAL ROUTINE UFNCLOBARGS(EXPR)=
!++
! FUNCTIONAL DESCRIPTION:
!
! Recursively walk EXPR. Whenever we come across a non-library fncall
! call, call VARCLOBB on args that are variables. If this function
! is a SFN with the USRFNFLG set, then recursively walk the body of
! that SFN.
!
! FORMAL PARAMETERS:
!
! EXPR Expression node
!
! IMPLICIT INPUTS:
!
! None
!
! IMPLICIT OUTPUTS:
!
! None
!
! ROUTINE VALUE:
!
! None
!
! SIDE EFFECTS:
!
! None
!
!--
BEGIN !New [2554]
MAP BASE EXPR;
CASE .EXPR[OPRCLS] OF SET
!BOOLEAN
BEGIN
UFNCLOBARGS(.EXPR[ARG1PTR]);
UFNCLOBARGS(.EXPR[ARG2PTR]);
END;
!DATAOPR
RETURN;
!RELATIONAL
BEGIN
UFNCLOBARGS(.EXPR[ARG1PTR]);
UFNCLOBARGS(.EXPR[ARG2PTR]);
END;
!FNCALL
BEGIN
REGISTER ARGUMENTLIST AG;
REGISTER BASE ARG;
AG = .EXPR[ARG2PTR];
IF .EXPR[OPERSP] EQL LIBARY
THEN
BEGIN
INCR I FROM 1 TO .AG[ARGCOUNT]
DO
BEGIN
ARG = .AG[.I,ARGNPTR];
IF .ARG[OPRCLS] NEQ DATAOPR
THEN UFNCLOBARGS(.ARG);
END;
END
ELSE
BEGIN
INCR I FROM 1 TO .AG[ARGCOUNT]
DO
BEGIN
ARG = .AG[.I,ARGNPTR];
IF .ARG[OPRCLS] NEQ DATAOPR
THEN UFNCLOBARGS(.ARG)
ELSE IF .ARG[OPERSP] EQL VARIABLE
THEN VARCLOBB(.ARG);
END;
EXPR = .EXPR[ARG1PTR]; !STE FOR FNNAME
IF .EXPR[IDATTRIBUT(SFN)]
THEN
BEGIN
EXPR = .EXPR[IDSFNODE]; !SFN NODE
IF .EXPR[USRFNREF]
THEN
BEGIN
EXPR = .EXPR[SFNEXPR]; !ASMNT NODE
UFNCLOBARGS(.EXPR[RHEXP]); !RHS OF ASMNT
END;
END;
END;
END;
!ARITHMETIC
BEGIN
UFNCLOBARGS(.EXPR[ARG1PTR]);
UFNCLOBARGS(.EXPR[ARG2PTR]);
END;
!TYPECNV
UFNCLOBARGS(.EXPR[ARG2PTR]);
!ARRAYREF
BEGIN
IF .EXPR[ARG2PTR] NEQ 0
THEN UFNCLOBARGS(.EXPR[ARG2PTR]);
END;
!CMNSUB
UFNCLOBARGS(.EXPR[ARG2PTR]);
!NEGNOT
UFNCLOBARGS(.EXPR[ARG2PTR]);
!SPECOP
UFNCLOBARGS(.EXPR[ARG1PTR]);
!FIELDREF
RETURN;
!STORECLS
UFNCLOBARGS(.EXPR[ARG2PTR]);
!REGCONTENTS
RETURN;
!LABOP
RETURN;
!STATEMENT
RETURN;
!IOLSCLS
RETURN;
!INLINFN
BEGIN
UFNCLOBARGS(.EXPR[ARG1PTR]);
IF .EXPR[ARG2PTR] NEQ 0
THEN UFNCLOBARGS(.EXPR[ARG2PTR]);
END;
!SUBSTRING
BEGIN
UFNCLOBARGS(.EXPR[ARG1PTR]); !Upper bound/length
UFNCLOBARGS(.EXPR[ARG2PTR]); !Lower bound
UFNCLOBARGS(.EXPR[ARG4PTR]); !Arrayref/dataopr
END;
!CONCATENATION
BEGIN
LOCAL ARGUMENTLIST AG;
AG = .EXPR[ARG2PTR];
INCR I FROM 2 TO .AG[ARGCOUNT] !Skip first argument
DO UFNCLOBARGS(.AG[.I,ARGNPTR]);
END;
TES;
END; ! of UFNCLOBARGS
INS 57/19 ;13C6
%2554% ! If this is a SFN with user function calls in its body
%2554% ! then call varclobb on the parameters passed to the function
%2554% ! call within the SFN
%2554%
%2554% CNODE = .CNODE[ARG1PTR];
%2554% IF .CNODE[IDATTRIBUT(SFN)]
%2554% THEN
%2554% BEGIN
%2554% CNODE = .CNODE[IDSFNODE]; ! SFN NODE
%2554% IF .CNODE[USRFNREF]
%2554% THEN
%2554% BEGIN
%2554% CNODE = .CNODE[SFNEXPR]; ! ASMNT NODE
%2554% UFNCLOBARGS(.CNODE[RHEXP]); ! RHS OF ASMNT
%2554% END;
%2554% END;
SUM 254394