Tcl Source Code

Artifact [9f9bdc7117]
Login

Artifact 9f9bdc7117f33fe743f1a5af463d3c7227e67948:

Attachment "wideRound2.patch" to ticket [908375ffff] added by msofer 2004-07-03 04:53:57.
Index: generic/tclExecute.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclExecute.c,v
retrieving revision 1.143
diff -u -r1.143 tclExecute.c
--- generic/tclExecute.c	8 Jun 2004 19:27:01 -0000	1.143
+++ generic/tclExecute.c	2 Jul 2004 21:50:45 -0000
@@ -5857,8 +5857,7 @@
     ClientData clientData;	/* Ignored. */
 {
     Tcl_Obj *valuePtr;
-    long iResult;
-    double d, temp;
+    double d;
 
     /*
      * Pop the argument from the evaluation stack.
@@ -5870,51 +5869,43 @@
 	return TCL_ERROR;
     }
     
-    if (valuePtr->typePtr == &tclIntType) {
-	iResult = valuePtr->internalRep.longValue;
-    } else if (valuePtr->typePtr == &tclWideIntType) {
-	Tcl_WideInt w;
-	TclGetWide(w,valuePtr);
-	PUSH_OBJECT(Tcl_NewWideIntObj(w));
-	goto done;
+    if ((valuePtr->typePtr == &tclIntType) ||
+	    (valuePtr->typePtr == &tclWideIntType)) {
+	PUSH_OBJECT(valuePtr);
     } else {
 	d = valuePtr->internalRep.doubleValue;
 	if (d < 0.0) {
 	    if (d <= (((double) (long) LONG_MIN) - 0.5)) {
-		tooLarge:
-		Tcl_ResetResult(interp);
-		Tcl_AppendToObj(Tcl_GetObjResult(interp),
-		        "integer value too large to represent", -1);
-		Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW",
-			"integer value too large to represent",
-			(char *) NULL);
-		return TCL_ERROR;
-	    }
-	    temp = (long) (d - 0.5);
+		if (d <= Tcl_WideAsDouble(LLONG_MIN)-0.5) {
+		    tooLarge:
+		    Tcl_ResetResult(interp);
+		    Tcl_AppendToObj(Tcl_GetObjResult(interp),
+			    "integer value too large to represent", -1);
+		    Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW",
+			    "integer value too large to represent",
+			    (char *) NULL);
+		    return TCL_ERROR;
+		}
+		PUSH_OBJECT(Tcl_NewWideIntObj(Tcl_DoubleAsWide(d - 0.5)));
+	    } else {
+		PUSH_OBJECT(Tcl_NewLongObj((long) (d - 0.5)));
+	    }			    
 	} else {
 	    if (d >= (((double) LONG_MAX + 0.5))) {
-		goto tooLarge;
+		if (d >= Tcl_WideAsDouble(LLONG_MAX)+0.5) {
+		    goto tooLarge;
+		}
+		PUSH_OBJECT(Tcl_NewWideIntObj(Tcl_DoubleAsWide(d + 0.5)));
+	    } else {
+		PUSH_OBJECT(Tcl_NewLongObj((long) (d + 0.5)));
 	    }
-	    temp = (long) (d + 0.5);
 	}
-	if (IS_NAN(temp) || IS_INF(temp)) {
-	    TclExprFloatError(interp, temp);
-	    return TCL_ERROR;
-	}
-	iResult = (long) temp;
     }
 
     /*
-     * Push a Tcl object with the result.
-     */
-    
-    PUSH_OBJECT(Tcl_NewLongObj(iResult));
-
-    /*
      * Reflect the change to stackTop back in eePtr.
      */
 
-    done:
     TclDecrRefCount(valuePtr);
     return TCL_OK;
 }