[net.emacs] Emacs #264: error in progn doesn't unbind variables : Fix

thomas%UTAH-GR@utah-cs@sri-unix.UUCP (08/23/83)

From:  Spencer W. Thomas  <thomas%UTAH-GR@utah-cs>

Description:
	In Emacs #264, if an error occurs within a progn, variables
	which were rebound by the progn do not have their previous
	values restored.  The problem is that VnameArg returns
	immediately if err is set, so the local variables are not
	unbound.

Repeat-By:
	(progn foo 
	       (setq foo "foo")
	       (error-occurred (progn foo 
	       			      (setq foo "bar")
				      (error-message "garbage")))
	       (message foo)
	)
	prints "bar".  Or, even better
	ESC-ESC (progn foo (setq foo "foo") (error-message "error"))
	binds foo globally!
		
Fix:
	In mlisp.c (ProgN()), change:
*** old
--- mlisp.c	Tue Aug 23 03:45:07 1983
***************
*** 241,243
  ProgN () {
!     int     rv = 0;
      if (EI.FuncName == 0)

--- 241,243 -----
  ProgN () {
!     int     rv = 0, saverr;
      if (EI.FuncName == 0)
***************
*** 251,252
  	rv = ExecCode (EI.ArgN, EI.ArgMax);
  	for (i = 1; v = VnameArg (i); i++) {

--- 251,254 -----
  	rv = ExecCode (EI.ArgN, EI.ArgMax);
+ 	saverr = err;
+ 	err = 0;
  	for (i = 1; v = VnameArg (i); i++) {
***************
*** 259,260
  	}
      }

--- 261,263 -----
  	}
+ 	err = saverr || err;
      }