diff options
| author | dgp <dgp@users.sourceforge.net> | 2018-03-30 21:10:04 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2018-03-30 21:10:04 (GMT) |
| commit | d525fa6f68f87682f9296333a802a3f02ff66f94 (patch) | |
| tree | 78af641860471e22666d7868086c2cf33c0dc2c6 /generic/tclExecute.c | |
| parent | c12062248332a3208e7950b1775ab1b547ab60fa (diff) | |
| parent | a5d6e9657a73455c2b0163d64a0fd0938962849b (diff) | |
| download | tcl-d525fa6f68f87682f9296333a802a3f02ff66f94.zip tcl-d525fa6f68f87682f9296333a802a3f02ff66f94.tar.gz tcl-d525fa6f68f87682f9296333a802a3f02ff66f94.tar.bz2 | |
merge 8.7
Diffstat (limited to 'generic/tclExecute.c')
| -rw-r--r-- | generic/tclExecute.c | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index ccee5a0..5a1966f 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -4940,11 +4940,11 @@ TEBCresume( TclGetInt4AtPtr(pc+5))); /* - * Get the contents of the list, making sure that it really is a list + * Get the length of the list, making sure that it really is a list * in the process. */ - if (TclListObjGetElements(interp, valuePtr, &objc, &objv) != TCL_OK) { + if (TclListObjLength(interp, valuePtr, &objc) != TCL_OK) { TRACE_ERROR(interp); goto gotError; } @@ -4978,7 +4978,10 @@ TEBCresume( } if ((toIdx == TCL_INDEX_BEFORE) || (fromIdx == TCL_INDEX_AFTER)) { - goto emptyList; + emptyList: + objResultPtr = Tcl_NewObj(); + TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr))); + NEXT_INST_F(9, 1, 1); } toIdx = TclIndexDecode(toIdx, objc - 1); if (toIdx < 0) { @@ -4998,28 +5001,8 @@ TEBCresume( } fromIdx = TclIndexDecode(fromIdx, objc - 1); - if (fromIdx < 0) { - fromIdx = 0; - } - if (fromIdx <= toIdx) { - /* Construct the subsquence list */ - /* unshared optimization */ - if (Tcl_IsShared(valuePtr)) { - objResultPtr = Tcl_NewListObj(toIdx-fromIdx+1, objv+fromIdx); - } else { - if (toIdx != objc - 1) { - Tcl_ListObjReplace(NULL, valuePtr, toIdx + 1, LIST_MAX, - 0, NULL); - } - Tcl_ListObjReplace(NULL, valuePtr, 0, fromIdx, 0, NULL); - TRACE_APPEND(("%.30s\n", O2S(valuePtr))); - NEXT_INST_F(9, 0, 0); - } - } else { - emptyList: - TclNewObj(objResultPtr); - } + objResultPtr = TclListObjRange(valuePtr, fromIdx, toIdx); TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr))); NEXT_INST_F(9, 1, 1); |
