summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclCmdIL.c17
-rw-r--r--generic/tclEncoding.c4
-rw-r--r--generic/tclExecute.c10
-rw-r--r--generic/tclInt.h4
-rw-r--r--generic/tclListObj.c3
-rw-r--r--tests/bigdata.test8
6 files changed, 30 insertions, 16 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index dbc74bd..7beb60a 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -2326,6 +2326,7 @@ Tcl_LassignObjCmd(
Tcl_Obj *listCopyPtr;
Tcl_Obj **listObjv; /* The contents of the list. */
Tcl_Size listObjc; /* The length of the list. */
+ Tcl_Size origListObjc; /* Original length */
int code = TCL_OK;
if (objc < 2) {
@@ -2337,8 +2338,10 @@ Tcl_LassignObjCmd(
if (listCopyPtr == NULL) {
return TCL_ERROR;
}
+ Tcl_IncrRefCount(listCopyPtr); /* Important! fs */
TclListObjGetElementsM(NULL, listCopyPtr, &listObjc, &listObjv);
+ origListObjc = listObjc;
objc -= 2;
objv += 2;
@@ -2366,7 +2369,13 @@ Tcl_LassignObjCmd(
}
if (code == TCL_OK && listObjc > 0) {
- Tcl_SetObjResult(interp, Tcl_NewListObj(listObjc, listObjv));
+ Tcl_Obj *resultObjPtr = TclListObjRange(
+ interp, listCopyPtr, origListObjc - listObjc, origListObjc - 1);
+ if (resultObjPtr == NULL) {
+ code = TCL_ERROR;
+ } else {
+ Tcl_SetObjResult(interp, resultObjPtr);
+ }
}
Tcl_DecrRefCount(listCopyPtr);
@@ -2759,7 +2768,11 @@ Tcl_LrangeObjCmd(
return TCL_ERROR;
}
} else {
- Tcl_SetObjResult(interp, TclListObjRange(objv[1], first, last));
+ Tcl_Obj *resultObj = TclListObjRange(interp, objv[1], first, last);
+ if (resultObj == NULL) {
+ return TCL_ERROR;
+ }
+ Tcl_SetObjResult(interp, resultObj);
}
return TCL_OK;
}
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index fca4ea5..2b8e8c0 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -2786,9 +2786,9 @@ Utf32ToUtfProc(
int prev = ch;
#endif
if (flags & TCL_ENCODING_LE) {
- ch = (src[3] & 0xFF) << 24 | (src[2] & 0xFF) << 16 | (src[1] & 0xFF) << 8 | (src[0] & 0xFF);
+ ch = (unsigned int)(src[3] & 0xFF) << 24 | (src[2] & 0xFF) << 16 | (src[1] & 0xFF) << 8 | (src[0] & 0xFF);
} else {
- ch = (src[0] & 0xFF) << 24 | (src[1] & 0xFF) << 16 | (src[2] & 0xFF) << 8 | (src[3] & 0xFF);
+ ch = (unsigned int)(src[0] & 0xFF) << 24 | (src[1] & 0xFF) << 16 | (src[2] & 0xFF) << 8 | (src[3] & 0xFF);
}
#if TCL_UTF_MAX < 4
if (HIGH_SURROGATE(prev) && !LOW_SURROGATE(ch)) {
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index f22538f..a64880f 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -4945,12 +4945,12 @@ TEBCresume(
if (TclHasInternalRep(valuePtr,&tclArithSeriesType.objType)) {
objResultPtr = TclArithSeriesObjRange(interp, valuePtr, fromIdx, toIdx);
- if (objResultPtr == NULL) {
- TRACE_ERROR(interp);
- goto gotError;
- }
} else {
- objResultPtr = TclListObjRange(valuePtr, fromIdx, toIdx);
+ objResultPtr = TclListObjRange(interp, valuePtr, fromIdx, toIdx);
+ }
+ if (objResultPtr == NULL) {
+ TRACE_ERROR(interp);
+ goto gotError;
}
TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr)));
diff --git a/generic/tclInt.h b/generic/tclInt.h
index aa7313a..cf8b3ce 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -3241,8 +3241,8 @@ MODULE_SCOPE Tcl_Obj * TclListObjCopy(Tcl_Interp *interp, Tcl_Obj *listPtr);
MODULE_SCOPE int TclListObjAppendElements(Tcl_Interp *interp,
Tcl_Obj *toObj, Tcl_Size elemCount,
Tcl_Obj *const elemObjv[]);
-MODULE_SCOPE Tcl_Obj * TclListObjRange(Tcl_Obj *listPtr, Tcl_Size fromIdx,
- Tcl_Size toIdx);
+MODULE_SCOPE Tcl_Obj * TclListObjRange(Tcl_Interp *interp, Tcl_Obj *listPtr,
+ Tcl_Size fromIdx, Tcl_Size toIdx);
MODULE_SCOPE Tcl_Obj * TclLsetList(Tcl_Interp *interp, Tcl_Obj *listPtr,
Tcl_Obj *indexPtr, Tcl_Obj *valuePtr);
MODULE_SCOPE Tcl_Obj * TclLsetFlat(Tcl_Interp *interp, Tcl_Obj *listPtr,
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index 747eea0..39d2c11 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -1601,6 +1601,7 @@ ListRepRange(
Tcl_Obj *
TclListObjRange(
+ Tcl_Interp *interp, /* May be NULL. Used for error messages */
Tcl_Obj *listObj, /* List object to take a range from. */
Tcl_Size rangeStart, /* Index of first element to include. */
Tcl_Size rangeEnd) /* Index of last element to include. */
@@ -1609,7 +1610,7 @@ TclListObjRange(
ListRep resultRep;
int isShared;
- if (TclListObjGetRep(NULL, listObj, &listRep) != TCL_OK)
+ if (TclListObjGetRep(interp, listObj, &listRep) != TCL_OK)
return NULL;
isShared = Tcl_IsShared(listObj);
diff --git a/tests/bigdata.test b/tests/bigdata.test
index ced2510..c580fbd 100644
--- a/tests/bigdata.test
+++ b/tests/bigdata.test
@@ -752,17 +752,17 @@ bigtest lappend-bigdata-1 "lappend" {4294967300 4294967300 {1 2 3 4 5 a b c d}}
#
# lassign
-bigtestRO lassign-bigdata-1 "lassign" {0 1 2 3 4 5 6 7 8 9 1} -body {
+bigtestRO lassign-bigdata-1 "lassign" {0 1 2 3 4 5 6 7 8 {9 0 1 2 3 4 5 6 7 8} {6 7 8 9 0 1 2 3 4 5}} -body {
# Unset explicitly before setting to save memory as bigtestRO runs the
# script below twice.
unset -nocomplain l2
- set l2 [lassign $l a b c d e f g h i j]
- list $a $b $c $d $e $f $g $h $i $j [testlutil equal $l2 [bigList 0x100000000]]
+ set l2 [lassign $l a b c d e f g h i]
+ list $a $b $c $d $e $f $g $h $i [lrange $l2 0 9] [lrange $l2 end-9 end]
} -setup {
set l [bigList 0x10000000a]
} -cleanup {
bigClean
-} -constraints bug-d90fee06d0
+}
#
# ledit