From 98546bb8b6be883f790f5d6ba1ef37151165116a Mon Sep 17 00:00:00 2001 From: dgp Date: Wed, 16 Apr 2003 23:31:33 +0000 Subject: * generic/tcl.h Made changes so that the "wideInt" Tcl_ObjType * generic/tclObj.c is defined on all platforms, even those where * generic/tclPort.h TCL_WIDE_INT_IS_LONG is defined. Also made the Tcl_Value struct have a wideValue field on all platforms. This is a ***POTENTIAL INCOMPATIBILITY*** for TCL_WIDE_INT_IS_LONG platforms because that struct changes size. This is the same TIP 72 incompatibility that was seen on other platforms at the 8.4.0 release, when this change should have happened as well. [Bug 713562] * generic/tclInt.h: New internal macros TclGetWide() and TclGetLongFromWide() to deal with both forms of the "wideInt" Tcl_ObjType, so that conditional TCL_WIDE_INT_IS_LONG code is confined to the header file. * generic/tclCmdAH.c: Replaced most coding that was conditional * generic/tclCmdIL.c: on TCL_WIDE_INT_IS_LONG with code that * generic/tclExecute.c: works across platforms, sometimes using * generic/tclTest.c: the new macros above to do it. * generic/tclUtil.c: * generic/tclVar.c: --- ChangeLog | 23 +++++ generic/tcl.h | 7 +- generic/tclCmdAH.c | 19 +--- generic/tclCmdIL.c | 7 +- generic/tclExecute.c | 253 +++++++++++++-------------------------------------- generic/tclInt.h | 24 ++++- generic/tclObj.c | 34 ++----- generic/tclPort.h | 14 ++- generic/tclTest.c | 8 +- generic/tclUtil.c | 18 +--- generic/tclVar.c | 15 +-- 11 files changed, 135 insertions(+), 287 deletions(-) diff --git a/ChangeLog b/ChangeLog index 68a0944..dadbc40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2003-04-16 Don Porter + + * generic/tcl.h Made changes so that the "wideInt" Tcl_ObjType + * generic/tclObj.c is defined on all platforms, even those where + * generic/tclPort.h TCL_WIDE_INT_IS_LONG is defined. Also made + the Tcl_Value struct have a wideValue field on all platforms. This is + a ***POTENTIAL INCOMPATIBILITY*** for TCL_WIDE_INT_IS_LONG platforms + because that struct changes size. This is the same TIP 72 + incompatibility that was seen on other platforms at the 8.4.0 release, + when this change should have happened as well. [Bug 713562] + + * generic/tclInt.h: New internal macros TclGetWide() and + TclGetLongFromWide() to deal with both forms of the "wideInt" + Tcl_ObjType, so that conditional TCL_WIDE_INT_IS_LONG code + is confined to the header file. + + * generic/tclCmdAH.c: Replaced most coding that was conditional + * generic/tclCmdIL.c: on TCL_WIDE_INT_IS_LONG with code that + * generic/tclExecute.c: works across platforms, sometimes using + * generic/tclTest.c: the new macros above to do it. + * generic/tclUtil.c: + * generic/tclVar.c: + 2003-04-17 Donal K. Fellows * doc/socket.n: Added a paragraph to remind people to specify diff --git a/generic/tcl.h b/generic/tcl.h index 9a76328..a2aaefe 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tcl.h,v 1.153.2.1 2003/03/12 19:19:29 dgp Exp $ + * RCS: @(#) $Id: tcl.h,v 1.153.2.2 2003/04/16 23:31:41 dgp Exp $ */ #ifndef _TCL @@ -630,18 +630,13 @@ typedef struct stat *Tcl_OldStat_; */ typedef enum { TCL_INT, TCL_DOUBLE, TCL_EITHER, TCL_WIDE_INT -#ifdef TCL_WIDE_INT_IS_LONG - = TCL_INT -#endif } Tcl_ValueType; typedef struct Tcl_Value { Tcl_ValueType type; /* Indicates intValue or doubleValue is * valid, or both. */ long intValue; /* Integer value. */ double doubleValue; /* Double-precision floating value. */ -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt wideValue; /* Wide (min. 64-bit) integer value. */ -#endif } Tcl_Value; /* diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 0d15bde..596795a 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.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: tclCmdAH.c,v 1.27.2.4 2003/04/08 22:59:36 dkf Exp $ + * RCS: @(#) $Id: tclCmdAH.c,v 1.27.2.5 2003/04/16 23:31:42 dgp Exp $ */ #include "tclInt.h" @@ -1939,10 +1939,8 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) * it's a one-word value. */ double doubleValue; /* Used to hold value to pass to sprintf if * it's a double value. */ -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt wideValue; /* Used to hold value to pass to sprintf if * it's a 'long long' value. */ -#endif /* TCL_WIDE_INT_IS_LONG */ int whichValue; /* Indicates which of intValue, ptrValue, * or doubleValue has the value to pass to * sprintf, according to the following @@ -1981,9 +1979,7 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) * been set for the current field. */ int gotZero; /* Non-zero indicates that a zero flag has * been seen in the current field. */ -#ifndef TCL_WIDE_INT_IS_LONG int useWide; /* Value to be printed is Tcl_WideInt. */ -#endif /* TCL_WIDE_INT_IS_LONG */ /* * This procedure is a bit nasty. The goal is to use sprintf to @@ -2014,9 +2010,7 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) width = precision = noPercent = useShort = 0; gotZero = gotMinus = gotPrecision = 0; -#ifndef TCL_WIDE_INT_IS_LONG useWide = 0; -#endif /* TCL_WIDE_INT_IS_LONG */ whichValue = PTR_VALUE; /* @@ -2160,7 +2154,6 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) } } if (*format == 'l') { -#ifndef TCL_WIDE_INT_IS_LONG useWide = 1; /* * Only add a 'll' modifier for integer values as it makes @@ -2176,7 +2169,6 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) strcpy(newPtr, TCL_LL_MODIFIER); newPtr += TCL_LL_MODIFIER_SIZE; } -#endif /* TCL_WIDE_INT_IS_LONG */ format++; } else if (*format == 'h') { useShort = 1; @@ -2200,7 +2192,6 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) case 'X': size = 40 + precision; -#ifndef TCL_WIDE_INT_IS_LONG /* * Peek what kind of value we've got so as not to be * converting stuff unduly. [Bug #699060] @@ -2241,12 +2232,6 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) goto fmtError; } } -#else /* TCL_WIDE_INT_IS_LONG */ - if (Tcl_GetLongFromObj(interp, /* INTL: Tcl source. */ - objv[objIndex], &intValue) != TCL_OK) { - goto fmtError; - } -#endif /* !TCL_WIDE_INT_IS_LONG */ #if (LONG_MAX > INT_MAX) /* * Add the 'l' for long format type because we are on an @@ -2342,11 +2327,9 @@ Tcl_FormatObjCmd(dummy, interp, objc, objv) case DOUBLE_VALUE: sprintf(dst, newFormat, doubleValue); /* INTL: user locale. */ break; -#ifndef TCL_WIDE_INT_IS_LONG case WIDE_VALUE: sprintf(dst, newFormat, wideValue); break; -#endif /* TCL_WIDE_INT_IS_LONG */ case INT_VALUE: if (useShort) { sprintf(dst, newFormat, (short) intValue); diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 2c77649..48ddefb 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -15,7 +15,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdIL.c,v 1.47 2003/02/27 16:01:55 dkf Exp $ + * RCS: @(#) $Id: tclCmdIL.c,v 1.47.2.1 2003/04/16 23:31:43 dgp Exp $ */ #include "tclInt.h" @@ -323,12 +323,10 @@ Tcl_IncrObjCmd(dummy, interp, objc, objv) if (objc == 2) { incrAmount = 1; } else { -#ifdef TCL_WIDE_INT_IS_LONG if (Tcl_GetLongFromObj(interp, objv[2], &incrAmount) != TCL_OK) { Tcl_AddErrorInfo(interp, "\n (reading increment)"); return TCL_ERROR; } -#else /* * Need to be a bit cautious to ensure that [expr]-like rules * are enforced for interpretation of wide integers, despite @@ -337,7 +335,7 @@ Tcl_IncrObjCmd(dummy, interp, objc, objv) if (objv[2]->typePtr == &tclIntType) { incrAmount = objv[2]->internalRep.longValue; } else if (objv[2]->typePtr == &tclWideIntType) { - incrAmount = Tcl_WideAsLong(objv[2]->internalRep.wideValue); + TclGetLongFromWide(incrAmount,objv[2]); } else { Tcl_WideInt wide; @@ -352,7 +350,6 @@ Tcl_IncrObjCmd(dummy, interp, objc, objv) objv[2]->internalRep.longValue = incrAmount; } } -#endif } /* diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 18bba5d..e0dd860 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.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: tclExecute.c,v 1.94 2003/02/19 14:33:39 msofer Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.94.2.1 2003/04/16 23:31:43 dgp Exp $ */ #include "tclInt.h" @@ -258,18 +258,6 @@ long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 }; # define O2S(objPtr) #endif /* TCL_COMPILE_DEBUG */ - -/* - * Most of the code to support working with wide values is factored - * out here because it greatly reduces the number of conditionals - * through the rest of the file. Note that this needs to be - * conditional because we do not want to alter Tcl's behaviour on - * native-64bit platforms... - */ - -#ifndef TCL_WIDE_INT_IS_LONG -#define W0 Tcl_LongAsWide(0) - /* * Macro to read a string containing either a wide or an int and * decide which it is while decoding it at the same time. This @@ -297,19 +285,6 @@ long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 }; (objPtr)->internalRep.longValue = (longVar) \ = Tcl_WideAsLong(wideVar); \ } -#define IS_INTEGER_TYPE(typePtr) \ - ((typePtr) == &tclIntType || (typePtr) == &tclWideIntType) -/* - * Extract a double value from a general numeric object. - */ -#define GET_DOUBLE_VALUE(doubleVar, objPtr, typePtr) \ - if ((typePtr) == &tclIntType) { \ - (doubleVar) = (double) (objPtr)->internalRep.longValue; \ - } else if ((typePtr) == &tclWideIntType) { \ - (doubleVar) = Tcl_WideAsDouble((objPtr)->internalRep.wideValue);\ - } else { \ - (doubleVar) = (objPtr)->internalRep.doubleValue; \ - } /* * Combined with REQUIRE_WIDE_OR_INT, this gets a long value from * an obj. @@ -318,34 +293,37 @@ long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 }; if ((objPtr)->typePtr == &tclWideIntType) { \ (longVar) = Tcl_WideAsLong(wideVar); \ } +#define IS_INTEGER_TYPE(typePtr) \ + ((typePtr) == &tclIntType || (typePtr) == &tclWideIntType) +#define IS_NUMERIC_TYPE(typePtr) \ + (IS_INTEGER_TYPE(typePtr) || (typePtr) == &tclDoubleType) + +#define W0 Tcl_LongAsWide(0) /* * For tracing that uses wide values. */ -#define LLTRACE(a) TRACE(a) -#define LLTRACE_WITH_OBJ(a,b) TRACE_WITH_OBJ(a,b) #define LLD "%" TCL_LL_MODIFIER "d" -#else /* TCL_WIDE_INT_IS_LONG */ + +#ifndef TCL_WIDE_INT_IS_LONG /* - * Versions of the above that do not use wide values. + * Extract a double value from a general numeric object. */ -#define REQUIRE_WIDE_OR_INT(resultVar, objPtr, longVar, wideVar) \ - (resultVar) = Tcl_GetLongFromObj(interp, (objPtr), &(longVar)); -#define GET_WIDE_OR_INT(resultVar, objPtr, longVar, wideVar) \ - (resultVar) = Tcl_GetLongFromObj((Tcl_Interp *) NULL, (objPtr), \ - &(longVar)); -#define IS_INTEGER_TYPE(typePtr) ((typePtr) == &tclIntType) #define GET_DOUBLE_VALUE(doubleVar, objPtr, typePtr) \ if ((typePtr) == &tclIntType) { \ (doubleVar) = (double) (objPtr)->internalRep.longValue; \ + } else if ((typePtr) == &tclWideIntType) { \ + (doubleVar) = Tcl_WideAsDouble((objPtr)->internalRep.wideValue);\ + } else { \ + (doubleVar) = (objPtr)->internalRep.doubleValue; \ + } +#else /* TCL_WIDE_INT_IS_LONG */ +#define GET_DOUBLE_VALUE(doubleVar, objPtr, typePtr) \ + if (((typePtr) == &tclIntType) || ((typePtr) == &tclWideIntType)) { \ + (doubleVar) = (double) (objPtr)->internalRep.longValue; \ } else { \ (doubleVar) = (objPtr)->internalRep.doubleValue; \ } -#define FORCE_LONG(objPtr, longVar, wideVar) -#define LLTRACE(a) -#define LLTRACE_WITH_OBJ(a,b) #endif /* TCL_WIDE_INT_IS_LONG */ -#define IS_NUMERIC_TYPE(typePtr) \ - (IS_INTEGER_TYPE(typePtr) || (typePtr) == &tclDoubleType) /* * Declarations for local procedures to this file: @@ -371,10 +349,8 @@ static int ExprSrandFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, ClientData clientData)); static int ExprUnaryFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, ClientData clientData)); -#ifndef TCL_WIDE_INT_IS_LONG static int ExprWideFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, ClientData clientData)); -#endif /* TCL_WIDE_INT_IS_LONG */ #ifdef TCL_COMPILE_STATS static int EvalStatsCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, @@ -437,11 +413,7 @@ BuiltinFunc tclBuiltinFuncTable[] = { {"rand", 0, {TCL_EITHER}, ExprRandFunc, 0}, /* NOTE: rand takes no args. */ {"round", 1, {TCL_EITHER}, ExprRoundFunc, 0}, {"srand", 1, {TCL_INT}, ExprSrandFunc, 0}, -#ifdef TCL_WIDE_INT_IS_LONG - {"wide", 1, {TCL_EITHER}, ExprIntFunc, 0}, -#else {"wide", 1, {TCL_EITHER}, ExprWideFunc, 0}, -#endif /* TCL_WIDE_INT_IS_LONG */ {0}, }; @@ -1097,9 +1069,7 @@ TclExecuteByteCode(interp, codePtr) char *bytes; int length; long i = 0; /* Init. avoids compiler warning. */ -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt w; -#endif register int cleanup; Tcl_Obj *objResultPtr; char *part1, *part2; @@ -1909,10 +1879,8 @@ TclExecuteByteCode(interp, codePtr) valuePtr = stackPtr[stackTop]; if (valuePtr->typePtr == &tclIntType) { i = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - i = Tcl_WideAsLong(valuePtr->internalRep.wideValue); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetLongFromWide(i,valuePtr); } else { REQUIRE_WIDE_OR_INT(result, valuePtr, i, w); if (result != TCL_OK) { @@ -2099,10 +2067,9 @@ TclExecuteByteCode(interp, codePtr) b = (valuePtr->internalRep.longValue != 0); } else if (valuePtr->typePtr == &tclDoubleType) { b = (valuePtr->internalRep.doubleValue != 0.0); -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - b = (valuePtr->internalRep.wideValue != W0); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w,valuePtr); + b = (w != W0); } else { result = Tcl_GetBooleanFromObj(interp, valuePtr, &b); if (result != TCL_OK) { @@ -2154,27 +2121,20 @@ TclExecuteByteCode(interp, codePtr) if ((t1Ptr == &tclIntType) || (t1Ptr == &tclBooleanType)) { i1 = (valuePtr->internalRep.longValue != 0); -#ifndef TCL_WIDE_INT_IS_LONG } else if (t1Ptr == &tclWideIntType) { - i1 = (valuePtr->internalRep.wideValue != W0); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w,valuePtr); + i1 = (w != W0); } else if (t1Ptr == &tclDoubleType) { i1 = (valuePtr->internalRep.doubleValue != 0.0); } else { s = Tcl_GetStringFromObj(valuePtr, &length); if (TclLooksLikeInt(s, length)) { -#ifdef TCL_WIDE_INT_IS_LONG - result = Tcl_GetLongFromObj((Tcl_Interp *) NULL, - valuePtr, &i); - i1 = (i != 0); -#else /* !TCL_WIDE_INT_IS_LONG */ GET_WIDE_OR_INT(result, valuePtr, i, w); if (valuePtr->typePtr == &tclIntType) { i1 = (i != 0); } else { i1 = (w != W0); } -#endif /* TCL_WIDE_INT_IS_LONG */ } else { result = Tcl_GetBooleanFromObj((Tcl_Interp *) NULL, valuePtr, &i1); @@ -2190,27 +2150,20 @@ TclExecuteByteCode(interp, codePtr) if ((t2Ptr == &tclIntType) || (t2Ptr == &tclBooleanType)) { i2 = (value2Ptr->internalRep.longValue != 0); -#ifndef TCL_WIDE_INT_IS_LONG } else if (t2Ptr == &tclWideIntType) { - i2 = (value2Ptr->internalRep.wideValue != W0); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w,value2Ptr); + i2 = (w != W0); } else if (t2Ptr == &tclDoubleType) { i2 = (value2Ptr->internalRep.doubleValue != 0.0); } else { s = Tcl_GetStringFromObj(value2Ptr, &length); if (TclLooksLikeInt(s, length)) { -#ifdef TCL_WIDE_INT_IS_LONG - result = Tcl_GetLongFromObj((Tcl_Interp *) NULL, - value2Ptr, &i); - i2 = (i != 0); -#else /* !TCL_WIDE_INT_IS_LONG */ GET_WIDE_OR_INT(result, value2Ptr, i, w); if (value2Ptr->typePtr == &tclIntType) { i2 = (i != 0); } else { i2 = (w != W0); } -#endif /* TCL_WIDE_INT_IS_LONG */ } else { result = Tcl_GetBooleanFromObj((Tcl_Interp *) NULL, value2Ptr, &i2); } @@ -2825,7 +2778,6 @@ TclExecuteByteCode(interp, codePtr) iResult = d1 >= d2; break; } -#ifndef TCL_WIDE_INT_IS_LONG } else if ((t1Ptr == &tclWideIntType) || (t2Ptr == &tclWideIntType)) { Tcl_WideInt w2; @@ -2834,13 +2786,13 @@ TclExecuteByteCode(interp, codePtr) */ if (t1Ptr == &tclIntType) { w = Tcl_LongAsWide(valuePtr->internalRep.longValue); - w2 = value2Ptr->internalRep.wideValue; + TclGetWide(w2,value2Ptr); } else if (t2Ptr == &tclIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); w2 = Tcl_LongAsWide(value2Ptr->internalRep.longValue); } else { - w = valuePtr->internalRep.wideValue; - w2 = value2Ptr->internalRep.wideValue; + TclGetWide(w,valuePtr); + TclGetWide(w2,value2Ptr); } switch (*pc) { case INST_EQ: @@ -2862,7 +2814,6 @@ TclExecuteByteCode(interp, codePtr) iResult = w >= w2; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ } else { /* * Compare as ints. @@ -2929,19 +2880,15 @@ TclExecuteByteCode(interp, codePtr) long i2 = 0, rem, negative; long iResult = 0; /* Init. avoids compiler warning. */ -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt w2, wResult = W0; int doWide = 0; -#endif /* TCL_WIDE_INT_IS_LONG */ value2Ptr = stackPtr[stackTop]; valuePtr = stackPtr[stackTop - 1]; if (valuePtr->typePtr == &tclIntType) { i = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w,valuePtr); } else { /* try to convert to int */ REQUIRE_WIDE_OR_INT(result, valuePtr, i, w); if (result != TCL_OK) { @@ -2955,10 +2902,8 @@ TclExecuteByteCode(interp, codePtr) } if (value2Ptr->typePtr == &tclIntType) { i2 = value2Ptr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (value2Ptr->typePtr == &tclWideIntType) { - w2 = value2Ptr->internalRep.wideValue; -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w2,value2Ptr); } else { REQUIRE_WIDE_OR_INT(result, value2Ptr, i2, w2); if (result != TCL_OK) { @@ -2979,17 +2924,11 @@ TclExecuteByteCode(interp, codePtr) * remainder always has the same sign as the divisor and * a smaller absolute value. */ -#ifdef TCL_WIDE_INT_IS_LONG - if (i2 == 0) { - TRACE(("%ld %ld => DIVIDE BY ZERO\n", i, i2)); - goto divideByZero; - } -#else /* !TCL_WIDE_INT_IS_LONG */ if (value2Ptr->typePtr == &tclWideIntType && w2 == W0) { if (valuePtr->typePtr == &tclIntType) { - LLTRACE(("%ld "LLD" => DIVIDE BY ZERO\n", i, w2)); + TRACE(("%ld "LLD" => DIVIDE BY ZERO\n", i, w2)); } else { - LLTRACE((LLD" "LLD" => DIVIDE BY ZERO\n", w, w2)); + TRACE((LLD" "LLD" => DIVIDE BY ZERO\n", w, w2)); } goto divideByZero; } @@ -2997,13 +2936,11 @@ TclExecuteByteCode(interp, codePtr) if (valuePtr->typePtr == &tclIntType) { TRACE(("%ld %ld => DIVIDE BY ZERO\n", i, i2)); } else { - LLTRACE((LLD" %ld => DIVIDE BY ZERO\n", w, i2)); + TRACE((LLD" %ld => DIVIDE BY ZERO\n", w, i2)); } goto divideByZero; } -#endif /* TCL_WIDE_INT_IS_LONG */ negative = 0; -#ifndef TCL_WIDE_INT_IS_LONG if (valuePtr->typePtr == &tclWideIntType || value2Ptr->typePtr == &tclWideIntType) { Tcl_WideInt wRemainder; @@ -3031,7 +2968,6 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ if (i2 < 0) { i2 = -i2; i = -i; @@ -3047,7 +2983,6 @@ TclExecuteByteCode(interp, codePtr) iResult = rem; break; case INST_LSHIFT: -#ifndef TCL_WIDE_INT_IS_LONG /* * Shifts are never usefully 64-bits wide! */ @@ -3060,7 +2995,6 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ iResult = i << i2; break; case INST_RSHIFT: @@ -3069,7 +3003,6 @@ TclExecuteByteCode(interp, codePtr) * right shifts propagate the sign bit even on machines * where ">>" won't do it by default. */ -#ifndef TCL_WIDE_INT_IS_LONG /* * Shifts are never usefully 64-bits wide! */ @@ -3086,7 +3019,6 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ if (i < 0) { iResult = ~((~i) >> i2); } else { @@ -3094,7 +3026,6 @@ TclExecuteByteCode(interp, codePtr) } break; case INST_BITOR: -#ifndef TCL_WIDE_INT_IS_LONG if (valuePtr->typePtr == &tclWideIntType || value2Ptr->typePtr == &tclWideIntType) { /* @@ -3109,11 +3040,9 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ iResult = i | i2; break; case INST_BITXOR: -#ifndef TCL_WIDE_INT_IS_LONG if (valuePtr->typePtr == &tclWideIntType || value2Ptr->typePtr == &tclWideIntType) { /* @@ -3128,11 +3057,9 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ iResult = i ^ i2; break; case INST_BITAND: -#ifndef TCL_WIDE_INT_IS_LONG if (valuePtr->typePtr == &tclWideIntType || value2Ptr->typePtr == &tclWideIntType) { /* @@ -3147,7 +3074,6 @@ TclExecuteByteCode(interp, codePtr) doWide = 1; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ iResult = i & i2; break; } @@ -3157,30 +3083,22 @@ TclExecuteByteCode(interp, codePtr) */ if (Tcl_IsShared(valuePtr)) { -#ifndef TCL_WIDE_INT_IS_LONG if (doWide) { objResultPtr = Tcl_NewWideIntObj(wResult); - LLTRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); + TRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); } else { -#endif /* TCL_WIDE_INT_IS_LONG */ objResultPtr = Tcl_NewLongObj(iResult); TRACE(("%ld %ld => %ld\n", i, i2, iResult)); -#ifndef TCL_WIDE_INT_IS_LONG } -#endif /* TCL_WIDE_INT_IS_LONG */ NEXT_INST_F(1, 2, 1); } else { /* reuse the valuePtr object */ -#ifndef TCL_WIDE_INT_IS_LONG if (doWide) { - LLTRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); + TRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); Tcl_SetWideIntObj(valuePtr, wResult); } else { -#endif /* TCL_WIDE_INT_IS_LONG */ TRACE(("%ld %ld => %ld\n", i, i2, iResult)); Tcl_SetLongObj(valuePtr, iResult); -#ifndef TCL_WIDE_INT_IS_LONG } -#endif /* TCL_WIDE_INT_IS_LONG */ NEXT_INST_F(1, 1, 0); } } @@ -3201,11 +3119,9 @@ TclExecuteByteCode(interp, codePtr) long iResult = 0; /* Init. avoids compiler warning. */ double dResult = 0.0; /* Init. avoids compiler warning. */ int doDouble = 0; /* 1 if doing floating arithmetic */ -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt w2, wquot, wrem; Tcl_WideInt wResult = W0; /* Init. avoids compiler warning. */ int doWide = 0; /* 1 if doing wide arithmetic. */ -#endif /* TCL_WIDE_INT_IS_LONG */ value2Ptr = stackPtr[stackTop]; valuePtr = stackPtr[stackTop - 1]; @@ -3214,10 +3130,8 @@ TclExecuteByteCode(interp, codePtr) if (t1Ptr == &tclIntType) { i = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (t1Ptr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w,valuePtr); } else if ((t1Ptr == &tclDoubleType) && (valuePtr->bytes == NULL)) { /* @@ -3248,10 +3162,8 @@ TclExecuteByteCode(interp, codePtr) if (t2Ptr == &tclIntType) { i2 = value2Ptr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (t2Ptr == &tclWideIntType) { - w2 = value2Ptr->internalRep.wideValue; -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetWide(w2,value2Ptr); } else if ((t2Ptr == &tclDoubleType) && (value2Ptr->bytes == NULL)) { /* @@ -3289,12 +3201,10 @@ TclExecuteByteCode(interp, codePtr) d1 = i; /* promote value 1 to double */ } else if (t2Ptr == &tclIntType) { d2 = i2; /* promote value 2 to double */ -#ifndef TCL_WIDE_INT_IS_LONG } else if (t1Ptr == &tclWideIntType) { d1 = Tcl_WideAsDouble(w); } else if (t2Ptr == &tclWideIntType) { d2 = Tcl_WideAsDouble(w2); -#endif /* TCL_WIDE_INT_IS_LONG */ } switch (*pc) { case INST_ADD: @@ -3326,7 +3236,6 @@ TclExecuteByteCode(interp, codePtr) result = TCL_ERROR; goto checkForCatch; } -#ifndef TCL_WIDE_INT_IS_LONG } else if ((t1Ptr == &tclWideIntType) || (t2Ptr == &tclWideIntType)) { /* @@ -3356,7 +3265,7 @@ TclExecuteByteCode(interp, codePtr) * divisor and a smaller absolute value. */ if (w2 == W0) { - LLTRACE((LLD" "LLD" => DIVIDE BY ZERO\n", w, w2)); + TRACE((LLD" "LLD" => DIVIDE BY ZERO\n", w, w2)); goto divideByZero; } if (w2 < 0) { @@ -3371,7 +3280,6 @@ TclExecuteByteCode(interp, codePtr) wResult = wquot; break; } -#endif /* TCL_WIDE_INT_IS_LONG */ } else { /* * Do integer arithmetic. @@ -3419,11 +3327,9 @@ TclExecuteByteCode(interp, codePtr) if (doDouble) { objResultPtr = Tcl_NewDoubleObj(dResult); TRACE(("%.6g %.6g => %.6g\n", d1, d2, dResult)); -#ifndef TCL_WIDE_INT_IS_LONG } else if (doWide) { objResultPtr = Tcl_NewWideIntObj(wResult); - LLTRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); -#endif /* TCL_WIDE_INT_IS_LONG */ + TRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); } else { objResultPtr = Tcl_NewLongObj(iResult); TRACE(("%ld %ld => %ld\n", i, i2, iResult)); @@ -3433,11 +3339,9 @@ TclExecuteByteCode(interp, codePtr) if (doDouble) { /* NB: stack top is off by 1 */ TRACE(("%.6g %.6g => %.6g\n", d1, d2, dResult)); Tcl_SetDoubleObj(valuePtr, dResult); -#ifndef TCL_WIDE_INT_IS_LONG } else if (doWide) { - LLTRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); + TRACE((LLD" "LLD" => "LLD"\n", w, w2, wResult)); Tcl_SetWideIntObj(valuePtr, wResult); -#endif /* TCL_WIDE_INT_IS_LONG */ } else { TRACE(("%ld %ld => %ld\n", i, i2, iResult)); Tcl_SetLongObj(valuePtr, iResult); @@ -3487,11 +3391,9 @@ TclExecuteByteCode(interp, codePtr) if (tPtr == &tclIntType) { i = valuePtr->internalRep.longValue; objResultPtr = Tcl_NewLongObj(i); -#ifndef TCL_WIDE_INT_IS_LONG } else if (tPtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); objResultPtr = Tcl_NewWideIntObj(w); -#endif /* TCL_WIDE_INT_IS_LONG */ } else { d = valuePtr->internalRep.doubleValue; objResultPtr = Tcl_NewDoubleObj(d); @@ -3559,16 +3461,14 @@ TclExecuteByteCode(interp, codePtr) objResultPtr = Tcl_NewLongObj( (*pc == INST_UMINUS)? -i : !i); TRACE_WITH_OBJ(("%ld => ", i), objResultPtr); -#ifndef TCL_WIDE_INT_IS_LONG } else if (tPtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); if (*pc == INST_UMINUS) { objResultPtr = Tcl_NewWideIntObj(-w); } else { objResultPtr = Tcl_NewLongObj(w == W0); } - LLTRACE_WITH_OBJ((LLD" => ", w), objResultPtr); -#endif /* TCL_WIDE_INT_IS_LONG */ + TRACE_WITH_OBJ((LLD" => ", w), objResultPtr); } else { d = valuePtr->internalRep.doubleValue; if (*pc == INST_UMINUS) { @@ -3592,16 +3492,14 @@ TclExecuteByteCode(interp, codePtr) Tcl_SetLongObj(valuePtr, (*pc == INST_UMINUS)? -i : !i); TRACE_WITH_OBJ(("%ld => ", i), valuePtr); -#ifndef TCL_WIDE_INT_IS_LONG } else if (tPtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); if (*pc == INST_UMINUS) { Tcl_SetWideIntObj(valuePtr, -w); } else { Tcl_SetLongObj(valuePtr, w == W0); } - LLTRACE_WITH_OBJ((LLD" => ", w), valuePtr); -#endif /* TCL_WIDE_INT_IS_LONG */ + TRACE_WITH_OBJ((LLD" => ", w), valuePtr); } else { d = valuePtr->internalRep.doubleValue; if (*pc == INST_UMINUS) { @@ -3642,23 +3540,21 @@ TclExecuteByteCode(interp, codePtr) } } -#ifndef TCL_WIDE_INT_IS_LONG if (valuePtr->typePtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); if (Tcl_IsShared(valuePtr)) { objResultPtr = Tcl_NewWideIntObj(~w); - LLTRACE(("0x%llx => (%llu)\n", w, ~w)); + TRACE(("0x%llx => (%llu)\n", w, ~w)); NEXT_INST_F(1, 1, 1); } else { /* * valuePtr is unshared. Modify it directly. */ Tcl_SetWideIntObj(valuePtr, ~w); - LLTRACE(("0x%llx => (%llu)\n", w, ~w)); + TRACE(("0x%llx => (%llu)\n", w, ~w)); NEXT_INST_F(1, 0, 0); } } else { -#endif /* TCL_WIDE_INT_IS_LONG */ i = valuePtr->internalRep.longValue; if (Tcl_IsShared(valuePtr)) { objResultPtr = Tcl_NewLongObj(~i); @@ -3672,9 +3568,7 @@ TclExecuteByteCode(interp, codePtr) TRACE(("0x%lx => (%lu)\n", i, ~i)); NEXT_INST_F(1, 0, 0); } -#ifndef TCL_WIDE_INT_IS_LONG } -#endif /* TCL_WIDE_INT_IS_LONG */ } case INST_CALL_BUILTIN_FUNC1: @@ -3788,11 +3682,9 @@ TclExecuteByteCode(interp, codePtr) if (tPtr == &tclIntType) { i = valuePtr->internalRep.longValue; objResultPtr = Tcl_NewLongObj(i); -#ifndef TCL_WIDE_INT_IS_LONG } else if (tPtr == &tclWideIntType) { - w = valuePtr->internalRep.wideValue; + TclGetWide(w,valuePtr); objResultPtr = Tcl_NewWideIntObj(w); -#endif /* TCL_WIDE_INT_IS_LONG */ } else { d = valuePtr->internalRep.doubleValue; objResultPtr = Tcl_NewDoubleObj(d); @@ -4760,13 +4652,8 @@ VerifyExprObjType(interp, objPtr) char *s = Tcl_GetStringFromObj(objPtr, &length); if (TclLooksLikeInt(s, length)) { -#ifdef TCL_WIDE_INT_IS_LONG - long i; - result = Tcl_GetLongFromObj((Tcl_Interp *) NULL, objPtr, &i); -#else /* !TCL_WIDE_INT_IS_LONG */ Tcl_WideInt w; result = Tcl_GetWideIntFromObj((Tcl_Interp *) NULL, objPtr, &w); -#endif /* TCL_WIDE_INT_IS_LONG */ } else { double d; result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL, objPtr, &d); @@ -4991,9 +4878,9 @@ ExprAbsFunc(interp, eePtr, clientData) iResult = i; } PUSH_OBJECT(Tcl_NewLongObj(iResult)); -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - Tcl_WideInt wResult, w = valuePtr->internalRep.wideValue; + Tcl_WideInt wResult, w; + TclGetWide(w,valuePtr); if (w < W0) { wResult = -w; if (wResult < 0) { @@ -5009,7 +4896,6 @@ ExprAbsFunc(interp, eePtr, clientData) wResult = w; } PUSH_OBJECT(Tcl_NewWideIntObj(wResult)); -#endif /* TCL_WIDE_INT_IS_LONG */ } else { d = valuePtr->internalRep.doubleValue; if (d < 0.0) { @@ -5120,10 +5006,8 @@ ExprIntFunc(interp, eePtr, clientData) if (valuePtr->typePtr == &tclIntType) { iResult = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - iResult = Tcl_WideAsLong(valuePtr->internalRep.wideValue); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetLongFromWide(iResult,valuePtr); } else { d = valuePtr->internalRep.doubleValue; if (d < 0.0) { @@ -5166,7 +5050,6 @@ ExprIntFunc(interp, eePtr, clientData) return result; } -#ifndef TCL_WIDE_INT_IS_LONG static int ExprWideFunc(interp, eePtr, clientData) Tcl_Interp *interp; /* The interpreter in which to execute the @@ -5201,7 +5084,7 @@ ExprWideFunc(interp, eePtr, clientData) } if (valuePtr->typePtr == &tclWideIntType) { - wResult = valuePtr->internalRep.wideValue; + TclGetWide(wResult,valuePtr); } else if (valuePtr->typePtr == &tclIntType) { wResult = Tcl_LongAsWide(valuePtr->internalRep.longValue); } else { @@ -5245,7 +5128,6 @@ ExprWideFunc(interp, eePtr, clientData) DECACHE_STACK_INFO(); return result; } -#endif /* TCL_WIDE_INT_IS_LONG */ static int ExprRandFunc(interp, eePtr, clientData) @@ -5383,11 +5265,11 @@ ExprRoundFunc(interp, eePtr, clientData) if (valuePtr->typePtr == &tclIntType) { iResult = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - PUSH_OBJECT(Tcl_NewWideIntObj(valuePtr->internalRep.wideValue)); + Tcl_WideInt w; + TclGetWide(w,valuePtr); + PUSH_OBJECT(Tcl_NewWideIntObj(w)); goto done; -#endif /* TCL_WIDE_INT_IS_LONG */ } else { d = valuePtr->internalRep.doubleValue; if (d < 0.0) { @@ -5466,10 +5348,8 @@ ExprSrandFunc(interp, eePtr, clientData) if (valuePtr->typePtr == &tclIntType) { i = valuePtr->internalRep.longValue; -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - i = Tcl_WideAsLong(valuePtr->internalRep.wideValue); -#endif /* TCL_WIDE_INT_IS_LONG */ + TclGetLongFromWide(i,valuePtr); } else { /* * At this point, the only other possible type is double @@ -5606,39 +5486,34 @@ ExprCallMathFunc(interp, eePtr, objc, objv) if (mathFuncPtr->argTypes[k] == TCL_DOUBLE) { args[k].type = TCL_DOUBLE; args[k].doubleValue = i; -#ifndef TCL_WIDE_INT_IS_LONG } else if (mathFuncPtr->argTypes[k] == TCL_WIDE_INT) { args[k].type = TCL_WIDE_INT; args[k].wideValue = Tcl_LongAsWide(i); -#endif /* !TCL_WIDE_INT_IS_LONG */ } else { args[k].type = TCL_INT; args[k].intValue = i; } -#ifndef TCL_WIDE_INT_IS_LONG } else if (valuePtr->typePtr == &tclWideIntType) { - Tcl_WideInt w = valuePtr->internalRep.wideValue; + Tcl_WideInt w; + TclGetWide(w,valuePtr); if (mathFuncPtr->argTypes[k] == TCL_DOUBLE) { args[k].type = TCL_DOUBLE; - args[k].wideValue = (Tcl_WideInt) Tcl_WideAsDouble(w); + args[k].doubleValue = (Tcl_WideInt) Tcl_WideAsDouble(w); } else if (mathFuncPtr->argTypes[k] == TCL_INT) { args[k].type = TCL_INT; - args[k].wideValue = Tcl_WideAsLong(w); + args[k].intValue = Tcl_WideAsLong(w); } else { args[k].type = TCL_WIDE_INT; args[k].wideValue = w; } -#endif /* !TCL_WIDE_INT_IS_LONG */ } else { d = valuePtr->internalRep.doubleValue; if (mathFuncPtr->argTypes[k] == TCL_INT) { args[k].type = TCL_INT; args[k].intValue = (long) d; -#ifndef TCL_WIDE_INT_IS_LONG } else if (mathFuncPtr->argTypes[k] == TCL_WIDE_INT) { args[k].type = TCL_WIDE_INT; args[k].wideValue = Tcl_DoubleAsWide(d); -#endif /* !TCL_WIDE_INT_IS_LONG */ } else { args[k].type = TCL_DOUBLE; args[k].doubleValue = d; @@ -5672,10 +5547,8 @@ ExprCallMathFunc(interp, eePtr, objc, objv) if (funcResult.type == TCL_INT) { PUSH_OBJECT(Tcl_NewLongObj(funcResult.intValue)); -#ifndef TCL_WIDE_INT_IS_LONG } else if (funcResult.type == TCL_WIDE_INT) { PUSH_OBJECT(Tcl_NewWideIntObj(funcResult.wideValue)); -#endif /* !TCL_WIDE_INT_IS_LONG */ } else { d = funcResult.doubleValue; if (IS_NAN(d) || IS_INF(d)) { diff --git a/generic/tclInt.h b/generic/tclInt.h index 077c65b..39343aa 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -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: tclInt.h,v 1.118.2.2 2003/03/21 03:24:08 dgp Exp $ + * RCS: @(#) $Id: tclInt.h,v 1.118.2.3 2003/04/16 23:31:44 dgp Exp $ */ #ifndef _TCLINT @@ -1564,9 +1564,7 @@ extern Tcl_ObjType tclStringType; extern Tcl_ObjType tclArraySearchType; extern Tcl_ObjType tclIndexType; extern Tcl_ObjType tclNsNameType; -#ifndef TCL_WIDE_INT_IS_LONG extern Tcl_ObjType tclWideIntType; -#endif /* * Variables denoting the hash key types defined in the core. @@ -2211,6 +2209,26 @@ extern Tcl_Mutex tclObjMutex; /* *---------------------------------------------------------------- + * Macro used by the Tcl core to get a Tcl_WideInt value out of + * a Tcl_Obj of the "wideInt" type. Different implementation on + * different platforms depending whether TCL_WIDE_INT_IS_LONG. + *---------------------------------------------------------------- + */ + +#ifdef TCL_WIDE_INT_IS_LONG +# define TclGetWide(resultVar, objPtr) \ + (resultVar) = (objPtr)->internalRep.longValue +# define TclGetLongFromWide(resultVar, objPtr) \ + (resultVar) = (objPtr)->internalRep.longValue +#else +# define TclGetWide(resultVar, objPtr) \ + (resultVar) = (objPtr)->internalRep.wideValue +# define TclGetLongFromWide(resultVar, objPtr) \ + (resultVar) = Tcl_WideAsLong((objPtr)->internalRep.wideValue) +#endif + +/* + *---------------------------------------------------------------- * Macro used by the Tcl core get a unicode char from a utf string. * It checks to see if we have a one-byte utf char before calling * the real Tcl_UtfToUniChar, as this will save a lot of time for diff --git a/generic/tclObj.c b/generic/tclObj.c index 6320060..050dfb6 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.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: tclObj.c,v 1.42.2.1 2003/04/07 12:27:30 dkf Exp $ + * RCS: @(#) $Id: tclObj.c,v 1.42.2.2 2003/04/16 23:31:45 dgp Exp $ */ #include "tclInt.h" @@ -63,9 +63,9 @@ static int SetIntFromAny _ANSI_ARGS_((Tcl_Interp *interp, static void UpdateStringOfBoolean _ANSI_ARGS_((Tcl_Obj *objPtr)); static void UpdateStringOfDouble _ANSI_ARGS_((Tcl_Obj *objPtr)); static void UpdateStringOfInt _ANSI_ARGS_((Tcl_Obj *objPtr)); -#ifndef TCL_WIDE_INT_IS_LONG static int SetWideIntFromAny _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); +#ifndef TCL_WIDE_INT_IS_LONG static void UpdateStringOfWideInt _ANSI_ARGS_((Tcl_Obj *objPtr)); #endif @@ -132,11 +132,10 @@ Tcl_ObjType tclWideIntType = { (Tcl_DupInternalRepProc *) NULL, /* dupIntRepProc */ #ifdef TCL_WIDE_INT_IS_LONG UpdateStringOfInt, /* updateStringProc */ - SetIntFromAny /* setFromAnyProc */ #else /* !TCL_WIDE_INT_IS_LONG */ UpdateStringOfWideInt, /* updateStringProc */ - SetWideIntFromAny /* setFromAnyProc */ #endif + SetWideIntFromAny /* setFromAnyProc */ }; /* @@ -2136,12 +2135,12 @@ Tcl_GetLongFromObj(interp, objPtr, longPtr) *---------------------------------------------------------------------- */ -#ifndef TCL_WIDE_INT_IS_LONG static int SetWideIntFromAny(interp, objPtr) Tcl_Interp *interp; /* Used for error reporting if not NULL. */ register Tcl_Obj *objPtr; /* The object to convert. */ { +#ifndef TCL_WIDE_INT_IS_LONG Tcl_ObjType *oldTypePtr = objPtr->typePtr; char *string, *end; int length; @@ -2227,10 +2226,14 @@ SetWideIntFromAny(interp, objPtr) } objPtr->internalRep.wideValue = newWide; +#else + if (TCL_ERROR == SetIntFromAny(interp, objPtr)) { + return TCL_ERROR; + } +#endif objPtr->typePtr = &tclWideIntType; return TCL_OK; } -#endif /* *---------------------------------------------------------------------- @@ -2317,9 +2320,6 @@ Tcl_NewWideIntObj(wideValue) register Tcl_WideInt wideValue; /* Wide integer used to initialize * the new object. */ { -#ifdef TCL_WIDE_INT_IS_LONG - return Tcl_NewLongObj(wideValue); -#else register Tcl_Obj *objPtr; TclNewObj(objPtr); @@ -2328,7 +2328,6 @@ Tcl_NewWideIntObj(wideValue) objPtr->internalRep.wideValue = wideValue; objPtr->typePtr = &tclWideIntType; return objPtr; -#endif /* TCL_WIDE_INT_IS_LONG */ } #endif /* if TCL_MEM_DEBUG */ @@ -2378,9 +2377,6 @@ Tcl_DbNewWideIntObj(wideValue, file, line) int line; /* Line number in the source file; * used for debugging. */ { -#ifdef TCL_WIDE_INT_IS_LONG - return Tcl_DbNewLongObj(wideValue, file, line); -#else register Tcl_Obj *objPtr; TclDbNewObj(objPtr, file, line); @@ -2389,7 +2385,6 @@ Tcl_DbNewWideIntObj(wideValue, file, line) objPtr->internalRep.wideValue = wideValue; objPtr->typePtr = &tclWideIntType; return objPtr; -#endif } #else /* if not TCL_MEM_DEBUG */ @@ -2432,9 +2427,6 @@ Tcl_SetWideIntObj(objPtr, wideValue) register Tcl_WideInt wideValue; /* Wide integer used to initialize * the object's value. */ { -#ifdef TCL_WIDE_INT_IS_LONG - Tcl_SetLongObj(objPtr, wideValue); -#else register Tcl_ObjType *oldTypePtr = objPtr->typePtr; if (Tcl_IsShared(objPtr)) { @@ -2448,7 +2440,6 @@ Tcl_SetWideIntObj(objPtr, wideValue) objPtr->internalRep.wideValue = wideValue; objPtr->typePtr = &tclWideIntType; Tcl_InvalidateStringRep(objPtr); -#endif } /* @@ -2478,12 +2469,6 @@ Tcl_GetWideIntFromObj(interp, objPtr, wideIntPtr) register Tcl_Obj *objPtr; /* Object from which to get a wide int. */ register Tcl_WideInt *wideIntPtr; /* Place to store resulting long. */ { -#ifdef TCL_WIDE_INT_IS_LONG - /* - * Next line is type-safe because we only do this when long = Tcl_WideInt - */ - return Tcl_GetLongFromObj(interp, objPtr, wideIntPtr); -#else register int result; if (objPtr->typePtr == &tclWideIntType) { @@ -2495,7 +2480,6 @@ Tcl_GetWideIntFromObj(interp, objPtr, wideIntPtr) *wideIntPtr = objPtr->internalRep.wideValue; } return result; -#endif } /* diff --git a/generic/tclPort.h b/generic/tclPort.h index 930ae1d..d724c73 100644 --- a/generic/tclPort.h +++ b/generic/tclPort.h @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclPort.h,v 1.6 2002/02/15 14:28:49 dkf Exp $ + * RCS: @(#) $Id: tclPort.h,v 1.6.2.1 2003/04/16 23:31:46 dgp Exp $ */ #ifndef _TCLPORT @@ -28,12 +28,16 @@ # endif #endif -#if !defined(TCL_WIDE_INT_IS_LONG) && !defined(LLONG_MIN) -# ifdef LLONG_BIT -# define LLONG_MIN ((Tcl_WideInt)(Tcl_LongAsWide(1)<<(LLONG_BIT-1))) +#if !defined(LLONG_MIN) +# ifdef TCL_WIDE_INT_IS_LONG +# define LLONG_MIN LONG_MIN # else +# ifdef LLONG_BIT +# define LLONG_MIN ((Tcl_WideInt)(Tcl_LongAsWide(1)<<(LLONG_BIT-1))) +# else /* Assume we're on a system with a 64-bit 'long long' type */ -# define LLONG_MIN ((Tcl_WideInt)(Tcl_LongAsWide(1)<<63)) +# define LLONG_MIN ((Tcl_WideInt)(Tcl_LongAsWide(1)<<63)) +# endif # endif /* Assume that if LLONG_MIN is undefined, then so is LLONG_MAX */ # define LLONG_MAX (~LLONG_MIN) diff --git a/generic/tclTest.c b/generic/tclTest.c index ed7e0ad..327c470 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -14,7 +14,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclTest.c,v 1.62 2003/02/18 10:13:25 vincentdarley Exp $ + * RCS: @(#) $Id: tclTest.c,v 1.62.2.1 2003/04/16 23:31:46 dgp Exp $ */ #define TCL_TEST @@ -2795,14 +2795,12 @@ TestMathFunc2(clientData, interp, args, resultPtr) resultPtr->type = TCL_DOUBLE; resultPtr->doubleValue = ((d0 > d1)? d0 : d1); -#ifndef TCL_WIDE_INT_IS_LONG } else if (args[1].type == TCL_WIDE_INT) { Tcl_WideInt w0 = Tcl_LongAsWide(i0); Tcl_WideInt w1 = args[1].wideValue; resultPtr->type = TCL_WIDE_INT; resultPtr->wideValue = ((w0 > w1)? w0 : w1); -#endif } else { Tcl_SetResult(interp, "T3: wrong type for arg 2", TCL_STATIC); result = TCL_ERROR; @@ -2820,18 +2818,15 @@ TestMathFunc2(clientData, interp, args, resultPtr) resultPtr->type = TCL_DOUBLE; resultPtr->doubleValue = ((d0 > d1)? d0 : d1); -#ifndef TCL_WIDE_INT_IS_LONG } else if (args[1].type == TCL_WIDE_INT) { double d1 = Tcl_WideAsDouble(args[1].wideValue); resultPtr->type = TCL_DOUBLE; resultPtr->doubleValue = ((d0 > d1)? d0 : d1); -#endif } else { Tcl_SetResult(interp, "T3: wrong type for arg 2", TCL_STATIC); result = TCL_ERROR; } -#ifndef TCL_WIDE_INT_IS_LONG } else if (args[0].type == TCL_WIDE_INT) { Tcl_WideInt w0 = args[0].wideValue; @@ -2855,7 +2850,6 @@ TestMathFunc2(clientData, interp, args, resultPtr) Tcl_SetResult(interp, "T3: wrong type for arg 2", TCL_STATIC); result = TCL_ERROR; } -#endif } else { Tcl_SetResult(interp, "T3: wrong type for arg 1", TCL_STATIC); result = TCL_ERROR; diff --git a/generic/tclUtil.c b/generic/tclUtil.c index a4d783b..2572891 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.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: tclUtil.c,v 1.36 2002/11/19 02:34:50 hobbs Exp $ + * RCS: @(#) $Id: tclUtil.c,v 1.36.2.1 2003/04/16 23:31:46 dgp Exp $ */ #include "tclInt.h" @@ -2220,9 +2220,7 @@ TclGetIntForIndex(interp, objPtr, endValue, indexPtr) { char *bytes; int offset; -#ifndef TCL_WIDE_INT_IS_LONG Tcl_WideInt wideOffset; -#endif /* * If the object is already an integer, use it. @@ -2237,16 +2235,14 @@ TclGetIntForIndex(interp, objPtr, endValue, indexPtr) * If the object is already a wide-int, and it is not out of range * for an integer, use it. [Bug #526717] */ -#ifndef TCL_WIDE_INT_IS_LONG if (objPtr->typePtr == &tclWideIntType) { - Tcl_WideInt wideOffset = objPtr->internalRep.wideValue; + TclGetWide(wideOffset,objPtr); if (wideOffset >= Tcl_LongAsWide(INT_MIN) && wideOffset <= Tcl_LongAsWide(INT_MAX)) { *indexPtr = (int) Tcl_WideAsLong(wideOffset); return TCL_OK; } } -#endif /* TCL_WIDE_INT_IS_LONG */ if (SetEndOffsetFromAny(NULL, objPtr) == TCL_OK) { /* @@ -2256,15 +2252,6 @@ TclGetIntForIndex(interp, objPtr, endValue, indexPtr) *indexPtr = endValue + objPtr->internalRep.longValue; -#ifdef TCL_WIDE_INT_IS_LONG - } else if (Tcl_GetIntFromObj(NULL, objPtr, &offset) == TCL_OK) { - /* - * If the object can be converted to an integer, use that. - */ - - *indexPtr = offset; - -#else /* !TCL_WIDE_INT_IS_LONG */ } else if (Tcl_GetWideIntFromObj(NULL, objPtr, &wideOffset) == TCL_OK) { /* * If the object can be converted to a wide integer, use @@ -2283,7 +2270,6 @@ TclGetIntForIndex(interp, objPtr, endValue, indexPtr) } *indexPtr = offset; -#endif /* TCL_WIDE_INT_IS_LONG */ } else { /* * Report a parse error. diff --git a/generic/tclVar.c b/generic/tclVar.c index d3778c6..f9957fe 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -15,7 +15,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclVar.c,v 1.69.2.1 2003/03/24 00:55:16 msofer Exp $ + * RCS: @(#) $Id: tclVar.c,v 1.69.2.2 2003/04/16 23:31:47 dgp Exp $ */ #include "tclInt.h" @@ -1839,17 +1839,9 @@ TclPtrIncrVar(interp, varPtr, arrayPtr, part1, part2, incrAmount, flags) varValuePtr = Tcl_DuplicateObj(varValuePtr); createdNewObj = 1; } -#ifdef TCL_WIDE_INT_IS_LONG - if (Tcl_GetLongFromObj(interp, varValuePtr, &i) != TCL_OK) { - if (createdNewObj) { - Tcl_DecrRefCount(varValuePtr); /* free unneeded copy */ - } - return NULL; - } - Tcl_SetLongObj(varValuePtr, (i + incrAmount)); -#else if (varValuePtr->typePtr == &tclWideIntType) { - Tcl_WideInt wide = varValuePtr->internalRep.wideValue; + Tcl_WideInt wide; + TclGetWide(wide,varValuePtr); Tcl_SetWideIntObj(varValuePtr, wide + Tcl_LongAsWide(incrAmount)); } else if (varValuePtr->typePtr == &tclIntType) { i = varValuePtr->internalRep.longValue; @@ -1872,7 +1864,6 @@ TclPtrIncrVar(interp, varPtr, arrayPtr, part1, part2, incrAmount, flags) Tcl_SetWideIntObj(varValuePtr, wide + Tcl_LongAsWide(incrAmount)); } } -#endif /* * Store the variable's new value and run any write traces. -- cgit v0.12