Tcl Source Code

Artifact [e6642640a8]
Login

Artifact e6642640a8070d36738eea19d8e01a741f768bfc:

Attachment "bug542588-tcl8.4.patch" to ticket [542588ffff] added by msofer 2002-04-18 21:01:20.
Index: generic/tclExecute.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclExecute.c,v
retrieving revision 1.52
diff -u -r1.52 tclExecute.c
--- generic/tclExecute.c	15 Apr 2002 17:32:18 -0000	1.52
+++ generic/tclExecute.c	18 Apr 2002 12:54:33 -0000
@@ -4569,25 +4569,33 @@
 		operatorStrings[opCode - INST_LOR], "\"", (char *) NULL);
     } else {
 	char *msg = "non-numeric string";
-	if (opndPtr->typePtr != &tclDoubleType) {
+	char *s;
+	int length;
+
+	s = Tcl_GetStringFromObj(opndPtr, &length);
+	if (TclLooksLikeInt(s, length)) {
+	    /*
+	     * If something that looks like an integer appears here, then 
+	     * it *must* be a bad octal or too large to represent [Bug  542588].
+	     */
+
+	    if (TclCheckBadOctal(NULL, Tcl_GetString(opndPtr))) {
+		msg = "invalid octal number";
+	    } else {
+		msg = "integer value too large to represent";
+		Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW",
+		    "integer value too large to represent", (char *) NULL);
+	    }
+	} else {
 	    /*
 	     * See if the operand can be interpreted as a double in order to
 	     * improve the error message.
 	     */
 
-	    char *s = TclGetString(opndPtr);
 	    double d;
 
 	    if (Tcl_GetDouble((Tcl_Interp *) NULL, s, &d) == TCL_OK) {
-		/*
-		 * Make sure that what appears to be a double
-		 * (ie 08) isn't really a bad octal
-		 */
-		if (TclCheckBadOctal(NULL, TclGetString(opndPtr))) {
-		    msg = "invalid octal number";
-		} else {
-		    msg = "floating-point value";
-		}
+		msg = "floating-point value";
 	    }
 	}
 	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can't use ",
Index: tests/expr-old.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/expr-old.test,v
retrieving revision 1.13
diff -u -r1.13 expr-old.test
--- tests/expr-old.test	6 Dec 2001 10:59:17 -0000	1.13
+++ tests/expr-old.test	18 Apr 2002 12:54:34 -0000
@@ -934,6 +934,13 @@
     list [catch {expr 78e} msg] $msg
 } {1 {syntax error in expression "78e"}}
 
+# test for [Bug #542588]
+test expr-old-36.11 {ExprLooksLikeInt procedure} {
+    # define a "too large integer"; this one works also for 64bit arith
+    set x 665802003400000000000000
+    list [catch {expr {$x+1}} msg] $msg
+} {1 {can't use integer value too large to represent as operand of "+"}}
+
 if {[info commands testexprlong] == {}} {
     puts "This application hasn't been compiled with the \"testexprlong\""
     puts "command, so I can't test Tcl_ExprLong etc."