// Stack manipulation routines // Last change March 15, 1983 12:23 PM by van Melle // Last change December 14, 1982 3:27 PM by van Melle // Deleted obsolete subrs January 7, 1982 11:25 PM by van Melle // Allegro change August 2, 1981 11:15 PM by Beau Sheil // Last change July 19, 1981 7:23 PM by Beau Sheil // Last change July 17, 1981 2:02 PM by Beau Sheil // Last change June 2, 1981 3:56 PM by Beau Sheil // Post Tone change April 5, 1981 4:42 PM by Beau Sheil get "LispBcpl.decl" get "Stats.decl" external [ // declared herein CONTEXTSWITCH // SUBR (index) (obsolete) StackOverflow // Punt Subr (obsolete) CtxtSwitch // internal // declared elsewhere IGetBase; IPutBase SmallUnbox; MkSmallPos RAIDCode; GetStkBlkType // statics @lvNIL ] let CONTEXTSWITCH(lvI) = valof // switches context I and current FXP [ CtxtSwitch(SmallUnbox(lvI)) resultis lvI ] and CtxtSwitch(index) be [ let newCFXP = IGetBase(IFPCurrentFXP+index) test GetStkBlkType(newCFXP) eq FxtnBlock ifso [ IPutBase(IFPCurrentFXP+index, IGetBase(IFPCurrentFXP)) IPutBase(IFPCurrentFXP, newCFXP) ] ifnot RAIDCode ("Attempt to switch to damaged context", MkSmallPos(newCFXP)) ] // StackOverflow ensures at least N free words after current FXP, either by // collapsing free blocks and adding new stack pages, or by moving it // to another part of the stack. If the frame is copied, it will have // its quick return bit turned OFF. ** Now done in Lisp ** and StackOverflow(lvN) = RAIDCode("Stack ovflw punt")