diff options
author | hobbs <hobbs> | 1999-12-04 06:15:40 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 1999-12-04 06:15:40 (GMT) |
commit | 78a6d2f842a7ff7465cd0397481a93c78375096f (patch) | |
tree | c153fe1950b58db095afef4ac9ea58a5e73ebb2a /generic/tclParseExpr.c | |
parent | 5239dbb3790e4d48cee4dad3455a529b18b6c30b (diff) | |
download | tcl-78a6d2f842a7ff7465cd0397481a93c78375096f.zip tcl-78a6d2f842a7ff7465cd0397481a93c78375096f.tar.gz tcl-78a6d2f842a7ff7465cd0397481a93c78375096f.tar.bz2 |
* tests/expr-old.test:
* tests/parseExpr.test:
* tests/string.test:
* generic/tclGet.c:
* generic/tclInt.h:
* generic/tclObj.c:
* generic/tclParseExpr.c:
* generic/tclUtil.c:
* generic/tclExecute.c: added TclCheckBadOctal routine to enhance
error message checking for when users use invalid octal numbers
(like 08), as well as replumbed the Expr*Funcs with a new
VerifyExprObjType to simplify type handling.
* tests/expr.test:
* generic/tclCompile.c: fixed 'bad code length' error for
'expr + {[incr]}' case, with new test case [Bug: 3736]
and seg fault on 'expr + {[error]}' (different cause) that
was caused by a correct optimization that didn't correctly
track how it was modifying the source string in the opt.
The optimization was removed, which means that:
expr 1 + {[string length abc]}
will be not be compiled inline as before, but this should be
written:
expr {1 + [string length abc]}
which will be compiled inline for speed. This prevents
expr 1 + {[mindless error]}
from seg faulting, and only affects optimizations for
degenerate cases [Bug: 3737]
Diffstat (limited to 'generic/tclParseExpr.c')
-rw-r--r-- | generic/tclParseExpr.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/generic/tclParseExpr.c b/generic/tclParseExpr.c index ced85d7..b9c9d71 100644 --- a/generic/tclParseExpr.c +++ b/generic/tclParseExpr.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: tclParseExpr.c,v 1.5 1999/09/02 16:26:33 hobbs Exp $ + * RCS: @(#) $Id: tclParseExpr.c,v 1.6 1999/12/04 06:15:42 hobbs Exp $ */ #include "tclInt.h" @@ -1521,8 +1521,28 @@ GetLexeme(infoPtr) } if (termPtr != src) { /* - * src was the start of a valid integer. + * src was the start of a valid integer, but was it + * a bad octal? Stopping at a digit would cause that. */ + if (isdigit(UCHAR(*termPtr))) { /* INTL: digit. */ + /* + * We only want to report an error for the number, + * but we may have something like "08+1" + */ + if (interp != NULL) { + while (isdigit(UCHAR(*(++termPtr)))) {} /* INTL: digit. */ + Tcl_ResetResult(interp); + offset = termPtr - src; + c = src[offset]; + src[offset] = 0; + Tcl_AppendResult(interp, "\"", src, + "\" is an invalid octal number", + (char *) NULL); + src[offset] = c; + } + parsePtr->errorType = TCL_PARSE_BAD_NUMBER; + return TCL_ERROR; + } infoPtr->lexeme = LITERAL; infoPtr->start = src; |