! File: TNLOW.BLI ! Module TNLOW = Begin ! ! THIS MODULE CONTAINS ROUTINES RELATING TO TEMPORARY ! NAMES THAT ARE USED BY OTHER PARTS OF THE COMPILER. ! Require 'Bliss'; ! allocate a tempname representative Global Routine TNREP(TN : Ref GT) = Begin Local T : Ref TNREPR; T = GETSPACE(SZ_TNREP); T[tnr_ptr] = .TN; T[itm_rlink] = .T; T[itm_llink] = .T; Return .T End; ! release a list of tempname representatives Global Routine RELTNREPLST(LST : Ref TNREPR) : Novalue = Begin Until EMPTY(.LST) Do RELEASESPACE(DELINK(.LST[itm_rlink]),SZ_TNREP) End; ! allocate a temporary name Global Routine GETTN = Begin Local T : Ref GT; T = GETSPACE(SZ_TEMPNAME); T[gt_type] = T_TEMPNAME; T[tn_code] = BOUND_NONE; T[tn_request] = BIND_NONE; T[tn_depth] = -1; ! note: unsigned value T[tn_lon_fu] = ETERNITY; T[tn_fon_fu] = ETERNITY; LINK(TNREP(.T),TNCHAIN); Return .T End; Global Routine RELALLTNS : Novalue = Begin Macro RELEASESTK(STK) = Decr I From .STK[stk_max] To 0 Do RELTNREPLST(STK[stk_item(.I)]); RELEASESPACE(.STK,STKSIZE+2) %; Local L : Ref TNREPR; ! release all TN's attached to registers Decr I From 5 To 0 Do RELTNREPLST(REGS[.I]); ! release all TN's attached to static temps RELEASESTK(STEMPS); ! release all TN's attached to dynamic temps RELEASESTK(DTEMPS); ! release everything on TNCHAIN Until EMPTY(TNCHAIN) Do Begin L = .TNCHAIN[itm_rlink]; RELEASESPACE(.L[tnr_ptr],SZ_TEMPNAME); RELEASESPACE(DELINK(.L),SZ_TNREP) End; ! unbind all the registers PCREG[gt_reg] = 0; SPREG[gt_reg] = 0; VVREG[gt_reg] = 0; RR0[gt_reg] = 0; RR1[gt_reg] = 0; RR2[gt_reg] = 0; RR3[gt_reg] = 0; RR4[gt_reg] = 0; RR5[gt_reg] = 0 End; End Eludom