Module Scope = Begin Require 'bliss.req'; !I. GENERAL: ! ! 1. THIS ROUTINE DOES A CLEANUP AT THE END OF ! A BLOCK. ! !II. SPECIFIC: ! ! 1. * ! ! A. DO ALL THE FOLLOWING FOR EACH OF THE HASH ! TABLE ENTRIES. ! ! 1. GET THE THREAD FROM THE HASH TABLE ! ENTRY. ! ! 2. FOR EACH SYMBOL WHOSE LEVEL IS THE ! SAME AS THE CURRENT BLOCK LEVEL: ! ! A. CHANGE THE LINK OF THE NAME ! TABLE ENTRY TO POINT AT WHAT ! THE SYMBOL TABLE ENTRY POINTS ! AT. ! ! B. CHANGE THE HASH TABLE THREAD ! TO THE VALUE OF THE THREAD ! OF THE SYMBOL TABLE ENTRY. ! ! C. NOW ADD THE SYMBOL TABLE ! ENTRY TO A PURGED LIST. THE ! EXTERNAL VARIABLE 'PURGED' ! CONTAINS THE LINK OF THE LAST ! ENTRY PURGED. SO WE MAKE THIS ! ENTRY POINT THE LAST ENTRY ! PURGED, AND MAKE 'PURGED' ! POINT TO THIS NEWLY PURGED ! ENTRY. THUS, PURGED ENTRIES ! ARE LINKED THROUGH THEIR ! THREAD FIELDS. ! ! B. FINALLY, DECREMENT THE BLOCKLEVEL. Global Routine LowerScope : Novalue = Begin Local NEXTSTE : Ref ST, S : Ref ST; ! loop for each hash chain Incr I From 0 To HTSIZE-1 Do Begin ! loop for each entry on the hash chain which is at this ! block level S = .HT_THREAD[.I]; While .S Neqa 0 And .S[st_scope] Eql .level_block Do Begin ! unbind the symbol and place it on the purge list Block[.S[st_name],nt_symb] = .S[st_prev]; HT_THREAD[.I] = NEXTSTE = .S[st_next]; S[st_next] = .PURGED; PURGED = .S; ! remove any use and change lists for variables If ISSTVAR(S) And .S[st_var_chg_list] Neqa 0 Then Begin FreeList(.S[st_var_chg_list]); FreeList(.S[st_var_use_list]); S[st_var_chg_list] = 0; S[st_var_use_list] = 0 End; S = .NEXTSTE End End; level_block = .level_block - 1 End; Global Routine RaiseScope : Novalue = Begin level_block = .level_block + 1 End; End Eludom