From 5a484df86936621e5bf60c2a78ab5832ed886485 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 18 Mar 2005 15:32:27 +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 46d5b0b..4f1666a 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 42b8448..300feb2 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.39.2.2 2003/07/15 20:51:49 dgp Exp $ + * RCS: @(#) $Id: tclCompCmds.c,v 1.39.2.3 2005/03/18 15:32:29 dgp Exp $ */ #include "tclInt.h" @@ -1526,31 +1526,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) { @@ -1566,7 +1563,6 @@ TclCompileIncrCmd(interp, parsePtr, envPtr) } } else { /* no incr amount given so use 1 */ haveImmValue = 1; - immValue = 1; } /* -- cgit v0.12