(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP")
(FILECREATED "13-Oct-88 09:45:34" {ERIS}<LISPCORE>PATCHES>SOURCES>AR-10888-PATCH.\;1 3618
|changes| |to:| (FNS \\UNWIND.UFN)
(VARS AR-10888-PATCHCOMS)
|previous| |date:| "12-Oct-88 16:30:51" {ERIS}<LISPCORE>PATCHES>LIBRARY>AR-10888-PATCH.\;1)
(PRETTYCOMPRINT AR-10888-PATCHCOMS)
(RPAQQ AR-10888-PATCHCOMS (
(* |;;|
"Patch file AR-10888-PATCH. Contains fixes for the AR(s) (10888).")
(ADDVARS (*FEATURES* :AR-10888))
(FILES TEDITWINDOW)
(FNS \\UNWIND.UFN)))
(* |;;| "Patch file AR-10888-PATCH. Contains fixes for the AR(s) (10888).")
(ADDTOVAR *FEATURES* :AR-10888)
(FILESLOAD TEDITWINDOW)
(DEFINEQ
(\\UNWIND.UFN
(LAMBDA (N.KEEP) (* \; "Edited 27-Sep-88 11:48 by jds")
(* |;;;| "UFN for UNWIND opcode. The two bytes are the desired stack depth to unwind to and a flag indicating whether to push TOS when done.")
(LET* ((CALLER (\\MYALINK))
(NEXT (|fetch| (FX NEXTBLOCK) |of| CALLER))
(SP NEXT)
(DESIREDSP (IPLUS (IDIFFERENCE (|fetch| (FX FIRSTPVAR) |of| CALLER)
WORDSPERCELL)
(UNFOLD (LRSH N.KEEP 8)
WORDSPERCELL)))
(PUSHP (NEQ (LOGAND N.KEEP 255)
0))
OLDTOS)
(COND
(PUSHP (* \; "Save old top of stack")
(SETQ OLDTOS (\\GETBASEPTR (STACKADDBASE (IDIFFERENCE SP WORDSPERCELL))
0))))
(UNINTERRUPTABLY
(|while| (GREATERP (|add| SP (IMINUS WORDSPERCELL))
DESIREDSP) |bind| (PVAR0BASE ← (STACKADDBASE
(|fetch| (FX FIRSTPVAR)
|of| CALLER)))
|when| (|fetch| BINDMARKP |of| (STACKADDBASE SP))
|do| (* \;
"Unbind stuff. Bind mark says how many pvars were bound, and gives the offset of the last of them")
(LET ((LASTPVAR (|fetch| BINDLASTPVAR |of| (STACKADDBASE SP))))
(|to| (|fetch| BINDNVALUES |of| (STACKADDBASE SP))
|do| (\\PUTBASE PVAR0BASE LASTPVAR 65535)
(SETQ LASTPVAR (IDIFFERENCE LASTPVAR WORDSPERCELL)))))
(|replace| (FX NEXTBLOCK) |of| CALLER |with| (|add| DESIREDSP
WORDSPERCELL))
(\\MAKEFREEBLOCK DESIREDSP (IDIFFERENCE NEXT DESIREDSP))
(COND
((NOT PUSHP) (* \;
"Keep return value from being pushed")
(|replace| (FX NOPUSH) |of| CALLER |with| T)))
(* |;;| "Now explicitly slow return to caller, since we have violated the fast return assumptions by blowing away stack between here and there")
(\\SLOWRETURN)
OLDTOS))))
)
(DECLARE\: DONTCOPY
(FILEMAP (NIL (883 3595 (\\UNWIND.UFN 893 . 3593)))))
STOP