summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCompExpr.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c
index 82554b8..bb5fc32 100644
--- a/generic/tclCompExpr.c
+++ b/generic/tclCompExpr.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclCompExpr.c,v 1.63 2007/07/10 16:57:34 dgp Exp $
+ * RCS: @(#) $Id: tclCompExpr.c,v 1.64 2007/07/10 17:07:37 dgp Exp $
*/
#include "tclInt.h"
@@ -444,7 +444,7 @@ ParseExpr(
* of only about 1 kibyte, and is large enough
* for most expressions to parse with no need
* for array growth and reallocation. */
- int nodesUsed = 0, numLiterals = 0, numFuncs = 0; /* Counters */
+ int nodesUsed = 0; /* Number of OpNodes filled. */
int code = TCL_OK; /* Return code */
int scanned = 0; /* Capture number of byte scanned by
* parsing routines. */
@@ -478,7 +478,7 @@ ParseExpr(
const int limit = 25; /* Portions of the error message are
* constructed out of substrings of the
* original expression. In order to keep the
- * error message readable, we impost this limit
+ * error message readable, we impose this limit
* on the substring size we extract. */
if (numBytes < 0) {
@@ -562,11 +562,24 @@ ParseExpr(
code = TCL_ERROR;
continue;
case BAREWORD:
+ /*
+ * Most barewords in an expression are a syntax error.
+ * The exceptions are that when a bareword is followed by
+ * an open paren, it might be a function call, and when the
+ * bareword is a legal literal boolean value, we accept that
+ * as well.
+ */
if (start[scanned+TclParseAllWhiteSpace(
start+scanned, numBytes-scanned)] == '(') {
lexeme = FUNCTION;
+
+ /*
+ * When we compile the expression we'll need the function
+ * name, and there's no place in the parse tree to store
+ * it, so we keep a separate list of all the function
+ * names we've parsed in the order we found them.
+ */
Tcl_ListObjAppendElement(NULL, funcList, literal);
- numFuncs++;
} else {
int b;
if (Tcl_GetBooleanFromObj(NULL, literal, &b) == TCL_OK) {
@@ -621,7 +634,6 @@ ParseExpr(
case NUMBER:
case BOOLEAN:
Tcl_ListObjAppendElement(NULL, litList, literal);
- numLiterals++;
break;
default:
break;
@@ -767,7 +779,6 @@ ParseExpr(
&& tokenPtr[1].type == TCL_TOKEN_TEXT
&& TclWordKnownAtCompileTime(tokenPtr, literal)) {
Tcl_ListObjAppendElement(NULL, litList, literal);
- numLiterals++;
lastWas = OT_LITERAL;
parsePtr->numTokens = wordIndex;
break;