summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclBasic.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 4d56f3a..96d74c4 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -157,6 +157,7 @@ static Tcl_NRPostProc TEOV_Exception;
static Tcl_NRPostProc TEOV_NotFoundCallback;
static Tcl_NRPostProc TEOV_RestoreVarFrame;
static Tcl_NRPostProc TEOV_RunLeaveTraces;
+static Tcl_NRPostProc EvalObjvCore;
static Tcl_NRPostProc Dispatch;
static Tcl_ObjCmdProc NRCoroInjectObjCmd;
@@ -4093,16 +4094,8 @@ TclNREvalObjv(
* requested Command struct to be invoked. */
{
Interp *iPtr = (Interp *) interp;
- int result;
- Namespace *lookupNsPtr = iPtr->lookupNsPtr;
-
- iPtr->lookupNsPtr = NULL;
/*
- * Push a callback with cleanup tasks for commands; the cmdPtr at data[0]
- * will be filled later when the command is found: save its address at
- * objProcPtr.
- *
* data[1] stores a marker for use by tailcalls; it will be set to 1 by
* command redirectors (imports, alias, ensembles) so that tailcalls
* finishes the source command and not just the target.
@@ -4115,12 +4108,38 @@ TclNREvalObjv(
}
iPtr->numLevels++;
- result = TclInterpReady(interp);
+ TclNRAddCallback(interp, EvalObjvCore, cmdPtr, INT2PTR(flags),
+ INT2PTR(objc), objv);
+ return TCL_OK;
+}
- if ((result != TCL_OK) || (objc == 0)) {
- return result;
+static int
+EvalObjvCore(
+ ClientData data[],
+ Tcl_Interp *interp,
+ int result)
+{
+ Command *cmdPtr = data[0];
+ int flags = PTR2INT(data[1]);
+ int objc = PTR2INT(data[2]);
+ Tcl_Obj **objv = data[3];
+ Interp *iPtr = (Interp *) interp;
+ Namespace *lookupNsPtr = iPtr->lookupNsPtr;
+
+ if (TCL_OK != TclInterpReady(interp)) {
+ return TCL_ERROR;
}
+ if (objc == 0) {
+ return TCL_OK;
+ }
+
+ if (TclLimitExceeded(iPtr->limit)) {
+ return TCL_ERROR;
+ }
+
+ iPtr->lookupNsPtr = NULL;
+
if (cmdPtr) {
goto commandFound;
}
@@ -4164,11 +4183,6 @@ TclNREvalObjv(
return TEOV_NotFound(interp, objc, objv, lookupNsPtr);
}
- iPtr->cmdCount++;
- if (TclLimitExceeded(iPtr->limit)) {
- return TCL_ERROR;
- }
-
/*
* Found a command! The real work begins now ...
*/
@@ -4207,9 +4221,9 @@ Dispatch(
ClientData clientData = data[1];
int objc = PTR2INT(data[2]);
Tcl_Obj **objv = data[3];
-#ifdef USE_DTRACE
Interp *iPtr = (Interp *) interp;
+#ifdef USE_DTRACE
if (TCL_DTRACE_CMD_ARGS_ENABLED()) {
const char *a[10];
int i = 0;
@@ -4238,6 +4252,7 @@ Dispatch(
}
#endif /* USE_DTRACE */
+ iPtr->cmdCount++;
return objProc(clientData, interp, objc, objv);
}