diff options
author | Miguel Sofer <miguel.sofer@gmail.com> | 2001-11-20 19:45:19 (GMT) |
---|---|---|
committer | Miguel Sofer <miguel.sofer@gmail.com> | 2001-11-20 19:45:19 (GMT) |
commit | 6a486a8037e4f19601182dd4ff17bf7ba9d7ce38 (patch) | |
tree | e0a52e0971a8aa816d4be0d839763b106111c61a | |
parent | f65f73ec08266d7dd392834136232173690604a8 (diff) | |
download | tcl-6a486a8037e4f19601182dd4ff17bf7ba9d7ce38.zip tcl-6a486a8037e4f19601182dd4ff17bf7ba9d7ce38.tar.gz tcl-6a486a8037e4f19601182dd4ff17bf7ba9d7ce38.tar.bz2 |
a better variant of the previous-to-last commit (restoring numLevels computations)
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclBasic.c | 20 | ||||
-rw-r--r-- | generic/tclExecute.c | 15 |
3 files changed, 20 insertions, 22 deletions
@@ -1,5 +1,12 @@ 2001-11-20 Miguel Sofer <msofer@users.sourceforge.net> + * generic/tclBasic.c + * generic/tclExecute.c: a better variant of the previous-to-last + commit (restoring numLevels computations). The managing of the + levels now has to be done by the *callers* of TclEvalObjvInternal + +2001-11-20 Miguel Sofer <msofer@users.sourceforge.net> + * generic/tclExecute.c: missing variable declaration under TCL_COMPILE_DEBUG. diff --git a/generic/tclBasic.c b/generic/tclBasic.c index fc5e49e..18acb81 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBasic.c,v 1.38 2001/11/19 17:30:27 msofer Exp $ + * RCS: @(#) $Id: tclBasic.c,v 1.39 2001/11/20 19:45:19 msofer Exp $ */ #include "tclInt.h" @@ -2796,11 +2796,10 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags) * it's probably because of an infinite loop somewhere. */ - if (iPtr->numLevels >= iPtr->maxNestingDepth) { + if (iPtr->numLevels > iPtr->maxNestingDepth) { iPtr->result = "too many nested calls to Tcl_Eval (infinite loop?)"; return TCL_ERROR; } - iPtr->numLevels++; /* * On the Mac, we will never reach the default recursion limit before @@ -2809,7 +2808,6 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags) if (TclpCheckStackSpace() == 0) { /*NOTREACHED*/ - iPtr->numLevels--; iPtr->result = "too many nested calls to Tcl_Eval (infinite loop?)"; return TCL_ERROR; } @@ -2838,7 +2836,9 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags) (char *) NULL); code = TCL_ERROR; } else { + iPtr->numLevels++; code = TclEvalObjvInternal(interp, objc+1, newObjv, command, length, 0); + iPtr->numLevels--; } Tcl_DecrRefCount(newObjv[0]); ckfree((char *) newObjv); @@ -2918,7 +2918,6 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags) } done: - iPtr->numLevels--; return code; } @@ -2962,10 +2961,7 @@ Tcl_EvalObjv(interp, objc, objv, flags) int code = TCL_OK; for (tracePtr = iPtr->tracePtr; tracePtr; tracePtr = tracePtr->nextPtr) { - /* - * EvalObjv will increment numLevels so use "<" rather than "<=" - */ - if (iPtr->numLevels < tracePtr->level) { + if (iPtr->numLevels <= tracePtr->level) { int i; /* * The command will be needed for an execution trace or stack trace @@ -2987,7 +2983,9 @@ Tcl_EvalObjv(interp, objc, objv, flags) */ switch (code) { case TCL_OK: + iPtr->numLevels++; code = TclEvalObjvInternal(interp, objc, objv, cmdString, cmdLen, flags); + iPtr->numLevels--; if (code == TCL_ERROR && cmdLen == 0) goto cmdtraced; break; @@ -3417,8 +3415,10 @@ Tcl_EvalEx(interp, script, numBytes, flags) /* * Execute the command and free the objects for its words. */ - + + iPtr->numLevels++; code = TclEvalObjvInternal(interp, objectsUsed, objv, p, bytesLeft, 0); + iPtr->numLevels--; if (code != TCL_OK) { goto error; } diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 7bb78fa..cb3b5cc 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclExecute.c,v 1.39 2001/11/20 16:52:46 msofer Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.40 2001/11/20 19:45:19 msofer Exp $ */ #include "tclInt.h" @@ -765,13 +765,7 @@ TclExecuteByteCode(interp, codePtr) for (tracePtr = iPtr->tracePtr; tracePtr != NULL; tracePtr = nextTracePtr) { nextTracePtr = tracePtr->nextPtr; - - /* - * TclEvalObjvInternal will increment numLevels - * so use "<" rather than "<=" - */ - - if (iPtr->numLevels < tracePtr->level) { + if (iPtr->numLevels <= tracePtr->level) { /* * Traces will be called: get command string */ @@ -795,15 +789,12 @@ TclExecuteByteCode(interp, codePtr) preservedStack = stackPtr; /* - * Finally, let TclEvalObjvInternal handle the command. As it - * will increase the numLevels, decrease them here to compensate. + * Finally, let TclEvalObjvInternal handle the command. */ - iPtr->numLevels--; DECACHE_STACK_INFO(); result = TclEvalObjvInternal(interp, objc, objv, bytes, length, 0); CACHE_STACK_INFO(); - iPtr->numLevels++; /* * If the old stack is going to be released, it is |