From 75972077579a3e9bf1363e817260d11f17d60266 Mon Sep 17 00:00:00 2001 From: mig Date: Tue, 29 Jan 2013 09:24:44 +0000 Subject: Remove one trampoline bounce in EvalObjv. --- generic/tclBasic.c | 29 ++++++----------------------- generic/tclExecute.c | 1 + 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 4d5b715..c8cfb49 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -135,7 +135,6 @@ static Tcl_NRPostProc NRCoroutineCallerCallback; static Tcl_NRPostProc NRCoroutineExitCallback; static int NRCommand(ClientData data[], Tcl_Interp *interp, int result); -static Tcl_NRPostProc NRRunObjProc; static Tcl_ObjCmdProc OldMathFuncProc; static void OldMathFuncDeleteProc(ClientData clientData); static void ProcessUnexpectedResult(Tcl_Interp *interp, @@ -4293,14 +4292,11 @@ TclNREvalObjv( cmdPtr->refCount++; /* - * Find the objProc to call: nreProc if available, objProc otherwise. Push - * a callback to do the actual running. + * Find the objProc to call: nreProc if available, objProc otherwise. */ if (cmdPtr->nreProc) { - TclNRAddCallback(interp, NRRunObjProc, cmdPtr, - INT2PTR(objc), (ClientData) objv, NULL); - return TCL_OK; + return cmdPtr->nreProc(cmdPtr->objClientData, interp, objc, objv); } else { return cmdPtr->objProc(cmdPtr->objClientData, interp, objc, objv); } @@ -4382,22 +4378,6 @@ NRCommand( return result; } - -static int -NRRunObjProc( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - /* OPT: do not call? */ - - Command* cmdPtr = data[0]; - int objc = PTR2INT(data[1]); - Tcl_Obj **objv = data[2]; - - return cmdPtr->nreProc(cmdPtr->objClientData, interp, objc, objv); -} - /* *---------------------------------------------------------------------- @@ -9007,7 +8987,6 @@ TclNRCoroutineObjCmd( corPtr->running.varFramePtr = iPtr->rootFramePtr; corPtr->running.cmdFramePtr = NULL; corPtr->running.lineLABCPtr = corPtr->lineLABCPtr; - corPtr->stackLevel = NULL; corPtr->auxNumLevels = 0; /* @@ -9027,11 +9006,15 @@ TclNRCoroutineObjCmd( TclNRAddCallback(interp, NRCoroutineExitCallback, corPtr, NULL, NULL, NULL); + /* Mark the coro as 'not suspended' while scheduling the command */ + corPtr->stackLevel = INT2PTR(1); + /* insure that the command is looked up in the correct namespace */ iPtr->lookupNsPtr = lookupNsPtr; Tcl_NREvalObj(interp, Tcl_NewListObj(objc-2, objv+2), 0); iPtr->numLevels--; + corPtr->stackLevel = NULL; SAVE_CONTEXT(corPtr->running); RESTORE_CONTEXT(corPtr->caller); iPtr->execEnvPtr = corPtr->callerEEPtr; diff --git a/generic/tclExecute.c b/generic/tclExecute.c index c2cef2a..7d4f47a 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -2393,6 +2393,7 @@ TEBCresume( NULL); goto gotError; } + NRE_ASSERT(!COR_IS_SUSPENDED(corPtr)); #ifdef TCL_COMPILE_DEBUG TRACE_WITH_OBJ(("yield, result="), iPtr->objResultPtr); -- cgit v0.12