summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-01-18 15:52:13 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-01-18 15:52:13 (GMT)
commitae78b892336fb5325a124506f2de9e283760857c (patch)
tree04dd21e507e2eece455ffffefbeef87056e04c42
parentb563c159d7f63f0a4ca1e9190ec4111d5d4908d9 (diff)
parentf97560a94963b378ccc5b75e5dbc2949eca30b9f (diff)
downloadtcl-ae78b892336fb5325a124506f2de9e283760857c.zip
tcl-ae78b892336fb5325a124506f2de9e283760857c.tar.gz
tcl-ae78b892336fb5325a124506f2de9e283760857c.tar.bz2
Merge 8.6
-rw-r--r--generic/tclCmdMZ.c14
-rw-r--r--generic/tclExecute.c12
-rw-r--r--generic/tclStringObj.c12
-rw-r--r--generic/tclTest.c2
4 files changed, 29 insertions, 11 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index e578151..c0c3b6f 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);
}
@@ -2300,7 +2304,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 8301627..e2ac905 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5370,7 +5370,11 @@ TEBCresume(
}
CACHE_STACK_INFO();
- 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);
@@ -5407,7 +5411,11 @@ TEBCresume(
fromIdx = TCL_INDEX_START;
}
fromIdx = TclIndexDecode(fromIdx, length - 1);
- objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx);
+ if (toIdx < 0) {
+ TclNewObj(objResultPtr);
+ } else {
+ 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 d3f0024..7a2c1f2 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -731,7 +731,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) {
@@ -757,7 +757,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) {
@@ -778,7 +778,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) {
@@ -2087,7 +2087,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 06a0834..7ec3c41 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -3966,7 +3966,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,