*DECK             SAVESV
USETEXT   TSOURCE 
USETEXT   TCEXECQ 
USETEXT   TSYMCNS 
USETEXT   TCOM37Q 
USETEXT   TCOM78Q 
USETEXT   TC7DECS 
PROC SAVESV((I));  # SAVE STACK VALUES #
BEGIN #SAVES LOCAL (NON-VALU) WORD-SIZE VALUES# 
*CALL COMEX 
    ITEM I; #INDEX OF TRIAD CAUSING SAVE#                                JANDRE 
    ITEM J,K,L,M,N;                                                      JANDRE 
    XREF PROC CLSS; 
    XREF PROC DMPTRD; 
    XREF PROC ERROR;
    XREF FUNC GTRSP;
    XREF PROC ICFGEN; 
    XDEF PROC SVICFP; 
    XDEF PROC SVSTIX; 
    DEF  ASLONGAS  #FOR M=M WHILE#; 
CONTROL EJECT;
    PROC SVICFP ((I));                                                   NOV04
    BEGIN 
                                                                         NOV04
#----------------------------------------------------------------------# NOV04
#                                                                      # NOV04
#   S V I C F P                                                        # NOV04
#                                                                      # NOV04
#   SAVE ICF POINTER IF NECESSARY.                                     # NOV04
#                                                                      # NOV04
#   I = TRIAD INDEX PASSED BY CALLING ROUTINE.                         # NOV04
#                                                                      # NOV04
#----------------------------------------------------------------------# NOV04
                                                                         NOV04
    ITEM I            I;           # TRIAD INDEX FROM CALLER           # NOV04
    ITEM J            I;           # LOCAL TEMP                        # NOV04
                                                                         NOV04
    J=MEMR[I];
    IF J LS 0 OR AC$S[I] EQ S"LS" OR AC$S[I] EQ S"EQ" THEN
         BEGIN
         IF NOT(SAVD[I] OR KFLG[I]) THEN
              BEGIN 
              ICFGEN(QICFOP"SAVE",0,J); 
              MEMR[I]=ICFPTR; 
              SVDEAD (I);                                                NOV04
              END # NOT SAVD# 
         END #J LS 0 #
    END 
                                                                         JANDRE 
                                                                         JANDRE 
                                                                         JANDRE 
CONTROL EJECT;                                                           NOV04
PROC SVSTIX(A); #SAVE STRUCTURE INDICES#
    BEGIN #OBJX SETTING IS SIDE-EFFECT# 
    ITEM A; #STRUCTURE TRIAD INDEX# 
    CLSS(A);
    IF WXSG[STRUC] THEN SVICFP(WINX); 
    IF FXSG[STRUC] THEN 
         BEGIN
         SVICFP(FBDX);
         SVICFP(NBDX);
         END
    IF FYSG[STRUC] THEN SVICFP(FBDY); 
    END 
CONTROL EJECT;                                                           NOV04
      PROC SVDEAD ((X));                                                 NOV04
      BEGIN                                                              NOV04
                                                                         NOV04
#----------------------------------------------------------------------# NOV04
#                                                                      # NOV04
#     S V D E A D                                                      # NOV04
#                                                                      # NOV04
#     STACK ICF POINTER IN DEADLIST AND SET TRIAD FIELDS FOR ICF       # NOV04
#     SAVE INSTRUCTION.                                                # NOV04
#                                                                      # NOV04
#     X = TRIAD INDEX PASSED FROM CALLING ROUTINE.                     # NOV04
#                                                                      # NOV04
#----------------------------------------------------------------------# NOV04
                                                                         NOV04
      ITEM X            I;         # TRIAD INDEX FROM CALLER           # NOV04
      ITEM Y            I;         # LOCAL TEMP                        # NOV04
                                                                         NOV04
      Y = GTRSP (1);               # GET SPACE FOR DEADLIST ENTRY      # NOV04
      SICF[Y] = ICFPTR;            # STACK ICFPTR IN DEADLIST          # NOV04
      SNXT[Y] = DVSP;              # SET LINK TO PRECEDING ENTRY       # NOV04
      DVSP = Y;                    # UPDATE DEADLIST POINTER           # NOV04
                                                                         NOV04
      SAVD[X] = TRUE;              # SET SAVD                          # NOV04
      TVLK[X] = -Y;                # FLAG LOCALLY SAVD VALU            # NOV04
      END                                                                NOV04
