Tcl Source Code

Artifact [8282d60e38]
Login

Artifact 8282d60e3891ee50da7dbee8b13a60f664531eb7:

Attachment "incr.patch" to ticket [728838ffff] added by dkf 2003-04-28 19:39:43.
? unix/dltest.marker
? unix/testout
Index: ChangeLog
===================================================================
RCS file: /cvsroot/tcl/tcl/ChangeLog,v
retrieving revision 1.1551
diff -u -r1.1551 ChangeLog
--- ChangeLog	28 Apr 2003 10:05:14 -0000	1.1551
+++ ChangeLog	28 Apr 2003 12:32:31 -0000
@@ -1,5 +1,15 @@
 2003-04-28  Donal K. Fellows  <[email protected]>
 
+	* generic/tclDictObj.c (DictIncrCmd): Updated to reflect the
+	behaviour with wide increments of the normal [incr] command.
+	* generic/tclInt.decls: Added TclIncrWideVar2 to internal stub
+	table and cleaned up.
+	* tests/incr.test (incr-3.*):
+	* generic/tclVar.c (TclIncrWideVar2, TclPtrIncrWideVar): 
+	* generic/tclExecute.c (TclExecuteByteCode): 
+	* generic/tclCmdIL.c (Tcl_IncrObjCmd): Make [incr] work when
+	trying to increment by wide values.  [Bug 728838]
+
 	* generic/tclCompCmds.c (TclCompileSwitchCmd): Default mode of
 	operation of [switch] is exact matching.  [Bug 727563]
 
