diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-02-06 09:41:13 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-02-06 09:41:13 (GMT) |
| commit | 07e94bea99230a585a50de7ec548831e13bf79f7 (patch) | |
| tree | 38094007d066fbaac0b322f4141c68e6c3bf33bc | |
| parent | 37d802b47761cf0ae7efc4820b18a5d6e1ecda62 (diff) | |
| download | tcl-07e94bea99230a585a50de7ec548831e13bf79f7.zip tcl-07e94bea99230a585a50de7ec548831e13bf79f7.tar.gz tcl-07e94bea99230a585a50de7ec548831e13bf79f7.tar.bz2 | |
Fix util-18.13/util-18.14 constraint, which masked the wrong result on 64-bit windows. Fixed that as well.
| -rw-r--r-- | generic/tclStringObj.c | 38 | ||||
| -rw-r--r-- | tests/util.test | 6 |
2 files changed, 24 insertions, 20 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 25f8a61..54060c0 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -3018,25 +3018,29 @@ Tcl_Format( */ static Tcl_Obj * -NewIntObj( +NewLongObj( char c, - Tcl_WideUInt max, - Tcl_WideInt value) + long value) { - if (!((max+1) & (Tcl_WideUInt)value)) { - /* sign-bit is not set, so handle the positive value */ - return Tcl_NewWideIntObj(value & (Tcl_WideInt)max); + if ((value < 0) && strchr("puoxX", c)) { + Tcl_Obj *obj; + TclNewUIntObj(obj, (unsigned long)value); + return obj; } + return Tcl_NewWideIntObj((long)value); +} - if (strchr("puoxX", c) && (max == WIDE_MAX)) { - /* Value > WIDE_MAX, so we need to use bignum */ - mp_int bignumValue; - if (mp_init_u64(&bignumValue, (uint64_t)value) != MP_OKAY) { - Tcl_Panic("%s: memory overflow", "AppendPrintfToObjVA"); - } - return Tcl_NewBignumObj(&bignumValue); +static Tcl_Obj * +NewWideIntObj( + char c, + Tcl_WideInt value) +{ + if ((value < 0) && strchr("puoxX", c)) { + Tcl_Obj *obj; + TclNewUIntObj(obj, (Tcl_WideUInt)value); + return obj; } - return Tcl_NewWideIntObj(value | ~(Tcl_WideInt)max); + return Tcl_NewWideIntObj(value); } static void @@ -3122,15 +3126,15 @@ AppendPrintfToObjVA( switch (size) { case -1: case 0: - Tcl_ListObjAppendElement(NULL, list, NewIntObj(*p, INT_MAX, + Tcl_ListObjAppendElement(NULL, list, Tcl_NewIntObj( va_arg(argList, int))); break; case 1: - Tcl_ListObjAppendElement(NULL, list, NewIntObj(*p, LONG_MAX, + Tcl_ListObjAppendElement(NULL, list, NewLongObj(*p, va_arg(argList, long))); break; case 2: - Tcl_ListObjAppendElement(NULL, list, NewIntObj(*p, WIDE_MAX, + Tcl_ListObjAppendElement(NULL, list, NewWideIntObj(*p, va_arg(argList, Tcl_WideInt))); break; case 3: diff --git a/tests/util.test b/tests/util.test index b643b13..04ee73d 100644 --- a/tests/util.test +++ b/tests/util.test @@ -23,7 +23,7 @@ testConstraint testdoubledigits [llength [info commands testdoubledigits]] testConstraint testprint [llength [info commands testprint]] testConstraint precision [expr {![catch {set saved_precision $::tcl_precision}]}] -testConstraint pointerIs64bit [expr {$tcl_platform(pointerSize) >= 8}] +testConstraint longIs64bit [expr {$tcl_platform(wordSize) == 8}] # Big test for correct ordering of data in [expr] @@ -4179,11 +4179,11 @@ test util-18.12 {Tcl_ObjPrintf} {testprint} { testprint "%I64d %Id" 65537 } {65537 65537} -test util-18.13 {Tcl_ObjPrintf} -constraints {testprint pointerIs64bit} -body { +test util-18.13 {Tcl_ObjPrintf} -constraints {testprint longIs64bit} -body { testprint "%llu %ju %lu" -1 } -result {18446744073709551615 18446744073709551615 18446744073709551615} -test util-18.14 {Tcl_ObjPrintf} -constraints {testprint pointerIs64bit} -body { +test util-18.14 {Tcl_ObjPrintf} -constraints {testprint longIs64bit} -body { testprint "%llu %zu %lu" -1 } -result {18446744073709551615 18446744073709551615 18446744073709551615} |
