Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Dec 2009 21:46:33 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r201283 - head/bin/sh
Message-ID:  <200912302146.nBULkXnq072543@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Wed Dec 30 21:46:33 2009
New Revision: 201283
URL: http://svn.freebsd.org/changeset/base/201283

Log:
  sh: Ensure funcnest is decremented if there was an error in the function.
  
  This will be important when things like 'command eval f' will be possible.
  Currently, the funcnest = 0 assignment in RESET (called when returning to
  the top level after an error in interactive mode) is really sufficient.

Modified:
  head/bin/sh/eval.c

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Wed Dec 30 21:35:34 2009	(r201282)
+++ head/bin/sh/eval.c	Wed Dec 30 21:46:33 2009	(r201283)
@@ -792,20 +792,20 @@ evalcommand(union node *cmd, int flags, 
 			unreffunc(cmdentry.u.func);
 			poplocalvars();
 			localvars = savelocalvars;
+			funcnest--;
 			handler = savehandler;
 			longjmp(handler->loc, 1);
 		}
 		handler = &jmploc;
+		funcnest++;
 		INTON;
 		for (sp = varlist.list ; sp ; sp = sp->next)
 			mklocal(sp->text);
-		funcnest++;
 		exitstatus = oexitstatus;
 		if (flags & EV_TESTED)
 			evaltree(getfuncnode(cmdentry.u.func), EV_TESTED);
 		else
 			evaltree(getfuncnode(cmdentry.u.func), 0);
-		funcnest--;
 		INTOFF;
 		unreffunc(cmdentry.u.func);
 		poplocalvars();
@@ -813,6 +813,7 @@ evalcommand(union node *cmd, int flags, 
 		freeparam(&shellparam);
 		shellparam = saveparam;
 		handler = savehandler;
+		funcnest--;
 		popredir();
 		INTON;
 		if (evalskip == SKIPFUNC) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912302146.nBULkXnq072543>