{File name LispStkScan.mc Description: DandeLion InterLisp Emulator StkScan Author: Charnley Last modified: Charnley 2-May-84 12:09:41 Created: 2-May-84 11:42:53 } {- - - - - - - - - - - - - - - - - - - - - - - - - - 57 STKSCAN 0 0 \STKSCAN TOS is VAR. NO! -- If TOS is not litatom, punt. Returns 24 bit pointer to cell where VAR is bound. NO! -- Note: must check VAR=NIL, and return pointer to NIL's value cell. (Free variable lookup algorithm fails if given NIL, at least on Dorado.) If variable was bound on stack, the value returned will be a pointer into stack space. If variable is not bound, value will be pointer to top level value cell. - - - - - - - - - - - - - - - - - - - - - - - - - -} @STKSCAN: opcode[57'b], {free var lookup on tos, which is an atom} { look up variable in current frame; fill in binding pointer (chaining not implemented) This code assumes that NAMETABLE is contiguous in real memory {either it is on the stack, or within a code header which is non-page crossing} on Entry: c1 uTOS restored to TOS if fault uTOSH restored to TOSH if fault PV current frame (point to PV region) Q {uChain} (odd) stack pointer to variable to be looked up (Pv + ib + 1) rhTT, TT virtual address of name table (usually function header) L3 caller's return link at[L3, 10, fvCaller] also used with fvfixup after fault uses during subroutine: rhRx, Rx real address of name table PV frame extension pointers (point to PV region)(travel up alinks) uPV save local PV TOS used uChain TOSH{chain} rhTOSH nRhS {set once at odd time; must be left}{*} used with TOSH{chain} uName TOSH{name} ← [UvCL + T/2 {- UvCL.nlocals} + UvCL.fvaroffset] ntSize, offset, L0, L1 on Return: c1 preserves S, PV, PC, L2, uTOS, uTOSH smashes TOS, TOSH {but preserved in uTOS, uTOSH} rhTT, TT virtual address of free value @(chain) filled in binding pointer L1 binding type{fvStack, fvGlobal} Dispatch pending on Fault: TOS ← uTOS, TOSH ← uTOSH, PV ← uPV } { INITIALIZE: uTOS ← TOS uTOSH ← TOSH TOSH ← name {from TOS} uChain ← 0 uPV ← PV L3 ← L3.StkScan enter at newFrame: c1 } uPV ← PV, L3 ← L3.StkScan, c1; uTOSH ← TOSH, c2; uTOS ← TOSH ← TOS, c3; uChain ← 0, c1; , c2; CALL[newFrame], c3; Q ← rhTT, CANCELBR[$, 0F], c1, at[L3.StkScan, 10, fvCaller]; TOSH ← Q, c2; TOS ← TT, GOTO[evalEND], c3; PV ← uPV, GOTO[NoFixes], c3, at[L3.StkScan, 10, fvfixup]; { E N D }