diff options
author | Miguel Sofer <miguel.sofer@gmail.com> | 2010-08-18 15:44:09 (GMT) |
---|---|---|
committer | Miguel Sofer <miguel.sofer@gmail.com> | 2010-08-18 15:44:09 (GMT) |
commit | 096e06e4b8606abecd8fe11c9919df4f35cf4d52 (patch) | |
tree | f997dd6e04e669fc5c94627f3ab580c39c22fc71 /generic/tclCmdAH.c | |
parent | 8288b47f5e7647e90d8499bf5e45099b1651aa62 (diff) | |
download | tcl-096e06e4b8606abecd8fe11c9919df4f35cf4d52.zip tcl-096e06e4b8606abecd8fe11c9919df4f35cf4d52.tar.gz tcl-096e06e4b8606abecd8fe11c9919df4f35cf4d52.tar.bz2 |
* generic/tclBasic.c: Redesign of [tailcall] to
* generic/tclCmdAH.c: (a) fix #3047235
* generic/tclCompile.h: (b) enable fix for #3046594
* generic/tclExecute.c: (c) enable recursive tailcalls
* generic/tclInt.h:
* generic/tclNamesp.c:
* tests/tailcall.test:
Diffstat (limited to 'generic/tclCmdAH.c')
-rw-r--r-- | generic/tclCmdAH.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 6456bd5..e8a249f 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdAH.c,v 1.124 2010/03/05 14:34:03 dkf Exp $ + * RCS: @(#) $Id: tclCmdAH.c,v 1.125 2010/08/18 15:44:12 msofer Exp $ */ #include "tclInt.h" @@ -290,13 +290,15 @@ TclNRCatchObjCmd( optionVarNamePtr = objv[3]; } + TclNRAddCallback(interp, CatchObjCmdCallback, INT2PTR(objc), + varNamePtr, optionVarNamePtr, NULL); + TclNRAddCallback(interp, TclNRBlockTailcall, NULL, NULL, NULL, + NULL); + /* * TIP #280. Make invoking context available to caught script. */ - TclNRAddCallback(interp, CatchObjCmdCallback, INT2PTR(objc), - varNamePtr, optionVarNamePtr, NULL); - return TclNREvalObjEx(interp, objv[1], 0, iPtr->cmdFramePtr, 1); } @@ -313,19 +315,6 @@ CatchObjCmdCallback( int rewind = iPtr->execEnvPtr->rewind; /* - * catch has to disable any tailcall - */ - - if (iPtr->varFramePtr->tailcallPtr) { - TclClearTailcall(interp, iPtr->varFramePtr->tailcallPtr); - iPtr->varFramePtr->tailcallPtr = NULL; - result = TCL_ERROR; - Tcl_SetResult(interp,"Tailcall called from within a catch environment", - TCL_STATIC); - } - - - /* * We disable catch in interpreters where the limit has been exceeded. */ |