Index: generic/tclCmdIL.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclCmdIL.c,v
retrieving revision 1.48
diff -u -r1.48 tclCmdIL.c
--- generic/tclCmdIL.c	16 Apr 2003 23:33:43 -0000	1.48
+++ generic/tclCmdIL.c	28 Apr 2003 12:32:31 -0000
@@ -309,10 +309,12 @@
     Tcl_Obj *CONST objv[];		/* Argument objects. */
 {
     long incrAmount;
+    Tcl_WideInt wideIncrAmount;
     Tcl_Obj *newValuePtr;
+    int isWide;
     
     if ((objc != 2) && (objc != 3)) {
-        Tcl_WrongNumArgs(interp, 1, objv, "varName ?increment?");
+	Tcl_WrongNumArgs(interp, 1, objv, "varName ?increment?");
 	return TCL_ERROR;
     }
 
@@ -322,11 +324,8 @@
     
     if (objc == 2) {
 	incrAmount = 1;
+	isWide = 0;
     } else {
-	if (Tcl_GetLongFromObj(interp, objv[2], &incrAmount) != TCL_OK) {
-	    Tcl_AddErrorInfo(interp, "\n    (reading increment)");
-	    return TCL_ERROR;
-	}
 	/*
 	 * Need to be a bit cautious to ensure that [expr]-like rules
 	 * are enforced for interpretation of wide integers, despite
@@ -334,20 +333,24 @@
 	 */
 	if (objv[2]->typePtr == &tclIntType) {
 	    incrAmount = objv[2]->internalRep.longValue;
+	    isWide = 0;
 	} else if (objv[2]->typePtr == &tclWideIntType) {
-	    TclGetLongFromWide(incrAmount,objv[2]);
+	    wideIncrAmount = objv[2]->internalRep.wideValue;
+	    isWide = 1;
 	} else {
-	    Tcl_WideInt wide;
-
-	    if (Tcl_GetWideIntFromObj(interp, objv[2], &wide) != TCL_OK) {
+	    if (Tcl_GetWideIntFromObj(interp, objv[2],
+		    &wideIncrAmount) != TCL_OK) {
 		Tcl_AddErrorInfo(interp, "\n    (reading increment)");
 		return TCL_ERROR;
 	    }
-	    incrAmount = Tcl_WideAsLong(wide);
-	    if ((wide <= Tcl_LongAsWide(LONG_MAX))
-		    && (wide >= Tcl_LongAsWide(LONG_MIN))) {
+	    if ((wideIncrAmount <= Tcl_LongAsWide(LONG_MAX))
+		    && (wideIncrAmount >= Tcl_LongAsWide(LONG_MIN))) {
+		incrAmount = Tcl_WideAsLong(wideIncrAmount);
 		objv[2]->typePtr = &tclIntType;
 		objv[2]->internalRep.longValue = incrAmount;
+		isWide = 0;
+	    } else {
+		isWide = 1;
 	    }
 	}
     }
@@ -356,8 +359,13 @@
      * Increment the variable's value.
      */
 
-    newValuePtr = TclIncrVar2(interp, objv[1], (Tcl_Obj *) NULL, incrAmount,
-	    TCL_LEAVE_ERR_MSG);
+    if (isWide) {
+	newValuePtr = TclIncrWideVar2(interp, objv[1], (Tcl_Obj *) NULL,
+		wideIncrAmount, TCL_LEAVE_ERR_MSG);
+    } else {
+	newValuePtr = TclIncrVar2(interp, objv[1], (Tcl_Obj *) NULL,
+		incrAmount, TCL_LEAVE_ERR_MSG);
+    }
     if (newValuePtr == NULL) {
 	return TCL_ERROR;
     }
@@ -397,12 +405,12 @@
     Tcl_Obj *CONST objv[];	/* Argument objects. */
 {
     static CONST char *subCmds[] = {
-            "args", "body", "cmdcount", "commands",
-	     "complete", "default", "exists", "functions", "globals",
-	     "hostname", "level", "library", "loaded",
-	     "locals", "nameofexecutable", "patchlevel", "procs",
-	     "script", "sharedlibextension", "tclversion", "vars",
-	     (char *) NULL};
+	    "args", "body", "cmdcount", "commands",
+	    "complete", "default", "exists", "functions", "globals",
+	    "hostname", "level", "library", "loaded",
+	    "locals", "nameofexecutable", "patchlevel", "procs",
+	    "script", "sharedlibextension", "tclversion", "vars",
+	    (char *) NULL};
     enum ISubCmdIdx {
 	    IArgsIdx, IBodyIdx, ICmdCountIdx, ICommandsIdx,
 	    ICompleteIdx, IDefaultIdx, IExistsIdx, IFunctionsIdx, IGlobalsIdx,
@@ -413,8 +421,8 @@
     int index, result;
 
     if (objc < 2) {
-        Tcl_WrongNumArgs(interp, 1, objv, "option ?arg arg ...?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 1, objv, "option ?arg arg ...?");
+	return TCL_ERROR;
     }
     
     result = Tcl_GetIndexFromObj(interp, objv[1], subCmds, "option", 0,
@@ -424,19 +432,19 @@
     }
 
     switch (index) {
-        case IArgsIdx:
+	case IArgsIdx:
 	    result = InfoArgsCmd(clientData, interp, objc, objv);
-            break;
+	    break;
 	case IBodyIdx:
 	    result = InfoBodyCmd(clientData, interp, objc, objv);
 	    break;
 	case ICmdCountIdx:
 	    result = InfoCmdCountCmd(clientData, interp, objc, objv);
 	    break;
-        case ICommandsIdx:
+	case ICommandsIdx:
 	    result = InfoCommandsCmd(clientData, interp, objc, objv);
 	    break;
-        case ICompleteIdx:
+	case ICompleteIdx:
 	    result = InfoCompleteCmd(clientData, interp, objc, objv);
 	    break;
 	case IDefaultIdx:
@@ -448,10 +456,10 @@
 	case IFunctionsIdx:
 	    result = InfoFunctionsCmd(clientData, interp, objc, objv);
 	    break;
-        case IGlobalsIdx:
+	case IGlobalsIdx:
 	    result = InfoGlobalsCmd(clientData, interp, objc, objv);
 	    break;
-        case IHostnameIdx:
+	case IHostnameIdx:
 	    result = InfoHostnameCmd(clientData, interp, objc, objv);
 	    break;
 	case ILevelIdx:
@@ -460,10 +468,10 @@
 	case ILibraryIdx:
 	    result = InfoLibraryCmd(clientData, interp, objc, objv);
 	    break;
-        case ILoadedIdx:
+	case ILoadedIdx:
 	    result = InfoLoadedCmd(clientData, interp, objc, objv);
 	    break;
-        case ILocalsIdx:
+	case ILocalsIdx:
 	    result = InfoLocalsCmd(clientData, interp, objc, objv);
 	    break;
 	case INameOfExecutableIdx:
@@ -472,10 +480,10 @@
 	case IPatchLevelIdx:
 	    result = InfoPatchLevelCmd(clientData, interp, objc, objv);
 	    break;
-        case IProcsIdx:
+	case IProcsIdx:
 	    result = InfoProcsCmd(clientData, interp, objc, objv);
 	    break;
-        case IScriptIdx:
+	case IScriptIdx:
 	    result = InfoScriptCmd(clientData, interp, objc, objv);
 	    break;
 	case ISharedLibExtensionIdx:
@@ -525,16 +533,16 @@
     Tcl_Obj *listObjPtr;
 
     if (objc != 3) {
-        Tcl_WrongNumArgs(interp, 2, objv, "procname");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "procname");
+	return TCL_ERROR;
     }
 
     name = Tcl_GetString(objv[2]);
     procPtr = TclFindProc(iPtr, name);
     if (procPtr == NULL) {
-        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
-                "\"", name, "\" isn't a procedure", (char *) NULL);
-        return TCL_ERROR;
+	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
+		"\"", name, "\" isn't a procedure", (char *) NULL);
+	return TCL_ERROR;
     }
 
     /*
@@ -543,11 +551,11 @@
     
     listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);
     for (localPtr = procPtr->firstLocalPtr;  localPtr != NULL;
-            localPtr = localPtr->nextPtr) {
-        if (TclIsVarArgument(localPtr)) {
-            Tcl_ListObjAppendElement(interp, listObjPtr,
+	    localPtr = localPtr->nextPtr) {
+	if (TclIsVarArgument(localPtr)) {
+	    Tcl_ListObjAppendElement(interp, listObjPtr,
 		    Tcl_NewStringObj(localPtr->name, -1));
-        }
+	}
     }
     Tcl_SetObjResult(interp, listObjPtr);
     return TCL_OK;
@@ -586,16 +594,16 @@
     Tcl_Obj *bodyPtr, *resultPtr;
     
     if (objc != 3) {
-        Tcl_WrongNumArgs(interp, 2, objv, "procname");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "procname");
+	return TCL_ERROR;
     }
 
     name = Tcl_GetString(objv[2]);
     procPtr = TclFindProc(iPtr, name);
     if (procPtr == NULL) {
-        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
+	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
 		"\"", name, "\" isn't a procedure", (char *) NULL);
-        return TCL_ERROR;
+	return TCL_ERROR;
     }
 
     /* 
@@ -652,8 +660,8 @@
     Interp *iPtr = (Interp *) interp;
     
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     Tcl_SetIntObj(Tcl_GetObjResult(interp), iPtr->cmdCount);
@@ -708,7 +716,7 @@
      */
 
     if (objc == 2) {
-        simplePattern = NULL;
+	simplePattern = NULL;
 	nsPtr = currNsPtr;
 	specificNsInPattern = 0;
     } else if (objc == 3) {
@@ -721,18 +729,17 @@
 	 */
 
 	Namespace *dummy1NsPtr, *dummy2NsPtr;
-	
 
 	pattern = Tcl_GetString(objv[2]);
-	TclGetNamespaceForQualName(interp, pattern, (Namespace *) NULL,
-           /*flags*/ 0, &nsPtr, &dummy1NsPtr, &dummy2NsPtr, &simplePattern);
+	TclGetNamespaceForQualName(interp, pattern, (Namespace *) NULL, 0,
+		&nsPtr, &dummy1NsPtr, &dummy2NsPtr, &simplePattern);
 
 	if (nsPtr != NULL) {	/* we successfully found the pattern's ns */
 	    specificNsInPattern = (strcmp(simplePattern, pattern) != 0);
 	}
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
 
     /*
@@ -819,8 +826,8 @@
     Tcl_Obj *CONST objv[];	/* Argument objects. */
 {
     if (objc != 3) {
-        Tcl_WrongNumArgs(interp, 2, objv, "command");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "command");
+	return TCL_ERROR;
     }
 
     if (TclObjCommandComplete(objv[2])) {
@@ -867,8 +874,8 @@
     Tcl_Obj *valueObjPtr;
 
     if (objc != 5) {
-        Tcl_WrongNumArgs(interp, 2, objv, "procname arg varname");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "procname arg varname");
+	return TCL_ERROR;
     }
 
     procName = Tcl_GetString(objv[2]);
@@ -878,37 +885,37 @@
     if (procPtr == NULL) {
 	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
 		"\"", procName, "\" isn't a procedure", (char *) NULL);
-        return TCL_ERROR;
+	return TCL_ERROR;
     }
 
     for (localPtr = procPtr->firstLocalPtr;  localPtr != NULL;
-            localPtr = localPtr->nextPtr) {
-        if (TclIsVarArgument(localPtr)
+	    localPtr = localPtr->nextPtr) {
+	if (TclIsVarArgument(localPtr)
 		&& (strcmp(argName, localPtr->name) == 0)) {
-            if (localPtr->defValuePtr != NULL) {
+	    if (localPtr->defValuePtr != NULL) {
 		valueObjPtr = Tcl_ObjSetVar2(interp, objv[4], NULL,
 			localPtr->defValuePtr, 0);
-                if (valueObjPtr == NULL) {
-                    defStoreError:
+		if (valueObjPtr == NULL) {
+		    defStoreError:
 		    varName = Tcl_GetString(objv[4]);
 		    Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
 	                    "couldn't store default value in variable \"",
 			    varName, "\"", (char *) NULL);
-                    return TCL_ERROR;
-                }
+		    return TCL_ERROR;
+		}
 		Tcl_SetIntObj(Tcl_GetObjResult(interp), 1);
-            } else {
-                Tcl_Obj *nullObjPtr = Tcl_NewObj();
-                valueObjPtr = Tcl_ObjSetVar2(interp, objv[4], NULL,
+	    } else {
+		Tcl_Obj *nullObjPtr = Tcl_NewObj();
+		valueObjPtr = Tcl_ObjSetVar2(interp, objv[4], NULL,
 			nullObjPtr, 0);
-                if (valueObjPtr == NULL) {
-                    Tcl_DecrRefCount(nullObjPtr); /* free unneeded obj */
-                    goto defStoreError;
-                }
+		if (valueObjPtr == NULL) {
+		    Tcl_DecrRefCount(nullObjPtr); /* free unneeded obj */
+		    goto defStoreError;
+		}
 		Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
-            }
-            return TCL_OK;
-        }
+	    }
+	    return TCL_OK;
+	}
     }
 
     Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
@@ -948,16 +955,16 @@
     Var *varPtr;
 
     if (objc != 3) {
-        Tcl_WrongNumArgs(interp, 2, objv, "varName");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "varName");
+	return TCL_ERROR;
     }
 
     varName = Tcl_GetString(objv[2]);
     varPtr = TclVarTraceExists(interp, varName);
     if ((varPtr != NULL) && !TclIsVarUndefined(varPtr)) {
-        Tcl_SetIntObj(Tcl_GetObjResult(interp), 1);
+	Tcl_SetIntObj(Tcl_GetObjResult(interp), 1);
     } else {
-        Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
+	Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
     }
     return TCL_OK;
 }
@@ -994,12 +1001,12 @@
     Tcl_Obj *listPtr;
 
     if (objc == 2) {
-        pattern = NULL;
+	pattern = NULL;
     } else if (objc == 3) {
-        pattern = Tcl_GetString(objv[2]);
+	pattern = Tcl_GetString(objv[2]);
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
 
     listPtr = Tcl_ListMathFuncs(interp, pattern);
@@ -1046,12 +1053,12 @@
     Tcl_Obj *listPtr;
 
     if (objc == 2) {
-        pattern = NULL;
+	pattern = NULL;
     } else if (objc == 3) {
-        pattern = Tcl_GetString(objv[2]);
+	pattern = Tcl_GetString(objv[2]);
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
 
     /*
@@ -1061,17 +1068,17 @@
     
     listPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);
     for (entryPtr = Tcl_FirstHashEntry(&globalNsPtr->varTable, &search);
-            entryPtr != NULL;
-            entryPtr = Tcl_NextHashEntry(&search)) {
-        varPtr = (Var *) Tcl_GetHashValue(entryPtr);
-        if (TclIsVarUndefined(varPtr)) {
-            continue;
-        }
-        varName = Tcl_GetHashKey(&globalNsPtr->varTable, entryPtr);
-        if ((pattern == NULL) || Tcl_StringMatch(varName, pattern)) {
-            Tcl_ListObjAppendElement(interp, listPtr,
+	    entryPtr != NULL;
+	    entryPtr = Tcl_NextHashEntry(&search)) {
+	varPtr = (Var *) Tcl_GetHashValue(entryPtr);
+	if (TclIsVarUndefined(varPtr)) {
+	    continue;
+	}
+	varName = Tcl_GetHashKey(&globalNsPtr->varTable, entryPtr);
+	if ((pattern == NULL) || Tcl_StringMatch(varName, pattern)) {
+	    Tcl_ListObjAppendElement(interp, listPtr,
 		    Tcl_NewStringObj(varName, -1));
-        }
+	}
     }
     Tcl_SetObjResult(interp, listPtr);
     return TCL_OK;
@@ -1106,8 +1113,8 @@
 {
     CONST char *name;
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     name = Tcl_GetHostName();
@@ -1154,40 +1161,40 @@
     Tcl_Obj *listPtr;
 
     if (objc == 2) {		/* just "info level" */
-        if (iPtr->varFramePtr == NULL) {
-            Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
-        } else {
-            Tcl_SetIntObj(Tcl_GetObjResult(interp), iPtr->varFramePtr->level);
-        }
-        return TCL_OK;
+	if (iPtr->varFramePtr == NULL) {
+	    Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
+	} else {
+	    Tcl_SetIntObj(Tcl_GetObjResult(interp), iPtr->varFramePtr->level);
+	}
+	return TCL_OK;
     } else if (objc == 3) {
-        if (Tcl_GetIntFromObj(interp, objv[2], &level) != TCL_OK) {
-            return TCL_ERROR;
-        }
-        if (level <= 0) {
-            if (iPtr->varFramePtr == NULL) {
-                levelError:
+	if (Tcl_GetIntFromObj(interp, objv[2], &level) != TCL_OK) {
+	    return TCL_ERROR;
+	}
+	if (level <= 0) {
+	    if (iPtr->varFramePtr == NULL) {
+		levelError:
 		Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
 			"bad level \"",
 			Tcl_GetString(objv[2]),
 			"\"", (char *) NULL);
-                return TCL_ERROR;
-            }
-            level += iPtr->varFramePtr->level;
-        }
-        for (framePtr = iPtr->varFramePtr;  framePtr != NULL;
-                framePtr = framePtr->callerVarPtr) {
-            if (framePtr->level == level) {
-                break;
-            }
-        }
-        if (framePtr == NULL) {
-            goto levelError;
-        }
-
-        listPtr = Tcl_NewListObj(framePtr->objc, framePtr->objv);
-        Tcl_SetObjResult(interp, listPtr);
-        return TCL_OK;
+		return TCL_ERROR;
+	    }
+	    level += iPtr->varFramePtr->level;
+	}
+	for (framePtr = iPtr->varFramePtr;  framePtr != NULL;
+		framePtr = framePtr->callerVarPtr) {
+	    if (framePtr->level == level) {
+		break;
+	    }
+	}
+	if (framePtr == NULL) {
+	    goto levelError;
+	}
+
+	listPtr = Tcl_NewListObj(framePtr->objc, framePtr->objv);
+	Tcl_SetObjResult(interp, listPtr);
+	return TCL_OK;
     }
 
     Tcl_WrongNumArgs(interp, 2, objv, "?number?");
@@ -1225,17 +1232,17 @@
     CONST char *libDirName;
 
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     libDirName = Tcl_GetVar(interp, "tcl_library", TCL_GLOBAL_ONLY);
     if (libDirName != NULL) {
-        Tcl_SetStringObj(Tcl_GetObjResult(interp), libDirName, -1);
-        return TCL_OK;
+	Tcl_SetStringObj(Tcl_GetObjResult(interp), libDirName, -1);
+	return TCL_OK;
     }
     Tcl_SetStringObj(Tcl_GetObjResult(interp), 
-            "no library has been specified for Tcl", -1);
+	    "no library has been specified for Tcl", -1);
     return TCL_ERROR;
 }
 
