Tcl Source Code

Artifact [9a70cfd59d]
Login

Artifact 9a70cfd59d27a4fcec603ffa7ac3e193b8d192d7:

Attachment "533907.patch" to ticket [533907ffff] added by msofer 2002-03-24 21:59:30.
--- generic/tclBasic.c	Sun Mar 24 09:40:21 2002
+++ generic/tclBasic.c	Sun Mar 24 10:42:43 2002
@@ -3084,18 +3084,21 @@
     Interp *iPtr = (Interp *)interp;
     Trace *tracePtr;
     Tcl_DString cmdBuf;
-    char *cmdString = "";
-    int cmdLen = 0;
+    char *cmdString = ""; /* A command string is only necessary for command traces
+			   * or error logs; it will be generated to replace this
+			   * default value if necessary. */
+    int cmdLen = 0;       /* a non-zero value will indicate that a command string 
+			   * was generated. */
     int code = TCL_OK;
+    int i;
 
     for (tracePtr = iPtr->tracePtr; tracePtr; tracePtr = tracePtr->nextPtr) {
 	if (iPtr->numLevels <= tracePtr->level) {
-	    int i;
 	    /*
 	     * The command will be needed for an execution trace or stack trace
 	     * generate a command string.
 	     */
-	cmdtraced:
+	    
 	    Tcl_DStringInit(&cmdBuf);
 	    for (i = 0; i < objc; i++) {
 		Tcl_DStringAppendElement(&cmdBuf, Tcl_GetString(objv[i]));
@@ -3107,26 +3110,31 @@
     }
 
     /*
-     * Execute the command if we have not done so already
+     * Execute the command.
      */
-    switch (code) {
-	case TCL_OK:
-	    if (TclInterpReady(interp) == TCL_ERROR) {
-		code = TCL_ERROR;
-	    } else {
-		iPtr->numLevels++;
-		code = TclEvalObjvInternal(interp, objc, objv, cmdString, cmdLen, flags);
-		iPtr->numLevels--;
+
+    code = TclInterpReady(interp);
+    if (code == TCL_OK) {
+	iPtr->numLevels++;
+	code = TclEvalObjvInternal(interp, objc, objv, cmdString, cmdLen, flags);
+	iPtr->numLevels--;
+    }
+	
+    if (code == TCL_ERROR) {
+	/* 
+	 * If there was an error, a command string will be needed for the 
+	 * error log: generate it now if it was not done previously.
+	 */
+
+	if (cmdLen == 0) {
+	    Tcl_DStringInit(&cmdBuf);
+	    for (i = 0; i < objc; i++) {
+		Tcl_DStringAppendElement(&cmdBuf, Tcl_GetString(objv[i]));
 	    }
-	    if (code == TCL_ERROR && cmdLen == 0)
-		goto cmdtraced;
-	    break;
-	case TCL_ERROR:
-	    Tcl_LogCommandInfo(interp, cmdString, cmdString, cmdLen);
-	    break;
-	default:
-	    /*NOTREACHED*/
-	    break;
+	    cmdString = Tcl_DStringValue(&cmdBuf);
+	    cmdLen = Tcl_DStringLength(&cmdBuf);
+	}
+	Tcl_LogCommandInfo(interp, cmdString, cmdString, cmdLen);
     }
 
     if (cmdLen != 0) {