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;