From f7bd42abc0c6952dae468911161f6dd0dc01f913 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 18 Mar 2005 15:31:13 +0000 Subject: * generic/tclCompCmds.c (TclCompileIncrCmd): Corrected checks for immediate operand usage to permit leading space and sign characters. [Bug 1165671] --- ChangeLog | 6 ++++++ generic/tclCompCmds.c | 26 +++++++++++--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9f25e3f..2e0c663 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-03-17 Don Porter + + * generic/tclCompCmds.c (TclCompileIncrCmd): Corrected checks + for immediate operand usage to permit leading space and sign + characters. [Bug 1165671] + 2005-03-15 Vince Darley * generic/tclFileName.c: diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c index ae934bd..a1be28d 100644 --- a/generic/tclCompCmds.c +++ b/generic/tclCompCmds.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: tclCompCmds.c,v 1.60 2005/03/10 22:15:34 msofer Exp $ + * RCS: @(#) $Id: tclCompCmds.c,v 1.61 2005/03/18 15:31:44 dgp Exp $ */ #include "tclInt.h" @@ -1365,31 +1365,28 @@ TclCompileIncrCmd(interp, parsePtr, envPtr) */ haveImmValue = 0; - immValue = 0; + immValue = 1; if (parsePtr->numWords == 3) { incrTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1); if (incrTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) { CONST char *word = incrTokenPtr[1].start; int numBytes = incrTokenPtr[1].size; - int validLength = TclParseInteger(word, numBytes); - long n; /* * Note there is a danger that modifying the string could have - * undesirable side effects. In this case, TclLooksLikeInt and - * TclGetLong do not have any dependencies on shared strings so we - * should be safe. + * undesirable side effects. In this case, TclLooksLikeInt has + * no dependencies on shared strings so we should be safe. */ - if (validLength == numBytes) { + if (TclLooksLikeInt(word, numBytes)) { int code; - Tcl_Obj *longObj = Tcl_NewStringObj(word, numBytes); - Tcl_IncrRefCount(longObj); - code = Tcl_GetLongFromObj(NULL, longObj, &n); - Tcl_DecrRefCount(longObj); - if ((code == TCL_OK) && (-127 <= n) && (n <= 127)) { + Tcl_Obj *intObj = Tcl_NewStringObj(word, numBytes); + Tcl_IncrRefCount(intObj); + code = Tcl_GetIntFromObj(NULL, intObj, &immValue); + Tcl_DecrRefCount(intObj); + if ((code == TCL_OK) + && (-127 <= immValue) && (immValue <= 127)) { haveImmValue = 1; - immValue = n; } } if (!haveImmValue) { @@ -1402,7 +1399,6 @@ TclCompileIncrCmd(interp, parsePtr, envPtr) } } else { /* no incr amount given so use 1 */ haveImmValue = 1; - immValue = 1; } /* -- cgit v0.12