diff options
author | mig <mig> | 2013-01-29 09:24:44 (GMT) |
---|---|---|
committer | mig <mig> | 2013-01-29 09:24:44 (GMT) |
commit | 75972077579a3e9bf1363e817260d11f17d60266 (patch) | |
tree | ee9687a2d893c44ba4952d391c5cd55a5dd66497 | |
parent | 296348b0acfe641191926aee31c5484fd493cd5a (diff) | |
download | tcl-mig_retest.zip tcl-mig_retest.tar.gz tcl-mig_retest.tar.bz2 |
Remove one trampoline bounce in EvalObjv.mig_retest
-rw-r--r-- | generic/tclBasic.c | 29 | ||||
-rw-r--r-- | 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); |