@@ -1271,8 +1278,8 @@
     int result;
 
     if ((objc != 2) && (objc != 3)) {
-        Tcl_WrongNumArgs(interp, 2, objv, "?interp?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?interp?");
+	return TCL_ERROR;
     }
 
     if (objc == 2) {		/* get loaded pkgs in all interpreters */
@@ -1317,16 +1324,16 @@
     Tcl_Obj *listPtr;
 
     if (objc == 2) {
-        pattern = NULL;
+	pattern = NULL;
     } else if (objc == 3) {
-        pattern = Tcl_GetString(objv[2]);
+	pattern = Tcl_GetString(objv[2]);
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
     
     if (iPtr->varFramePtr == NULL || !iPtr->varFramePtr->isProcCallFrame) {
-        return TCL_OK;
+	return TCL_OK;
     }
 
     /*
@@ -1391,7 +1398,7 @@
 		Tcl_ListObjAppendElement(interp, listPtr,
 		        Tcl_NewStringObj(varName, -1));
 	    }
-        }
+	}
 	varPtr++;
 	localPtr = localPtr->nextPtr;
     }
@@ -1399,7 +1406,7 @@
     if (localVarTablePtr != NULL) {
 	for (entryPtr = Tcl_FirstHashEntry(localVarTablePtr, &search);
 	        entryPtr != NULL;
-                entryPtr = Tcl_NextHashEntry(&search)) {
+		entryPtr = Tcl_NextHashEntry(&search)) {
 	    varPtr = (Var *) Tcl_GetHashValue(entryPtr);
 	    if (!TclIsVarUndefined(varPtr)
 		    && (includeLinks || !TclIsVarLink(varPtr))) {
@@ -1445,8 +1452,8 @@
     CONST char *nameOfExecutable;
 
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     nameOfExecutable = Tcl_GetNameOfExecutable();
@@ -1488,15 +1495,15 @@
     CONST char *patchlevel;
 
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     patchlevel = Tcl_GetVar(interp, "tcl_patchLevel",
-            (TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG));
+	    (TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG));
     if (patchlevel != NULL) {
-        Tcl_SetStringObj(Tcl_GetObjResult(interp), patchlevel, -1);
-        return TCL_OK;
+	Tcl_SetStringObj(Tcl_GetObjResult(interp), patchlevel, -1);
+	return TCL_OK;
     }
     return TCL_ERROR;
 }
@@ -1574,8 +1581,8 @@
 	    specificNsInPattern = (strcmp(simplePattern, pattern) != 0);
 	}
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
 
     /*
@@ -1690,8 +1697,8 @@
 {
     Interp *iPtr = (Interp *) interp;
     if ((objc != 2) && (objc != 3)) {
-        Tcl_WrongNumArgs(interp, 2, objv, "?filename?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?filename?");
+	return TCL_ERROR;
     }
 
     if (objc == 3) {
@@ -1702,7 +1709,7 @@
 	Tcl_IncrRefCount(iPtr->scriptFile);
     }
     if (iPtr->scriptFile != NULL) {
-        Tcl_SetObjResult(interp, iPtr->scriptFile);
+	Tcl_SetObjResult(interp, iPtr->scriptFile);
     }
     return TCL_OK;
 }
@@ -1736,8 +1743,8 @@
     Tcl_Obj *CONST objv[];	/* Argument objects. */
 {
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
     
 #ifdef TCL_SHLIB_EXT
@@ -1776,15 +1783,15 @@
     CONST char *version;
 
     if (objc != 2) {
-        Tcl_WrongNumArgs(interp, 2, objv, NULL);
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, NULL);
+	return TCL_ERROR;
     }
 
     version = Tcl_GetVar(interp, "tcl_version",
-        (TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG));
+	(TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG));
     if (version != NULL) {
-        Tcl_SetStringObj(Tcl_GetObjResult(interp), version, -1);
-        return TCL_OK;
+	Tcl_SetStringObj(Tcl_GetObjResult(interp), version, -1);
+	return TCL_OK;
     }
     return TCL_ERROR;
 }
