Prevent local property leaks when an error occurs in the body of a block
commit81e877fccd891234cb5587cc200602658e2e96d4
authorKris Katterjohn <katterjohn@gmail.com>
Fri, 16 Jun 2017 19:19:51 +0000 (16 14:19 -0500)
committerKris Katterjohn <katterjohn@gmail.com>
Fri, 16 Jun 2017 19:19:51 +0000 (16 14:19 -0500)
tree10761c3f0ee48821ea6e55f84add99e9ef55a41e
parentda781a56cc7a1e1d98feb4d1292bc7db025ef602
Prevent local property leaks when an error occurs in the body of a block

Local properties were being leaked when an error occurred inside the
body of a block:

(%i1) block ([f], local (f), f () := foo, error ("d'oh"))$
d'oh
 -- an error. To debug this try: debugmode(true);

(%i2) f ();
(%o2) foo

If the block didn't use local, a superfluous NIL would be left over
in LOCLIST.

This all caused the cleanup of local properties to be one frame
behind.  An error in nested blocks would make it multiple frames
behind if the error was in an inner block.

Now use UNWIND-PROTECT to ensure that MUNLOCAL gets called when
leaving a block.

The test suite runs fine.  As with commits 9387d6 and da781a, I'm not
sure how to add a test for this since we need to cause an error, but
using errcatch prevents the leak.
src/mlisp.lisp