Tcl Source Code

Artifact [1cea01e75e]
Login

Artifact 1cea01e75e9b5b88cbaa5bcce8715b0aee176858:

Attachment "instInvoke.patch" to ticket [1693802fff] added by msofer 2007-04-04 00:51:10.
Index: generic/tclExecute.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclExecute.c,v
retrieving revision 1.268
diff -u -r1.268 tclExecute.c
--- generic/tclExecute.c	3 Apr 2007 01:34:37 -0000	1.268
+++ generic/tclExecute.c	3 Apr 2007 17:45:55 -0000
@@ -1739,6 +1739,7 @@
 	    Tcl_Obj **objv = (tosPtr - (objc-1));
 	    int length;
 	    const char *bytes;
+	    Command *cmdPtr;
 
 	    /*
 	     * We keep the stack reference count as a (char *), as that works
@@ -1791,11 +1792,10 @@
 			break;
 		    }
 		}
-	    } else {
-		Command *cmdPtr;
-
+	    }
+	    if (!bytes) {
 		cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);
-		if ((cmdPtr!=NULL) && (cmdPtr->flags & CMD_HAS_EXEC_TRACES)) {
+		if (!cmdPtr || (cmdPtr->flags & CMD_HAS_EXEC_TRACES)) {
 		    bytes = GetSrcInfoForPc(pc, codePtr, &length);
 		}
 	    }
@@ -1815,7 +1815,7 @@
 	     * Reset the instructionCount variable, since we're about to check
 	     * for async stuff anyway while processing TclEvalObjvInternal.
 	     */
-
+	    
 	    instructionCount = 1;
 
 	    /*
@@ -1829,7 +1829,25 @@
 	    iPtr->cmdFramePtr = &bcFrame;
 	    DECACHE_STACK_INFO();
 	    /*Tcl_ResetResult(interp);*/
-	    result = TclEvalObjvInternal(interp, objc, objv, bytes, length, 0);
+	    if (bytes || (checkInterp && (codePtr->compileEpoch != iPtr->compileEpoch))) {
+		result = TclEvalObjvInternal(interp, objc, objv, bytes, length, 0);
+	    } else {
+		/*
+		 * No traces, the interp is ok: avoid the call out to TEOVi
+		 */
+
+		cmdPtr->refCount++;
+		iPtr->cmdCount++;
+		iPtr->ensembleRewrite.sourceObjs = NULL;
+		result = (*cmdPtr->objProc)(cmdPtr->objClientData, interp, objc, objv);
+		TclCleanupCommand(cmdPtr);
+		if (Tcl_AsyncReady()) {
+		    result = Tcl_AsyncInvoke(interp, result);
+		}
+		if (result == TCL_OK && Tcl_LimitReady(interp)) {
+		    result = Tcl_LimitCheck(interp);
+		}
+	    }
 	    CACHE_STACK_INFO();
 	    iPtr->cmdFramePtr = iPtr->cmdFramePtr->nextPtr;