@@ -1839,7 +1846,7 @@
      */
 
     if (objc == 2) {
-        simplePattern = NULL;
+	simplePattern = NULL;
 	nsPtr = currNsPtr;
 	specificNsInPattern = 0;
     } else if (objc == 3) {
@@ -1853,7 +1860,7 @@
 
 	Namespace *dummy1NsPtr, *dummy2NsPtr;
 
-        pattern = Tcl_GetString(objv[2]);
+	pattern = Tcl_GetString(objv[2]);
 	TclGetNamespaceForQualName(interp, pattern, (Namespace *) NULL,
 		/*flags*/ 0, &nsPtr, &dummy1NsPtr, &dummy2NsPtr,
 		&simplePattern);
@@ -1862,8 +1869,8 @@
 	    specificNsInPattern = (strcmp(simplePattern, pattern) != 0);
 	}
     } else {
-        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
-        return TCL_ERROR;
+	Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");
+	return TCL_ERROR;
     }
 
     /*
@@ -2613,11 +2620,11 @@
      */  
 
     if (listPtr->typePtr != &tclListType) {
-        result = Tcl_ListObjGetElements(interp, listPtr, &listLen,
-                &elemPtrs);
-        if (result != TCL_OK) {
-            return result;
-        }
+	result = Tcl_ListObjGetElements(interp, listPtr, &listLen,
+		&elemPtrs);
+	if (result != TCL_OK) {
+	    return result;
+	}
     }
 
     /*
@@ -3262,8 +3269,8 @@
     SortElement *elementArray;
     SortElement *elementPtr;        
     SortInfo sortInfo;                  /* Information about this sort that
-                                         * needs to be passed to the 
-                                         * comparison function */
+					 * needs to be passed to the 
+					 * comparison function */
     static CONST char *switches[] = {
 	"-ascii", "-command", "-decreasing", "-dictionary", "-increasing",
 	"-index", "-integer", "-real", "-unique", (char *) NULL
@@ -3346,7 +3353,7 @@
 	 * later.
 	 */
 
-        Tcl_Obj *newCommandPtr = Tcl_DuplicateObj(cmdPtr);
+	Tcl_Obj *newCommandPtr = Tcl_DuplicateObj(cmdPtr);
 	Tcl_Obj *newObjPtr = Tcl_NewObj();
 
 	Tcl_IncrRefCount(newCommandPtr);
@@ -3428,7 +3435,7 @@
 MergeSort(headPtr, infoPtr)
     SortElement *headPtr;               /* First element on the list */
     SortInfo *infoPtr;                  /* Information needed by the
-                                         * comparison operator */
+					 * comparison operator */
 {
     /*
      * The subList array below holds pointers to temporary lists built
@@ -3442,7 +3449,7 @@
     int i;
 
     for(i = 0; i < NUM_LISTS; i++){
-        subList[i] = NULL;
+	subList[i] = NULL;
     }
     while (headPtr != NULL) {
 	elementPtr = headPtr;
@@ -3459,7 +3466,7 @@
     }
     elementPtr = NULL;
     for (i = 0; i < NUM_LISTS; i++){
-        elementPtr = MergeLists(subList[i], elementPtr, infoPtr);
+	elementPtr = MergeLists(subList[i], elementPtr, infoPtr);
     }
     return elementPtr;
 }
@@ -3489,17 +3496,17 @@
     SortElement *rightPtr;              /* Second list to be merged; may be
 					 * NULL. */
     SortInfo *infoPtr;                  /* Information needed by the
-                                         * comparison operator. */
+					 * comparison operator. */
 {
     SortElement *headPtr;
     SortElement *tailPtr;
     int cmp;
 
     if (leftPtr == NULL) {
-        return rightPtr;
+	return rightPtr;
     }
     if (rightPtr == NULL) {
-        return leftPtr;
+	return leftPtr;
     }
     cmp = SortCompare(leftPtr->objPtr, rightPtr->objPtr, infoPtr);
     if (cmp > 0) {
@@ -3529,9 +3536,9 @@
 	}
     }
     if (leftPtr != NULL) {
-       tailPtr->nextPtr = leftPtr;
+	tailPtr->nextPtr = leftPtr;
     } else {
-       tailPtr->nextPtr = rightPtr;
+	tailPtr->nextPtr = rightPtr;
     }
     return headPtr;
 }
@@ -3561,7 +3568,7 @@
 SortCompare(objPtr1, objPtr2, infoPtr)
     Tcl_Obj *objPtr1, *objPtr2;		/* Values to be compared. */
     SortInfo *infoPtr;                  /* Information passed from the
-                                         * top-level "lsort" command */
+					 * top-level "lsort" command */
 {
     int order, listLen, index;
     Tcl_Obj *objPtr;
@@ -3823,8 +3830,8 @@
 	    break;
 	}
 
-        diff = uniLeftLower - uniRightLower;
-        if (diff) {
+	diff = uniLeftLower - uniRightLower;
+	if (diff) {
 	    return diff;
 	} else if (secondaryDiff == 0) {
 	    if (Tcl_UniCharIsUpper(uniLeft) &&
@@ -3834,7 +3841,7 @@
 		    && Tcl_UniCharIsLower(uniLeft)) {
 		secondaryDiff = 1;
 	    }
-        }
+	}
     }
     if (diff == 0) {
 	diff = secondaryDiff;
Index: generic/tclDictObj.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclDictObj.c,v
retrieving revision 1.7
diff -u -r1.7 tclDictObj.c
--- generic/tclDictObj.c	16 Apr 2003 23:33:43 -0000	1.7
+++ generic/tclDictObj.c	28 Apr 2003 12:32:31 -0000
@@ -1678,8 +1678,9 @@
     Tcl_Obj *CONST *objv;
 {
     Tcl_Obj *dictPtr, *valuePtr, *resultPtr;
-    int result;
+    int result, isWide;
     long incrValue;
+    Tcl_WideInt wideIncrValue;
 
     if (objc < 4 || objc > 5) {
 	Tcl_WrongNumArgs(interp, 2, objv, "varName key ?increment?");
@@ -1687,18 +1688,40 @@
     }
 
     if (objc == 5) {
-	result = Tcl_GetLongFromObj(interp, objv[4], &incrValue);
-	if (result != TCL_OK) {
-	    return result;
+	if (objv[4]->typePtr == &tclIntType) {
+	    incrValue = objv[4]->internalRep.longValue;
+	    isWide = 0;
+	} else if (objv[4]->typePtr == &tclWideIntType) {
+	    wideIncrValue = objv[4]->internalRep.wideValue;
+	    isWide = 1;
+	} else {
+	    result = Tcl_GetWideIntFromObj(interp, objv[4], &wideIncrValue);
+	    if (result != TCL_OK) {
+		return result;
+	    }
+	    if (wideIncrValue <= Tcl_LongAsWide(LONG_MAX)
+		    && wideIncrValue >= Tcl_LongAsWide(LONG_MIN)) {
+		isWide = 0;
+		incrValue = Tcl_WideAsLong(wideIncrValue);
+		objv[4]->typePtr = &tclIntType;
+	    } else {
+		isWide = 1;
+	    }
 	}
     } else {
 	incrValue = 1;
+	isWide = 0;
     }
 
     dictPtr = Tcl_ObjGetVar2(interp, objv[2], NULL, 0);
     if (dictPtr == NULL) {
 	dictPtr = Tcl_NewDictObj();
-	Tcl_DictObjPut(interp, dictPtr, objv[3], Tcl_NewLongObj(incrValue));
+	if (isWide) {
+	    valuePtr = Tcl_NewWideIntObj(wideIncrValue);
+	} else {
+	    valuePtr = Tcl_NewLongObj(incrValue);
+	}
+	Tcl_DictObjPut(interp, dictPtr, objv[3], valuePtr);
     } else {
 	long lValue;
 	Tcl_WideInt wValue;
@@ -1711,13 +1734,25 @@
 	    return TCL_ERROR;
 	}
 	if (valuePtr == NULL) {
-	    valuePtr = Tcl_NewLongObj(incrValue);
+	    if (isWide) {
+		valuePtr = Tcl_NewWideIntObj(wideIncrValue);
+	    } else {
+		valuePtr = Tcl_NewLongObj(incrValue);
+	    }
 	} else if (valuePtr->typePtr == &tclWideIntType) {
 	    Tcl_GetWideIntFromObj(NULL, valuePtr, &wValue);
 	    if (Tcl_IsShared(valuePtr)) {
-		valuePtr = Tcl_NewWideIntObj(wValue + incrValue);
+		if (isWide) {
+		    valuePtr = Tcl_NewWideIntObj(wValue + wideIncrValue);
+		} else {
+		    valuePtr = Tcl_NewWideIntObj(wValue + incrValue);
+		}
 	    } else {
-		Tcl_SetWideIntObj(valuePtr, wValue + incrValue);
+		if (isWide) {
+		    Tcl_SetWideIntObj(valuePtr, wValue + wideIncrValue);
+		} else {
+		    Tcl_SetWideIntObj(valuePtr, wValue + incrValue);
+		}
 		if (dictPtr->bytes != NULL) {
 		    Tcl_InvalidateStringRep(dictPtr);
 		}
@@ -1726,9 +1761,17 @@
 	} else if (valuePtr->typePtr == &tclIntType) {
 	    Tcl_GetLongFromObj(NULL, valuePtr, &lValue);
 	    if (Tcl_IsShared(valuePtr)) {
-		valuePtr = Tcl_NewLongObj(lValue + incrValue);
+		if (isWide) {
+		    valuePtr = Tcl_NewWideIntObj(lValue + wideIncrValue);
+		} else {
+		    valuePtr = Tcl_NewLongObj(lValue + incrValue);
+		}
 	    } else {
-		Tcl_SetLongObj(valuePtr, lValue + incrValue);
+		if (isWide) {
+		    Tcl_SetWideIntObj(valuePtr, lValue + wideIncrValue);
+		} else {
+		    Tcl_SetLongObj(valuePtr, lValue + incrValue);
+		}
 		if (dictPtr->bytes != NULL) {
 		    Tcl_InvalidateStringRep(dictPtr);
 		}
@@ -1749,7 +1792,9 @@
 	     * Determine if we should have got a standard long instead.
 	     */
 	    if (Tcl_IsShared(valuePtr)) {
-		if (wValue >= LONG_MIN && wValue <= LONG_MAX) {
+		if (isWide) {
+		    valuePtr = Tcl_NewWideIntObj(wValue + wideIncrValue);
+		} else if (wValue >= LONG_MIN && wValue <= LONG_MAX) {
 		    /*
 		     * Convert the type...
 		     */
@@ -1759,7 +1804,9 @@
 		    valuePtr = Tcl_NewWideIntObj(wValue + incrValue);
 		}
 	    } else {
-		if (wValue >= LONG_MIN && wValue <= LONG_MAX) {
+		if (isWide) {
+		    Tcl_SetWideIntObj(valuePtr, wValue + wideIncrValue);
+		} else if (wValue >= LONG_MIN && wValue <= LONG_MAX) {
 		    Tcl_SetLongObj(valuePtr,
 			    Tcl_WideAsLong(wValue) + incrValue);
 		} else {
Index: generic/tclExecute.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclExecute.c,v
retrieving revision 1.99
diff -u -r1.99 tclExecute.c
--- generic/tclExecute.c	18 Apr 2003 20:03:50 -0000	1.99
+++ generic/tclExecute.c	28 Apr 2003 12:32:32 -0000
@@ -1060,6 +1060,7 @@
     int length;
     long i = 0;			/* Init. avoids compiler warning. */
     Tcl_WideInt w;
+    int isWide;
     register int cleanup;
     Tcl_Obj *objResultPtr;
     char *part1, *part2;
@@ -1872,8 +1873,10 @@
 	valuePtr = stackPtr[stackTop];
 	if (valuePtr->typePtr == &tclIntType) {
 	    i = valuePtr->internalRep.longValue;
+	    isWide = 0;
 	} else if (valuePtr->typePtr == &tclWideIntType) {
-	    TclGetLongFromWide(i,valuePtr);
+	    w = valuePtr->internalRep.wideValue;
+	    isWide = 1;
 	} else {
 	    REQUIRE_WIDE_OR_INT(result, valuePtr, i, w);
 	    if (result != TCL_OK) {
@@ -1882,7 +1885,7 @@
 		Tcl_AddErrorInfo(interp, "\n    (reading increment)");
 		goto checkForCatch;
 	    }
-	    FORCE_LONG(valuePtr, i, w);
+	    isWide = (valuePtr->typePtr == &tclWideIntType);
 	}
 	stackTop--;
 	TclDecrRefCount(valuePtr);
@@ -1902,6 +1905,7 @@
     case INST_INCR_SCALAR_STK_IMM:
     case INST_INCR_STK_IMM:
 	i = TclGetInt1AtPtr(pc+1);
+	isWide = 0;
 	pcAdjustment = 2;
 	    
     doIncrStk:
@@ -1933,6 +1937,7 @@
     case INST_INCR_ARRAY1_IMM:
 	opnd = TclGetUInt1AtPtr(pc+1);
 	i = TclGetInt1AtPtr(pc+2);
+	isWide = 0;
 	pcAdjustment = 3;
 
     doIncrArray:
@@ -1957,6 +1962,7 @@
     case INST_INCR_SCALAR1_IMM:
 	opnd = TclGetUInt1AtPtr(pc+1);
 	i = TclGetInt1AtPtr(pc+2);
+	isWide = 0;
 	pcAdjustment = 3;
 
     doIncrScalar:
@@ -1977,35 +1983,58 @@
 	        && !TclIsVarUndefined(varPtr) 
 	        && (varPtr->tracePtr == NULL)
 	        && ((arrayPtr == NULL) 
-		        || (arrayPtr->tracePtr == NULL))
-	        && (objPtr->typePtr == &tclIntType)) {
-	    /*
-	     * No errors, no traces, the variable already has an
-	     * integer value: inline processing.
-	     */
+		        || (arrayPtr->tracePtr == NULL))) {
+	    if (objPtr->typePtr == &tclIntType && !isWide) {
+		/*
+		 * No errors, no traces, the variable already has an
+		 * integer value: inline processing.
+		 */
 
-	    i += objPtr->internalRep.longValue;
-	    if (Tcl_IsShared(objPtr)) {
-		objResultPtr = Tcl_NewLongObj(i);
-		TclDecrRefCount(objPtr);
-		Tcl_IncrRefCount(objResultPtr);
-		varPtr->value.objPtr = objResultPtr;
-	    } else {
-		Tcl_SetLongObj(objPtr, i);
-		objResultPtr = objPtr;
+		i += objPtr->internalRep.longValue;
+		if (Tcl_IsShared(objPtr)) {
+		    objResultPtr = Tcl_NewLongObj(i);
+		    TclDecrRefCount(objPtr);
+		    Tcl_IncrRefCount(objResultPtr);
+		    varPtr->value.objPtr = objResultPtr;
+		} else {
+		    Tcl_SetLongObj(objPtr, i);
+		    objResultPtr = objPtr;
+		}
+		goto doneIncr;
+	    } else if (objPtr->typePtr == &tclWideIntType && isWide) {
+		/*
+		 * No errors, no traces, the variable already has a
+		 * wide integer value: inline processing.
+		 */
+
+		w += objPtr->internalRep.wideValue;
+		if (Tcl_IsShared(objPtr)) {
+		    objResultPtr = Tcl_NewWideIntObj(w);
+		    TclDecrRefCount(objPtr);
+		    Tcl_IncrRefCount(objResultPtr);
+		    varPtr->value.objPtr = objResultPtr;
+		} else {
+		    Tcl_SetWideIntObj(objPtr, w);
+		    objResultPtr = objPtr;
+		}
+		goto doneIncr;
 	    }
-	    TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
+	}
+	DECACHE_STACK_INFO();
+	if (isWide) {
+	    objResultPtr = TclPtrIncrWideVar(interp, varPtr, arrayPtr, part1, 
+		    part2, w, TCL_LEAVE_ERR_MSG);
 	} else {
-	    DECACHE_STACK_INFO();
 	    objResultPtr = TclPtrIncrVar(interp, varPtr, arrayPtr, part1, 
-                    part2, i, TCL_LEAVE_ERR_MSG);
-	    CACHE_STACK_INFO();
-	    if (objResultPtr == NULL) {
-		TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp))));
-		result = TCL_ERROR;
-		goto checkForCatch;
-	    }
+		    part2, i, TCL_LEAVE_ERR_MSG);
+	}
+	CACHE_STACK_INFO();
+	if (objResultPtr == NULL) {
+	    TRACE_APPEND(("ERROR: %.30s\n", O2S(Tcl_GetObjResult(interp))));
+	    result = TCL_ERROR;
+	    goto checkForCatch;
 	}
+      doneIncr:
 	TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
 #ifndef TCL_COMPILE_DEBUG
 	if (*(pc+pcAdjustment) == INST_POP) {
Index: generic/tclInt.decls
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.decls,v
retrieving revision 1.59
diff -u -r1.59 tclInt.decls
--- generic/tclInt.decls	18 Feb 2003 02:25:45 -0000	1.59
+++ generic/tclInt.decls	28 Apr 2003 12:32:32 -0000
@@ -111,7 +111,7 @@
 	    int *sizePtr, int *bracePtr)
 }
 declare 23 generic {
-    Proc * TclFindProc(Interp *iPtr, CONST char *procName)
+    Proc *TclFindProc(Interp *iPtr, CONST char *procName)
 }
 declare 24 generic {
     int TclFormatInt(char *buffer, long n)
@@ -120,8 +120,8 @@
     void TclFreePackageInfo(Interp *iPtr)
 }
 # Removed in 8.1:
-#  declare 26 generic {	
-#      char * TclGetCwd(Tcl_Interp *interp)
+#  declare 26 generic {
+#      char *TclGetCwd(Tcl_Interp *interp)
 #  }
 declare 27 generic {
     int TclGetDate(char *p, unsigned long now, long zone,
@@ -132,15 +132,15 @@
 }
 # Removed in 8.4b2:
 #declare 29 generic {
-#    Tcl_Obj * TclGetElementOfIndexedArray(Tcl_Interp *interp,
+#    Tcl_Obj *TclGetElementOfIndexedArray(Tcl_Interp *interp,
 #	    int localIndex, Tcl_Obj *elemPtr, int flags)
 #}
-# Replaced by char * TclGetEnv(CONST char *name, Tcl_DString *valuePtr) in 8.1:
+# Replaced by char *TclGetEnv(CONST char *name, Tcl_DString *valuePtr) in 8.1:
 #  declare 30 generic {
-#      char * TclGetEnv(CONST char *name)
+#      char *TclGetEnv(CONST char *name)
 #  }
 declare 31 generic {
-    char * TclGetExtension(char *name)
+    char *TclGetExtension(char *name)
 }
 declare 32 generic {
     int TclGetFrame(Tcl_Interp *interp, CONST char *str,
@@ -155,7 +155,7 @@
 }
 # Removed in 8.4b2:
 #declare 35 generic {
-#    Tcl_Obj * TclGetIndexedScalar(Tcl_Interp *interp, int localIndex,
+#    Tcl_Obj *TclGetIndexedScalar(Tcl_Interp *interp, int localIndex,
 #	    int flags)
 #}
 declare 36 generic {
@@ -180,10 +180,11 @@
     Tcl_Command TclGetOriginalCommand(Tcl_Command command)
 }
 declare 42 generic {
-    char * TclpGetUserHome(CONST char *name, Tcl_DString *bufferPtr)
+    char *TclpGetUserHome(CONST char *name, Tcl_DString *bufferPtr)
 }
 declare 43 generic {
-    int TclGlobalInvoke(Tcl_Interp *interp, int argc, CONST84 char **argv, int flags)
+    int TclGlobalInvoke(Tcl_Interp *interp, int argc, CONST84 char **argv,
+	    int flags)
 }
 declare 44 generic {
     int TclGuessPackageName(CONST char *fileName, Tcl_DString *bufPtr)
@@ -196,16 +197,16 @@
 }
 # Removed in 8.4b2:
 #declare 47 generic {
-#    Tcl_Obj * TclIncrElementOfIndexedArray(Tcl_Interp *interp,
+#    Tcl_Obj *TclIncrElementOfIndexedArray(Tcl_Interp *interp,
 #	    int localIndex, Tcl_Obj *elemPtr, long incrAmount)
 #}
 # Removed in 8.4b2:
 #declare 48 generic {
-#    Tcl_Obj * TclIncrIndexedScalar(Tcl_Interp *interp, int localIndex,
+#    Tcl_Obj *TclIncrIndexedScalar(Tcl_Interp *interp, int localIndex,
 #	    long incrAmount)
 #}
 declare 49 generic {
-    Tcl_Obj * TclIncrVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr,
+    Tcl_Obj *TclIncrVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr,
 	    Tcl_Obj *part2Ptr, long incrAmount, int part1NotParsed)
 }
 declare 50 generic {
@@ -227,7 +228,7 @@
 	    int objc, Tcl_Obj *CONST objv[])
 }
 declare 55 generic {
-    Proc * TclIsProc(Command *cmdPtr)
+    Proc *TclIsProc(Command *cmdPtr)
 }
 # Replaced with TclpLoadFile in 8.1:
 #  declare 56 generic {
@@ -240,7 +241,7 @@
 #      int TclLooksLikeInt(char *p)
 #  }
 declare 58 generic {
-    Var * TclLookupVar(Tcl_Interp *interp, CONST char *part1, CONST char *part2,
+    Var *TclLookupVar(Tcl_Interp *interp, CONST char *part1, CONST char *part2,
 	    int flags, CONST char *msg, int createPart1, int createPart2,
 	    Var **arrayPtrPtr)
 }
@@ -253,7 +254,7 @@
     int TclNeedSpace(CONST char *start, CONST char *end)
 }
 declare 61 generic {
-    Tcl_Obj * TclNewProcBodyObj(Proc *procPtr)
+    Tcl_Obj *TclNewProcBodyObj(Proc *procPtr)
 }
 declare 62 generic {
     int TclObjCommandComplete(Tcl_Obj *cmdPtr)
@@ -281,7 +282,7 @@
 #    int TclpAccess(CONST char *path, int mode)
 #}
 declare 69 generic {
-    char * TclpAlloc(unsigned int size)
+    char *TclpAlloc(unsigned int size)
 }
 #declare 70 generic {
 #    int TclpCopyFile(CONST char *source, CONST char *dest)
@@ -324,7 +325,7 @@
 #	    char *modeString, int permissions)
 #}
 declare 81 generic {
-    char * TclpRealloc(char *ptr, unsigned int size)
+    char *TclpRealloc(char *ptr, unsigned int size)
 }
 #declare 82 generic {
 #    int TclpRemoveDirectory(CONST char *path, int recursive,
@@ -350,7 +351,7 @@
 #      void TclPlatformInit(Tcl_Interp *interp)
 #  }
 declare 88 generic {
-    char * TclPrecTraceProc(ClientData clientData, Tcl_Interp *interp,
+    char *TclPrecTraceProc(ClientData clientData, Tcl_Interp *interp,
 	    CONST char *name1, CONST char *name2, int flags)
 }
 declare 89 generic {
@@ -391,16 +392,16 @@
 }
 # Removed in 8.4b2:
 #declare 99 generic {
-#    Tcl_Obj * TclSetElementOfIndexedArray(Tcl_Interp *interp, int localIndex,
+#    Tcl_Obj *TclSetElementOfIndexedArray(Tcl_Interp *interp, int localIndex,
 #	    Tcl_Obj *elemPtr, Tcl_Obj *objPtr, int flags)
 #}
 # Removed in 8.4b2:
 #declare 100 generic {
-#    Tcl_Obj * TclSetIndexedScalar(Tcl_Interp *interp, int localIndex,
+#    Tcl_Obj *TclSetIndexedScalar(Tcl_Interp *interp, int localIndex,
 #	    Tcl_Obj *objPtr, int flags)
 #}
 declare 101 generic {
-    char * TclSetPreInitScript(char *string)
+    char *TclSetPreInitScript(char *string)
 }
 declare 102 generic {
     void TclSetupEnv(Tcl_Interp *interp)
@@ -430,7 +431,7 @@
 }
 # Removed in 8.1:
 #  declare 110 generic {
-#      char * TclWordEnd(char *start, char *lastChar, int nested, int *semiPtr)
+#      char *TclWordEnd(char *start, char *lastChar, int nested, int *semiPtr)
 #  }
 
 # Procedures used in conjunction with Tcl namespaces. They are
@@ -446,7 +447,7 @@
 	    Tcl_Obj *objPtr)
 }
 declare 113 generic {
-    Tcl_Namespace * Tcl_CreateNamespace(Tcl_Interp *interp, CONST char *name,
+    Tcl_Namespace *Tcl_CreateNamespace(Tcl_Interp *interp, CONST char *name,
 	    ClientData clientData, Tcl_NamespaceDeleteProc *deleteProc)
 }
 declare 114 generic {
@@ -461,7 +462,7 @@
 	    Tcl_Namespace *contextNsPtr, int flags)
 }
 declare 117 generic {
-    Tcl_Namespace * Tcl_FindNamespace(Tcl_Interp *interp, CONST char *name,
+    Tcl_Namespace *Tcl_FindNamespace(Tcl_Interp *interp, CONST char *name,
 	    Tcl_Namespace *contextNsPtr, int flags)
 }
 declare 118 generic {
@@ -488,10 +489,10 @@
 	    Tcl_Obj *objPtr)
 }
 declare 124 generic {
-    Tcl_Namespace * Tcl_GetCurrentNamespace(Tcl_Interp *interp)
+    Tcl_Namespace *Tcl_GetCurrentNamespace(Tcl_Interp *interp)
 }
 declare 125 generic {
-    Tcl_Namespace * Tcl_GetGlobalNamespace(Tcl_Interp *interp)
+    Tcl_Namespace *Tcl_GetGlobalNamespace(Tcl_Interp *interp)
 }
 declare 126 generic {
     void Tcl_GetVariableFullName(Tcl_Interp *interp, Tcl_Var variable,
@@ -502,10 +503,10 @@
 	    CONST char *pattern, int allowOverwrite)
 }
 declare 128 generic {
-    void Tcl_PopCallFrame(Tcl_Interp* interp)
+    void Tcl_PopCallFrame(Tcl_Interp *interp)
 }
 declare 129 generic {
-    int Tcl_PushCallFrame(Tcl_Interp* interp, Tcl_CallFrame *framePtr,
+    int Tcl_PushCallFrame(Tcl_Interp *interp, Tcl_CallFrame *framePtr,
 	    Tcl_Namespace *nsPtr, int isProcCallFrame)
 } 
 declare 130 generic {
@@ -520,7 +521,7 @@
     int TclpHasSockets(Tcl_Interp *interp)
 }
 declare 133 generic {
-    struct tm *	TclpGetDate(TclpTime_t time, int useGMT)
+    struct tm *TclpGetDate(TclpTime_t time, int useGMT)
 }
 declare 134 generic {
     size_t TclpStrftime(char *s, size_t maxsize, CONST char *format,
@@ -536,7 +537,7 @@
 #   int TclpChdir(CONST char *dirName)
 #}
 declare 138 generic {
-    CONST84_RETURN char * TclGetEnv(CONST char *name, Tcl_DString *valuePtr)
+    CONST84_RETURN char *TclGetEnv(CONST char *name, Tcl_DString *valuePtr)
 }
 #declare 139 generic {
 #    int TclpLoadFile(Tcl_Interp *interp, char *fileName, char *sym1,
@@ -610,11 +611,11 @@
 #}
 
 declare 156 generic {
-    void TclRegError (Tcl_Interp *interp, CONST char *msg,
+    void TclRegError(Tcl_Interp *interp, CONST char *msg,
 	    int status)
 }
 declare 157 generic {
-    Var * TclVarTraceExists (Tcl_Interp *interp, CONST char *varName)
+    Var *TclVarTraceExists(Tcl_Interp *interp, CONST char *varName)
 }
 declare 158 generic {
     void TclSetStartupScriptFileName(CONST char *filename)
@@ -642,7 +643,7 @@
 # correct type when calling this procedure.
 
 declare 163 generic {
-	void * TclGetInstructionTable (void)
+    void *TclGetInstructionTable(void)
 }
 
 # ALERT: The argument of 'TclExpandCodeArray' is actually a
@@ -650,7 +651,7 @@
 # "tclInt.h". It is described in "tclCompile.h".
 
 declare 164 generic {
-	void TclExpandCodeArray (void *envPtr)
+    void TclExpandCodeArray(void *envPtr)
 }
 
 # These functions are vfs aware, but are generally only useful internally.
@@ -676,14 +677,14 @@
     int TclpUtfNcmp2(CONST char *s1, CONST char *s2, unsigned long n)
 }
 declare 170 generic {
-    int TclCheckInterpTraces (Tcl_Interp *interp, CONST char *command, int numChars, \
-            Command *cmdPtr, int result, int traceFlags, int objc, \
-	    Tcl_Obj *CONST objv[])
+    int TclCheckInterpTraces(Tcl_Interp *interp, CONST char *command,
+            int numChars, Command *cmdPtr, int result, int traceFlags,
+	    int objc, Tcl_Obj *CONST objv[])
 }
 declare 171 generic {
-    int TclCheckExecutionTraces (Tcl_Interp *interp, CONST char *command, int numChars, \
-            Command *cmdPtr, int result, int traceFlags, int objc, \
-	    Tcl_Obj *CONST objv[])
+    int TclCheckExecutionTraces(Tcl_Interp *interp, CONST char *command,
+            int numChars, Command *cmdPtr, int result, int traceFlags,
+	    int objc, Tcl_Obj *CONST objv[])
 }
 
 declare 172 generic {
@@ -693,10 +694,17 @@
 # added for 8.4.2
 
 declare 173 generic {
-    int TclUniCharMatch (CONST Tcl_UniChar *string, int strLen, \
+    int TclUniCharMatch(CONST Tcl_UniChar *string, int strLen,
 	    CONST Tcl_UniChar *pattern, int ptnLen, int nocase)
 }
 
+# added for 8.4.3
+
+declare 174 generic {
+    Tcl_Obj *TclIncrWideVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr,
+	    Tcl_Obj *part2Ptr, Tcl_WideInt wideIncrAmount, int part1NotParsed)
+}
+
 ##############################################################################
 
 # Define the platform specific internal Tcl interface. These functions are
@@ -708,13 +716,13 @@
 # Mac specific internals
 
 declare 0 mac {
-    VOID * TclpSysAlloc(long size, int isBin)
+    VOID *TclpSysAlloc(long size, int isBin)
 }
 declare 1 mac {
     void TclpSysFree(VOID *ptr)
 }
 declare 2 mac {
-    VOID * TclpSysRealloc(VOID *cp, unsigned int size)
+    VOID *TclpSysRealloc(VOID *cp, unsigned int size)
 }
 declare 3 mac {
     void TclpExit(int status)
@@ -782,7 +790,7 @@
     void TclMacRemoveTimer(void *timerToken)
 }
 declare 18 mac {
-    void * TclMacStartTimer(long ms)
+    void *TclMacStartTimer(long ms)
 }
 declare 19 mac {
     int TclMacTimerExpired(void *timerToken)
@@ -790,22 +798,22 @@
 declare 20 mac {
     int TclMacRegisterResourceFork(short fileRef, Tcl_Obj *tokenPtr,
 	    int insert)
-}	
+}
 declare 21 mac {
     short TclMacUnRegisterResourceFork(char *tokenPtr, Tcl_Obj *resultPtr)
-}	
+}
 declare 22 mac {
     int TclMacCreateEnv(void)
 }
 declare 23 mac {
-    FILE * TclMacFOpenHack(CONST char *path, CONST char *mode)
+    FILE *TclMacFOpenHack(CONST char *path, CONST char *mode)
 }
 # Replaced in 8.1 by TclpReadLink:
 #  declare 24 mac {
 #      int TclMacReadlink(char *path, char *buf, int size)
 #  }
 declare 24 mac {
-    char * TclpGetTZName(int isdst)
+    char *TclpGetTZName(int isdst)
 }
 declare 25 mac {
     int TclMacChmod(CONST char *path, int mode)
@@ -825,12 +833,12 @@
     void TclWinConvertWSAError(DWORD errCode)
 }
 declare 2 win {
-    struct servent * TclWinGetServByName(CONST char *nm,
+    struct servent *TclWinGetServByName(CONST char *nm,
 	    CONST char *proto)
 }
 declare 3 win {
     int TclWinGetSockOpt(SOCKET s, int level, int optname,
-	    char FAR * optval, int FAR *optlen)
+	    char FAR *optval, int FAR *optlen)
 }
 declare 4 win {
     HINSTANCE TclWinGetTclInstance(void)
@@ -844,7 +852,7 @@
 }
 declare 7 win {
     int TclWinSetSockOpt(SOCKET s, int level, int optname,
-	    CONST char FAR * optval, int optlen)
+	    CONST char FAR *optval, int optlen)
 }
 declare 8 win {
     unsigned long TclpGetPid(Tcl_Pid pid)
@@ -882,7 +890,7 @@
 #      TclFile TclpCreateTempFile(char *contents, Tcl_DString *namePtr)
 #  }
 #  declare 17 win {
-#      char * TclpGetTZName(void)
+#      char *TclpGetTZName(void)
 #  }
 declare 18 win {
     TclFile TclpMakeFile(Tcl_Channel channel, int direction)
@@ -904,10 +912,10 @@
     TclFile TclpCreateTempFile(CONST char *contents)
 }
 declare 23 win {
-    char * TclpGetTZName(int isdst)
+    char *TclpGetTZName(int isdst)
 }
 declare 24 win {
-    char * TclWinNoBackslash(char *path)
+    char *TclWinNoBackslash(char *path)
 }
 declare 25 win {
     TclPlatformType *TclWinGetPlatform(void)
@@ -919,7 +927,7 @@
 # Added in Tcl 8.3.3 / 8.4
 
 declare 27 win {
-    void TclWinFlushDirtyChannels (void)
+    void TclWinFlushDirtyChannels(void)
 }
 
 # Added in 8.4.2
@@ -974,18 +982,14 @@
 # Added in 8.4:
 
 declare 10 unix {
-    Tcl_DirEntry * TclpReaddir(DIR * dir)
+    Tcl_DirEntry *TclpReaddir(DIR *dir)
 }
-
 declare 11 unix {
-    struct tm * TclpLocaltime(time_t * clock)
+    struct tm *TclpLocaltime(time_t *clock)
 }
-
 declare 12 unix {
-    struct tm * TclpGmtime(time_t * clock)
+    struct tm *TclpGmtime(time_t *clock)
 }
-
 declare 13 unix {
-    char * TclpInetNtoa(struct in_addr addr)
+    char *TclpInetNtoa(struct in_addr addr)
 }
-
Index: generic/tclInt.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.h,v
retrieving revision 1.125
diff -u -r1.125 tclInt.h
--- generic/tclInt.h	22 Apr 2003 23:20:43 -0000	1.125
+++ generic/tclInt.h	28 Apr 2003 12:32:32 -0000
@@ -2040,6 +2040,9 @@
 EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,
 		    Var *arrayPtr, CONST char *part1, CONST char *part2,
 		    CONST long i, CONST int flags));
+EXTERN Tcl_Obj *TclPtrIncrWideVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,
+		    Var *arrayPtr, CONST char *part1, CONST char *part2,
+		    CONST Tcl_WideInt i, CONST int flags));
 
 /*
  *----------------------------------------------------------------
Index: generic/tclIntDecls.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclIntDecls.h,v
retrieving revision 1.49
diff -u -r1.49 tclIntDecls.h
--- generic/tclIntDecls.h	18 Feb 2003 02:25:45 -0000	1.49
+++ generic/tclIntDecls.h	28 Apr 2003 12:32:32 -0000
@@ -378,9 +378,9 @@
 				Tcl_Namespace * nsPtr, CONST char * pattern, 
 				int allowOverwrite));
 /* 128 */
-EXTERN void		Tcl_PopCallFrame _ANSI_ARGS_((Tcl_Interp* interp));
+EXTERN void		Tcl_PopCallFrame _ANSI_ARGS_((Tcl_Interp * interp));
 /* 129 */
-EXTERN int		Tcl_PushCallFrame _ANSI_ARGS_((Tcl_Interp* interp, 
+EXTERN int		Tcl_PushCallFrame _ANSI_ARGS_((Tcl_Interp * interp, 
 				Tcl_CallFrame * framePtr, 
 				Tcl_Namespace * nsPtr, int isProcCallFrame));
 /* 130 */
@@ -503,6 +503,11 @@
 				CONST Tcl_UniChar * string, int strLen, 
 				CONST Tcl_UniChar * pattern, int ptnLen, 
 				int nocase));
+/* 174 */
+EXTERN Tcl_Obj *	TclIncrWideVar2 _ANSI_ARGS_((Tcl_Interp * interp, 
+				Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, 
+				Tcl_WideInt wideIncrAmount, 
+				int part1NotParsed));
 
 typedef struct TclIntStubs {
     int magic;
@@ -660,8 +665,8 @@
     Tcl_Namespace * (*tcl_GetGlobalNamespace) _ANSI_ARGS_((Tcl_Interp * interp)); /* 125 */
     void (*tcl_GetVariableFullName) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Var variable, Tcl_Obj * objPtr)); /* 126 */
     int (*tcl_Import) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern, int allowOverwrite)); /* 127 */
-    void (*tcl_PopCallFrame) _ANSI_ARGS_((Tcl_Interp* interp)); /* 128 */
-    int (*tcl_PushCallFrame) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_CallFrame * framePtr, Tcl_Namespace * nsPtr, int isProcCallFrame)); /* 129 */
+    void (*tcl_PopCallFrame) _ANSI_ARGS_((Tcl_Interp * interp)); /* 128 */
+    int (*tcl_PushCallFrame) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_CallFrame * framePtr, Tcl_Namespace * nsPtr, int isProcCallFrame)); /* 129 */
     int (*tcl_RemoveInterpResolvers) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 130 */
     void (*tcl_SetNamespaceResolvers) _ANSI_ARGS_((Tcl_Namespace * namespacePtr, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 131 */
     int (*tclpHasSockets) _ANSI_ARGS_((Tcl_Interp * interp)); /* 132 */
@@ -706,6 +711,7 @@
     int (*tclCheckExecutionTraces) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * command, int numChars, Command * cmdPtr, int result, int traceFlags, int objc, Tcl_Obj *CONST objv[])); /* 171 */
     int (*tclInThreadExit) _ANSI_ARGS_((void)); /* 172 */
     int (*tclUniCharMatch) _ANSI_ARGS_((CONST Tcl_UniChar * string, int strLen, CONST Tcl_UniChar * pattern, int ptnLen, int nocase)); /* 173 */
