diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-01-18 15:39:21 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-01-18 15:39:21 (GMT) |
| commit | f97560a94963b378ccc5b75e5dbc2949eca30b9f (patch) | |
| tree | 9cab1970a2554690061d6b0cb437de08f09ffffa | |
| parent | 01a48e2369782044a30d922c5f8ed52262ef4fcd (diff) | |
| parent | c3bcd951b8dd8bf57202915b9d914bcddc73b9bb (diff) | |
| download | tcl-f97560a94963b378ccc5b75e5dbc2949eca30b9f.zip tcl-f97560a94963b378ccc5b75e5dbc2949eca30b9f.tar.gz tcl-f97560a94963b378ccc5b75e5dbc2949eca30b9f.tar.bz2 | |
Fix [e9a2715d91]: Incompatible Tcl_GetRange(). From now on (unofficially) the last function argument can be set to -1 (or any negative value) meaning 'end'.
| -rw-r--r-- | generic/tclCmdMZ.c | 14 | ||||
| -rw-r--r-- | generic/tclExecute.c | 15 | ||||
| -rw-r--r-- | generic/tclStringObj.c | 12 | ||||
| -rw-r--r-- | generic/tclTest.c | 2 |
4 files changed, 30 insertions, 13 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 5422b7f..bf75d44 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -395,9 +395,13 @@ Tcl_RegexpObjCmd( newPtr = Tcl_NewListObj(2, objs); } else { if (i <= info.nsubs) { - newPtr = Tcl_GetRange(objPtr, - offset + info.matches[i].start, - offset + info.matches[i].end - 1); + if (info.matches[i].end <= 0) { + TclNewObj(newPtr); + } else { + newPtr = Tcl_GetRange(objPtr, + offset + info.matches[i].start, + offset + info.matches[i].end - 1); + } } else { TclNewObj(newPtr); } @@ -2183,7 +2187,9 @@ StringRangeCmd( return TCL_ERROR; } - Tcl_SetObjResult(interp, Tcl_GetRange(objv[1], first, last)); + if (last >= 0) { + Tcl_SetObjResult(interp, Tcl_GetRange(objv[1], first, last)); + } return TCL_OK; } diff --git a/generic/tclExecute.c b/generic/tclExecute.c index c39bc21..a3b0401 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -5609,7 +5609,11 @@ TEBCresume( goto gotError; } - objResultPtr = Tcl_GetRange(OBJ_AT_DEPTH(2), fromIdx, toIdx); + if (toIdx < 0) { + TclNewObj(objResultPtr); + } else { + objResultPtr = Tcl_GetRange(OBJ_AT_DEPTH(2), fromIdx, toIdx); + } TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr))); NEXT_INST_V(1, 3, 1); @@ -5653,11 +5657,14 @@ TEBCresume( fromIdx = TCL_INDEX_START; } if (fromIdx == TCL_INDEX_AFTER) { + goto emptyRange; + } + fromIdx = TclIndexDecode(fromIdx, length - 1); + if (toIdx >= 0) { + objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx); + } else { emptyRange: TclNewObj(objResultPtr); - } else { - fromIdx = TclIndexDecode(fromIdx, length - 1); - objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx); } TRACE_APPEND(("%.30s\n", O2S(objResultPtr))); NEXT_INST_F(9, 1, 1); diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 756b948..b4f05dd 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -772,7 +772,7 @@ Tcl_GetRange( if (TclIsPureByteArray(objPtr)) { unsigned char *bytes = Tcl_GetByteArrayFromObj(objPtr, &length); - if (last >= length) { + if (last < 0 || last >= length) { last = length - 1; } if (last < first) { @@ -798,7 +798,7 @@ Tcl_GetRange( TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length); } if (stringPtr->numChars == objPtr->length) { - if (last >= stringPtr->numChars) { + if (last < 0 || last >= stringPtr->numChars) { last = stringPtr->numChars - 1; } if (last < first) { @@ -819,7 +819,7 @@ Tcl_GetRange( FillUnicodeRep(objPtr); stringPtr = GET_STRING(objPtr); } - if (last >= stringPtr->numChars) { + if (last < 0 || last >= stringPtr->numChars) { last = stringPtr->numChars - 1; } if (last < first) { @@ -2116,7 +2116,11 @@ Tcl_AppendFormatToObj( if (gotPrecision) { numChars = Tcl_GetCharLength(segment); if (precision < numChars) { - segment = Tcl_GetRange(segment, 0, precision - 1); + if (precision < 1) { + TclNewObj(segment); + } else { + segment = Tcl_GetRange(segment, 0, precision - 1); + } numChars = precision; Tcl_IncrRefCount(segment); allocSegment = 1; diff --git a/generic/tclTest.c b/generic/tclTest.c index ed016fe..8d22edf 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -3918,7 +3918,7 @@ TestregexpObjCmd( if (ii == -1) { TclRegExpRangeUniChar(regExpr, ii, &start, &end); newPtr = Tcl_GetRange(objPtr, start, end); - } else if (ii > info.nsubs) { + } else if (ii > info.nsubs || info.matches[ii].end <= 0) { newPtr = Tcl_NewObj(); } else { newPtr = Tcl_GetRange(objPtr, info.matches[ii].start, |
