diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-19 16:12:56 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-19 16:12:56 (GMT) |
commit | 797aa89a3070e3e505f1761759a3264ce1628101 (patch) | |
tree | f02400cd846c0633a41de1106f48d11bd562b856 /generic/tclLink.c | |
parent | 4245f0e5a3dbaeec7f85c84b72fbc2683516d3ec (diff) | |
parent | 90d13253bd75cb679db561831edc73359d4a23e1 (diff) | |
download | tcl-797aa89a3070e3e505f1761759a3264ce1628101.zip tcl-797aa89a3070e3e505f1761759a3264ce1628101.tar.gz tcl-797aa89a3070e3e505f1761759a3264ce1628101.tar.bz2 |
Merge 8.7
Diffstat (limited to 'generic/tclLink.c')
-rw-r--r-- | generic/tclLink.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/generic/tclLink.c b/generic/tclLink.c index 99df5b6..4df2a33 100644 --- a/generic/tclLink.c +++ b/generic/tclLink.c @@ -538,10 +538,15 @@ GetUWide( } else if (type == TCL_NUMBER_BIG) { mp_int *numPtr = (mp_int *)clientData; Tcl_WideUInt value = 0; + union { + Tcl_WideUInt value; + unsigned char bytes[sizeof(Tcl_WideUInt)]; + } scratch; size_t numBytes; + unsigned char *bytes = scratch.bytes; - if (numPtr->sign || (MP_OKAY != mp_pack(&value, 1, - &numBytes, 0, sizeof(Tcl_WideUInt), 0, 0, numPtr))) { + if (numPtr->sign || (MP_OKAY != mp_to_ubin(numPtr, + bytes, sizeof(Tcl_WideUInt), &numBytes))) { /* * If the sign bit is set (a negative value) or if the value * can't possibly fit in the bits of an unsigned wide, there's @@ -549,6 +554,16 @@ GetUWide( */ return 1; } +#ifndef WORDS_BIGENDIAN + while (numBytes-- > 0) { + value = (value << CHAR_BIT) | *bytes++; + } +#else /* WORDS_BIGENDIAN */ + /* + * Big-endian can read the value directly. + */ + value = scratch.value; +#endif /* WORDS_BIGENDIAN */ *uwidePtr = value; return 0; } |