+    Tcl_Obj * (*tclIncrWideVar2) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, Tcl_WideInt wideIncrAmount, int part1NotParsed)); /* 174 */
 } TclIntStubs;
 
 #ifdef __cplusplus
@@ -1315,6 +1321,10 @@
 #ifndef TclUniCharMatch
 #define TclUniCharMatch \
 	(tclIntStubsPtr->tclUniCharMatch) /* 173 */
+#endif
+#ifndef TclIncrWideVar2
+#define TclIncrWideVar2 \
+	(tclIntStubsPtr->tclIncrWideVar2) /* 174 */
 #endif
 
 #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */
Index: generic/tclStubInit.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclStubInit.c,v
retrieving revision 1.81
diff -u -r1.81 tclStubInit.c
--- generic/tclStubInit.c	5 Apr 2003 01:26:11 -0000	1.81
+++ generic/tclStubInit.c	28 Apr 2003 12:32:32 -0000
@@ -268,6 +268,7 @@
     TclCheckExecutionTraces, /* 171 */
     TclInThreadExit, /* 172 */
     TclUniCharMatch, /* 173 */
+    TclIncrWideVar2, /* 174 */
 };
 
 TclIntPlatStubs tclIntPlatStubs = {
Index: generic/tclVar.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclVar.c,v
retrieving revision 1.71
diff -u -r1.71 tclVar.c
--- generic/tclVar.c	16 Apr 2003 23:33:44 -0000	1.71
+++ generic/tclVar.c	28 Apr 2003 12:32:33 -0000
@@ -1876,6 +1876,163 @@
 /*
  *----------------------------------------------------------------------
  *
+ * TclIncrWideVar2 --
+ *
+ *	Given a two-part variable name, which may refer either to a scalar
+ *	variable or an element of an array, increment the Tcl object value
+ *	of the variable by a specified amount.
+ *
+ * Results:
+ *	Returns a pointer to the Tcl_Obj holding the new value of the
+ *	variable. If the specified variable doesn't exist, or there is a
+ *	clash in array usage, or an error occurs while executing variable
+ *	traces, then NULL is returned and a message will be left in
+ *	the interpreter's result.
+ *
+ * Side effects:
+ *	The value of the given variable is incremented by the specified
+ *	amount. If either the array or the entry didn't exist then a new
+ *	variable is created. The ref count for the returned object is _not_
+ *	incremented to reflect the returned reference; if you want to keep a
+ *	reference to the object you must increment its ref count yourself.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_Obj *
+TclIncrWideVar2(interp, part1Ptr, part2Ptr, incrAmount, flags)
+    Tcl_Interp *interp;		/* Command interpreter in which variable is
+				 * to be found. */
+    Tcl_Obj *part1Ptr;		/* Points to an object holding the name of
+				 * an array (if part2 is non-NULL) or the
+				 * name of a variable. */
+    Tcl_Obj *part2Ptr;		/* If non-null, points to an object holding
+				 * the name of an element in the array
+				 * part1Ptr. */
+    Tcl_WideInt incrAmount;	/* Amount to be added to variable. */
+    int flags;                  /* Various flags that tell how to incr value:
+				 * any of TCL_GLOBAL_ONLY,
+				 * TCL_NAMESPACE_ONLY, TCL_APPEND_VALUE,
+				 * TCL_LIST_ELEMENT, TCL_LEAVE_ERR_MSG. */
+{
+    Var *varPtr, *arrayPtr;
+    char *part1, *part2;
+
+    part1 = TclGetString(part1Ptr);
+    part2 = ((part2Ptr == NULL)? NULL : TclGetString(part2Ptr));
+
+    varPtr = TclObjLookupVar(interp, part1Ptr, part2, flags, "read",
+	    0, 1, &arrayPtr);
+    if (varPtr == NULL) {
+	Tcl_AddObjErrorInfo(interp,
+		"\n    (reading value of variable to increment)", -1);
+	return NULL;
+    }
+    return TclPtrIncrWideVar(interp, varPtr, arrayPtr, part1, part2,
+	    incrAmount, flags);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclPtrIncrWideVar --
+ *
+ *	Given the pointers to a variable and possible containing array, 
+ *      increment the Tcl object value of the variable by a specified 
+ *      amount.
+ *
+ * Results:
+ *	Returns a pointer to the Tcl_Obj holding the new value of the
+ *	variable. If the specified variable doesn't exist, or there is a
+ *	clash in array usage, or an error occurs while executing variable
+ *	traces, then NULL is returned and a message will be left in
+ *	the interpreter's result.
+ *
+ * Side effects:
+ *	The value of the given variable is incremented by the specified
+ *	amount. If either the array or the entry didn't exist then a new
+ *	variable is created. The ref count for the returned object is _not_
+ *	incremented to reflect the returned reference; if you want to keep a
+ *	reference to the object you must increment its ref count yourself.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_Obj *
+TclPtrIncrWideVar(interp, varPtr, arrayPtr, part1, part2, incrAmount, flags)
+    Tcl_Interp *interp;		/* Command interpreter in which variable is
+				 * to be found. */
+    Var *varPtr;
+    Var *arrayPtr;
+    CONST char *part1;		/* Points to an object holding the name of
+				 * an array (if part2 is non-NULL) or the
+				 * name of a variable. */
+    CONST char *part2;		/* If non-null, points to an object holding
+				 * the name of an element in the array
+				 * part1Ptr. */
+    CONST Tcl_WideInt incrAmount;
+				/* Amount to be added to variable. */
+    CONST int flags;            /* Various flags that tell how to incr value:
+				 * any of TCL_GLOBAL_ONLY,
+				 * TCL_NAMESPACE_ONLY, TCL_APPEND_VALUE,
+				 * TCL_LIST_ELEMENT, TCL_LEAVE_ERR_MSG. */
+{
+    register Tcl_Obj *varValuePtr;
+    int createdNewObj;		/* Set 1 if var's value object is shared
+				 * so we must increment a copy (i.e. copy
+				 * on write). */
+    Tcl_WideInt wide;
+
+    varValuePtr = TclPtrGetVar(interp, varPtr, arrayPtr, part1, part2, flags);
+
+    if (varValuePtr == NULL) {
+	Tcl_AddObjErrorInfo(interp,
+		"\n    (reading value of variable to increment)", -1);
+	return NULL;
+    }
+
+    /*
+     * Increment the variable's value. If the object is unshared we can
+     * modify it directly, otherwise we must create a new copy to modify:
+     * this is "copy on write". Then free the variable's old string
+     * representation, if any, since it will no longer be valid.
+     */
+
+    createdNewObj = 0;
+    if (Tcl_IsShared(varValuePtr)) {
+	varValuePtr = Tcl_DuplicateObj(varValuePtr);
+	createdNewObj = 1;
+    }
+    if (varValuePtr->typePtr == &tclWideIntType) {
+	TclGetWide(wide, varValuePtr);
+	Tcl_SetWideIntObj(varValuePtr, wide + incrAmount);
+    } else if (varValuePtr->typePtr == &tclIntType) {
+	long i = varValuePtr->internalRep.longValue;
+	Tcl_SetWideIntObj(varValuePtr, Tcl_LongAsWide(i) + incrAmount);
+    } else {
+	/*
+	 * Not an integer or wide internal-rep...
+	 */
+	if (Tcl_GetWideIntFromObj(interp, varValuePtr, &wide) != TCL_OK) {
+	    if (createdNewObj) {
+		Tcl_DecrRefCount(varValuePtr); /* free unneeded copy */
+	    }
+	    return NULL;
+	}
+	Tcl_SetWideIntObj(varValuePtr, wide + incrAmount);
+    }
+
+    /*
+     * Store the variable's new value and run any write traces.
+     */
+    
+    return TclPtrSetVar(interp, varPtr, arrayPtr, part1, part2,
+	    varValuePtr, flags);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
  * Tcl_UnsetVar --
  *
  *	Delete a variable, so that it may not be accessed anymore.
Index: tests/incr.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/incr.test,v
retrieving revision 1.8
diff -u -r1.8 incr.test
--- tests/incr.test	7 Feb 2003 01:07:05 -0000	1.8
+++ tests/incr.test	28 Apr 2003 12:32:33 -0000
@@ -516,18 +516,16 @@
     invoked from within
 "incr x 1a"}}
 
+test incr-3.1 {increment by wide amount: bytecode route} {
+    set x 0
+    incr x 123123123123
+} 123123123123
+test incr-3.2 {increment by wide amount: command route} {
+    set z incr
+    set x 0
+    $z x 123123123123
+} 123123123123
+
 # cleanup
 ::tcltest::cleanupTests
 return
-
-
-
-
-
-
-
-
-
-
-
-