summaryrefslogtreecommitdiffstats
path: root/generic/tclLink.c
diff options
context:
space:
mode:
authorgriffin <briang42@easystreet.net>2022-11-24 01:18:36 (GMT)
committergriffin <briang42@easystreet.net>2022-11-24 01:18:36 (GMT)
commit7b6d0229053cd8590549a3d9c256b97125455fd6 (patch)
tree6d06ed89632e265fed2bda597115f19d2d018e8a /generic/tclLink.c
parent4335a4f4756de329d8abe3cf77fae90b8e664faf (diff)
parentdc6366fef862bab942ea21db724f632950f43601 (diff)
downloadtcl-7b6d0229053cd8590549a3d9c256b97125455fd6.zip
tcl-7b6d0229053cd8590549a3d9c256b97125455fd6.tar.gz
tcl-7b6d0229053cd8590549a3d9c256b97125455fd6.tar.bz2
Support multiple indicies in abstract list lindex operation.
Catch up with trunk.
Diffstat (limited to 'generic/tclLink.c')
-rw-r--r--generic/tclLink.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/generic/tclLink.c b/generic/tclLink.c
index 82939e2..af6bd22 100644
--- a/generic/tclLink.c
+++ b/generic/tclLink.c
@@ -538,15 +538,10 @@ 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_to_ubin(numPtr,
- bytes, sizeof(Tcl_WideUInt), &numBytes))) {
+ if (numPtr->sign || (MP_OKAY != mp_pack(&value, 1,
+ &numBytes, 0, sizeof(Tcl_WideUInt), 0, 0, numPtr))) {
/*
* 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
@@ -554,16 +549,6 @@ GetUWide(
*/
return 1;
}
-#ifdef WORDS_BIGENDIAN
- while (numBytes-- > 0) {
- value = (value << CHAR_BIT) | *bytes++;
- }
-#else /* !WORDS_BIGENDIAN */
- /*
- * Little-endian can read the value directly.
- */
- value = scratch.value;
-#endif /* WORDS_BIGENDIAN */
*uwidePtr = value;
return 0;
}
@@ -1450,12 +1435,12 @@ ObjValue(
}
linkPtr->lastValue.f = LinkedVar(float);
return Tcl_NewDoubleObj(linkPtr->lastValue.f);
- case TCL_LINK_WIDE_UINT:
+ case TCL_LINK_WIDE_UINT: {
if (linkPtr->flags & LINK_ALLOC_LAST) {
memcpy(linkPtr->lastValue.aryPtr, linkPtr->addr, linkPtr->bytes);
objv = (Tcl_Obj **)Tcl_Alloc(linkPtr->numElems * sizeof(Tcl_Obj *));
for (i=0; i < linkPtr->numElems; i++) {
- TclNewIntObj(objv[i], (Tcl_WideInt)
+ TclNewUIntObj(objv[i],
linkPtr->lastValue.uwPtr[i]);
}
resultObj = Tcl_NewListObj(linkPtr->numElems, objv);
@@ -1463,7 +1448,10 @@ ObjValue(
return resultObj;
}
linkPtr->lastValue.uw = LinkedVar(Tcl_WideUInt);
- return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.uw);
+ Tcl_Obj *uwObj;
+ TclNewUIntObj(uwObj, linkPtr->lastValue.uw);
+ return uwObj;
+ }
case TCL_LINK_STRING:
p = LinkedVar(char *);