Subject: A few more tweaks to streamline and clarify.

From: dgp <[email-masked]>
Date: Tue, 6 Jun 2017 12:56:37 +0000

---
 generic/tclStringObj.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index b78394e..aae52ba 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -2851,12 +2851,16 @@ TclStringCatObjv(
     int oc, length = 0, binary = 1, first = 0, last = 0;
     int allowUniChar = 1, requestUniChar = 0;
 
+    /* assert ( objc >= 0 ) */
+
     if (objc <= 1) {
 	/* Only one or no objects; return first or empty */
 	*objPtrPtr = objc ? objv[0] : Tcl_NewObj();
 	return TCL_OK;
     }
 
+    /* assert ( objc >= 2 ) */
+
     /*
      * Analyze to determine what representation result should be.
      * GOALS:	Avoid shimmering & string rep generation.
@@ -2914,7 +2918,7 @@ TclStringCatObjv(
 			first = last;
 		    }
 		    if ((length += numBytes) < 0) {
-			break; /* overflow */
+			goto overflow;
 		    }
 		}
 	    }
@@ -2935,7 +2939,7 @@ TclStringCatObjv(
 			first = last;
 		    }
 		    if ((length += numChars) < 0) {
-			break; /* overflow */
+			goto overflow;
 		    }
 		}
 	    }
@@ -2955,27 +2959,19 @@ TclStringCatObjv(
 		    first = last;
 		}
 		if ((length += numBytes) < 0) {
-		    break; /* overflow */
+		    goto overflow;
 		}
 	    }
 	} while (--oc);
     }
 
-    if (last == first || length == 0) {
+    if (last == first /*|| length == 0 */) {
 	/* Only one non-empty value or zero length; return first */
+	/* NOTE: (length == 0) implies (last == first) */
 	*objPtrPtr = objv[first];
 	return TCL_OK;
     }
 
-    if (length < 0) {
-	if (interp) {
-	    Tcl_SetObjResult(interp, Tcl_ObjPrintf(
-		    "max size for a Tcl value (%d bytes) exceeded", INT_MAX));
-	    Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
-	}
-	return TCL_ERROR;
-    }
-
     objv += first; objc = (last - first + 1);
 
     if (binary) {
@@ -3106,6 +3102,14 @@ TclStringCatObjv(
     }
     *objPtrPtr = objResultPtr;
     return TCL_OK;
+
+  overflow:
+    if (interp) {
+	Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+		    "max size for a Tcl value (%d bytes) exceeded", INT_MAX));
+	Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
+    }
+    return TCL_ERROR;
 }
 
 /*
-- 
cgit v0.12