CONTROL EJECT;                                                           JANDRE 
  
    J=STKC[I]; #STACK PTR#
    IF J EQ 0 THEN
         BEGIN
         # ERROR(18) #
         RETURN;
         END
    K=OOAR[J]; #NUMBER OF STACK ENTRIES#
    IF K LQ 0 THEN
         RETURN;                               #DON"T DO IT AGAIN      #
      OOAR[J] = -K;          #PREVENT REDUNDANT SAVES#
    FOR L=K STEP -1 UNTIL 1 DO
         BEGIN
         M=OOAR[J+L]; 
$BEGIN                                                                   JANDRE 
         DMPTRD(M); 
$END                                                                     JANDRE 
         IF OPTR[M] EQ QILOP"PLST" THEN        #SAVE PREVIOUS OPERANDS #
              BEGIN  #PARM LIST#               #IF NOT SCALARS         #
              ASLONGAS OPTR[M] EQ QILOP"PLST" DO
                   BEGIN
                   IF MEMR[ROPD[M]] LS 0                                 NOV04
                   THEN                                                  NOV04
                     BEGIN                                               NOV04
                     SVICFP (ROPD[M]);                                   NOV04
                     END                                                 NOV04
                   ELSE                                                  NOV04
                     BEGIN                                               NOV04
                     IF INDX[ROPD[M]] LS 0   # EVALUATED PRIM OF PLST +# NOV04
                       AND (AC$S[LOPD[M]] EQ S"GR"     # INTERVENING   # NOV04
                         OR OPTR[LOPD[M]] NQ S"PRIM")  # LONGSTRING    # NOV04
                     THEN                                                NOV04
                       BEGIN                                             NOV04
                       ICFGEN (QICFOP"SAVE",0,INDX[ROPD[M]]);            NOV04
                       INDX[ROPD[M]] = ICFPTR;         # REQUIRES SAVE # NOV04
                       SVDEAD (ROPD[M]);                                 NOV04
                       END                                               NOV04
                     END                                                 NOV04
                   M = LOPD[M];                #SCAN ALL PARMS IN LIST #
                   END
              IF MEMR[M] LS 0 THEN             #GET LAST PARAMETER     #
                   SVICFP(M); 
              TEST L; 
              END  #PARM LIST#
         IF KLSS[M] EQ S"SINK" THEN 
              BEGIN #LEFT SIDE OPERAND=PRIM,SUBS,FUNI#
              SVSTIX(M);
              TEST L; 
              END #KLSS EQ SINK#
         N=MEMR[M]; 
         IF N LS 0 THEN 
              BEGIN #SUFFICIENT TO SAVE MEMR# 
              SVICFP(M);
              TEST L; 
              END #N .LS 0# 
         #MEMR GR 0#
         IF KLSS[M] EQ S"SOURCE" THEN 
              BEGIN  #OPERAND REPRESENTS A VALU OR VALU LIST# 
              IF OPTR[M] EQ QILOP"PRIM" THEN
                   BEGIN #EVALUATED PRIMITIVE#
                   #MEMR GQ 0 - SAVE ANY COMPUTED INDEX#
                   N=INDX[M]; 
                   IF N LS 0 THEN 
                        BEGIN 
                        ICFGEN(QICFOP"SAVE",0,N); 
                        INDX[M]=ICFPTR; 
                        SVDEAD (M);                                      NOV04
                        END #N LS 0 # 
                   TEST L;
                   END #OPTR EQ PRIM# 
              IF OPTR[M] EQ QILOP"FLST" THEN
                   BEGIN #BIT,BYTE,BITY SUBS HAS A FUNCTION CALL# 
                   SVICFP(LOPD[M]); 
                   SVICFP(ROPD[M]); 
                   TEST L;
                   END #FLST# 
              END #KLSS EQ SOURCE#
         END
END 
TERM
