From ad1616e27816a418512271c07f7016f8b6bce72e Mon Sep 17 00:00:00 2001 From: Miguel Sofer Date: Mon, 18 Jan 2016 06:12:15 +0000 Subject: introduce macros NRE_JUMP and NRE_NEXT to abstract the NRE mechanism, previous to introducing an alternative to the trampoline implementation; no functional change for now --- generic/tclBasic.c | 45 ++++++++++++++++++++++++++------------------- generic/tclCmdAH.c | 27 +++++++++++++-------------- generic/tclCmdIL.c | 2 +- generic/tclCmdMZ.c | 12 ++++++------ generic/tclDictObj.c | 12 ++++++------ generic/tclEnsemble.c | 2 +- generic/tclExecute.c | 17 +++++++++++------ generic/tclIOUtil.c | 2 +- generic/tclInterp.c | 2 +- generic/tclNRE.h | 7 +++++++ generic/tclNamesp.c | 2 +- generic/tclOO.c | 8 ++++---- generic/tclOOBasic.c | 12 ++++++------ generic/tclOOCall.c | 6 +++--- generic/tclOOMethod.c | 4 ++-- generic/tclProc.c | 6 +++--- 16 files changed, 92 insertions(+), 74 deletions(-) diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 6ef0618..cb14afd 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -124,7 +124,7 @@ static void MathFuncWrongNumArgs(Tcl_Interp *interp, int expected, int actual, Tcl_Obj *const *objv); static Tcl_NRPostProc NRCoroutineCallerCallback; static Tcl_NRPostProc NRCoroutineExitCallback; -static int NRRoot(ClientData data[], Tcl_Interp *interp, int result); +static int NRRoot(ClientData data[], Tcl_Interp *interp, int result); static Tcl_NRPostProc NRStackBottom; static Tcl_ObjCmdProc OldMathFuncProc; @@ -4102,6 +4102,8 @@ TclNREvalObjv( iPtr->numLevels++; + + /* Can't use NRE_JUMP, as this function does not have a callback signature */ TclNRAddCallback(interp, EvalObjvCore, cmdPtr, INT2PTR(flags), INT2PTR(objc), objv); return TCL_OK; @@ -4318,7 +4320,10 @@ NRRoot( Tcl_Interp *interp, int result) { - /* NOT CALLED */ + /* Reset itself so that NRRunCallbacks can detect it and stop (without + * running it again)*/ + + TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL, NULL); return result; } @@ -4355,7 +4360,7 @@ NRCommand( result = Tcl_LimitCheck(interp); } - return result; + NRE_NEXT(result); } /* @@ -4429,7 +4434,7 @@ TEOV_RestoreVarFrame( int result) { ((Interp *) interp)->varFramePtr = data[0]; - return result; + NRE_NEXT(result); } static int @@ -4458,7 +4463,7 @@ TEOV_Exception( */ TclUnsetCancelFlags(iPtr); - return result; + NRE_NEXT(result); } static int @@ -4487,7 +4492,7 @@ TEOV_Error( Tcl_DecrRefCount(listPtr); } iPtr->flags &= ~ERR_ALREADY_LOGGED; - return result; + NRE_NEXT(result); } static int @@ -4613,7 +4618,7 @@ TEOV_NotFoundCallback( } TclStackFree(interp, objv); - return result; + NRE_NEXT(result); } static int @@ -4714,7 +4719,7 @@ TEOV_RunLeaveTraces( result = traceCode; } Tcl_DecrRefCount(commandPtr); - return result; + NRE_NEXT(result); } static inline Command * @@ -5394,7 +5399,7 @@ TEOEx_ByteCodeCallback( } TclDecrRefCount(objPtr); - return result; + NRE_NEXT(result); } static int @@ -5408,7 +5413,7 @@ TEOEx_ListCallback( TclDecrRefCount(objPtr); TclDecrRefCount(listPtr); - return result; + NRE_NEXT(result); } /* @@ -5826,7 +5831,7 @@ NRPostInvoke( { Interp *iPtr = (Interp *)interp; iPtr->numLevels--; - return result; + NRE_NEXT(result); } /* @@ -7229,7 +7234,7 @@ DTraceCmdReturn( TCL_DTRACE_CMD_RESULT(cmdName, result, TclGetString(r), r); } - return result; + NRE_NEXT(result); } TCL_DTRACE_DEBUG_LOG() @@ -7571,7 +7576,7 @@ TclNRTailcallEval( */ TailcallCleanup(data, interp, result); - return result; + NRE_NEXT(result); } /* @@ -7581,6 +7586,7 @@ TclNRTailcallEval( TclMarkTailcall(interp); TclNRAddCallback(interp, TailcallCleanup, listPtr, NULL, NULL,NULL); iPtr->lookupNsPtr = (Namespace *) nsPtr; + return TclNREvalObjv(interp, objc-1, objv+1, 0, NULL); } @@ -7591,7 +7597,7 @@ TailcallCleanup( int result) { Tcl_DecrRefCount((Tcl_Obj *) data[0]); - return result; + NRE_NEXT(result); } void @@ -7792,7 +7798,7 @@ NRCoroutineCallerCallback( return RewindCoroutine(corPtr, result); } - return result; + NRE_NEXT(result); } static int @@ -7835,7 +7841,7 @@ NRCoroutineExitCallback( iPtr->execEnvPtr = corPtr->callerEEPtr; iPtr->numLevels++; - return result; + NRE_NEXT(result); } /* @@ -7900,7 +7906,7 @@ TclNRCoroutineActivateCallback( "cannot yield: C stack busy", -1)); Tcl_SetErrorCode(interp, "TCL", "COROUTINE", "CANT_YIELD", NULL); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } if (type == CORO_ACTIVATE_YIELD) { @@ -7920,7 +7926,7 @@ TclNRCoroutineActivateCallback( iPtr->execEnvPtr = corPtr->callerEEPtr; } - return TCL_OK; + NRE_NEXT(TCL_OK); } /* @@ -8225,13 +8231,14 @@ NRStackBottom( /* Go back to the previous stack */ eePtr->NRStack = prev; eePtr->callbackPtr = &prev->items[NRE_STACK_SIZE-1]; + NRE_NEXT(result); } else { /* If the stack is empty, free everything */ ckfree(this); eePtr->NRStack = NULL; TOP_CB(interp) = NULL; + return result; } - return result; } NRE_callback * diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index f6d48f9..6f02f3b 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -210,7 +210,7 @@ CatchObjCmdCallback( if (objc >= 3) { if (NULL == Tcl_ObjSetVar2(interp, varNamePtr, NULL, Tcl_GetObjResult(interp), TCL_LEAVE_ERR_MSG)) { - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } } if (objc == 4) { @@ -596,7 +596,7 @@ EvalCmdErrMsg( Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (\"eval\" body line %d)", Tcl_GetErrorLine(interp))); } - return result; + NRE_NEXT(result); } int @@ -759,7 +759,7 @@ ExprCallback( Tcl_SetObjResult(interp, resultPtr); } Tcl_DecrRefCount(resultPtr); - return result; + NRE_NEXT(result); } /* @@ -2272,11 +2272,10 @@ ForSetupCallback( if (result == TCL_ERROR) { Tcl_AddErrorInfo(interp, "\n (\"for\" initial command)"); } - return result; + NRE_NEXT(result); } - TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], data[2], + NRE_JUMP(interp, TclNRForIterCallback, data[0], data[1], data[2], data[3]); - return TCL_OK; } int @@ -2309,7 +2308,7 @@ TclNRForIterCallback( Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (loop body line %d)", Tcl_GetErrorLine(interp))); } - return result; + NRE_NEXT(result); } static int @@ -2323,10 +2322,10 @@ ForCondCallback( if (result != TCL_OK) { Tcl_DecrRefCount(boolObj); - return result; + NRE_NEXT(result); } else if (Tcl_GetBooleanFromObj(interp, boolObj, &value) != TCL_OK) { Tcl_DecrRefCount(boolObj); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } Tcl_DecrRefCount(boolObj); @@ -2340,7 +2339,7 @@ ForCondCallback( } return TclNREvalObjEx(interp, /*body*/ data[1], 0); } - return result; + NRE_NEXT(result); } static int @@ -2359,7 +2358,7 @@ ForNextCallback( TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], data[2], NULL); - return result; + NRE_NEXT(result); } static int @@ -2372,11 +2371,11 @@ ForPostNextCallback( if (result == TCL_ERROR) { Tcl_AddErrorInfo(interp, "\n (\"for\" loop-end command)"); } - return result; + NRE_NEXT(result); } TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], data[2], NULL); - return result; + NRE_NEXT(result); } /* @@ -2629,7 +2628,7 @@ ForeachLoopStep( done: ForeachCleanup(interp, statePtr); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index a726932..9cdbcf7 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -252,7 +252,7 @@ IfConditionCallback( if (result != TCL_OK) { TclDecrRefCount(boolObj); - return result; + NRE_NEXT(result); } if (Tcl_GetBooleanFromObj(interp, boolObj, &value) != TCL_OK) { TclDecrRefCount(boolObj); diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 4655891..ad138ab 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -3942,7 +3942,7 @@ SwitchPostProc( (overflow ? limit : patternLength), pattern, (overflow ? "..." : ""), Tcl_GetErrorLine(interp))); } - return result; + NRE_NEXT(result); } /* @@ -4352,7 +4352,7 @@ TryPostBody( if (handlersObj != NULL) { Tcl_DecrRefCount(handlersObj); } - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } /* @@ -4523,7 +4523,7 @@ TryPostBody( Tcl_DecrRefCount(options); Tcl_SetObjResult(interp, resultObj); Tcl_DecrRefCount(resultObj); - return result; + NRE_NEXT(result); } /* @@ -4565,7 +4565,7 @@ TryPostHandler( TclGetString(cmdObj), TclGetString(handlerKindObj), Tcl_GetErrorLine(interp))); Tcl_DecrRefCount(options); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } /* @@ -4606,7 +4606,7 @@ TryPostHandler( Tcl_DecrRefCount(options); Tcl_SetObjResult(interp, resultObj); Tcl_DecrRefCount(resultObj); - return result; + NRE_NEXT(result); } /* @@ -4663,7 +4663,7 @@ TryPostFinal( Tcl_SetObjResult(interp, resultObj); Tcl_DecrRefCount(resultObj); } - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 4e44e82..4bba648 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -2522,7 +2522,7 @@ DictForLoopCallback( TclDecrRefCount(scriptObj); Tcl_DictObjDone(searchPtr); TclStackFree(interp, searchPtr); - return result; + NRE_NEXT(result); } /* @@ -2730,7 +2730,7 @@ DictMapLoopCallback( TclDecrRefCount(storagePtr->accumulatorObj); Tcl_DictObjDone(&storagePtr->search); TclStackFree(interp, storagePtr); - return result; + NRE_NEXT(result); } /* @@ -3234,7 +3234,7 @@ FinalizeDictUpdate( if (dictPtr == NULL) { TclDecrRefCount(varName); TclDecrRefCount(argsObj); - return result; + NRE_NEXT(result); } /* @@ -3246,7 +3246,7 @@ FinalizeDictUpdate( Tcl_DiscardInterpState(state); TclDecrRefCount(varName); TclDecrRefCount(argsObj); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } if (Tcl_IsShared(dictPtr)) { @@ -3285,7 +3285,7 @@ FinalizeDictUpdate( TCL_LEAVE_ERR_MSG) == NULL) { Tcl_DiscardInterpState(state); TclDecrRefCount(varName); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } TclDecrRefCount(varName); @@ -3411,7 +3411,7 @@ FinalizeDictWith( } if (result != TCL_OK) { Tcl_DiscardInterpState(state); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } return Tcl_RestoreInterpState(interp, state); } diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index 959ff71..89b7381 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -1971,7 +1971,7 @@ TclClearRootEnsemble( int result) { TclResetRewriteEnsemble(interp, 1); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclExecute.c b/generic/tclExecute.c index eb66bce..7264fd6 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -1418,7 +1418,7 @@ CopyCallback( } else { Tcl_DecrRefCount(resultPtr); } - return result; + NRE_NEXT(result); } /* @@ -1476,7 +1476,7 @@ ExprObjCallback( } else { Tcl_DiscardInterpState(state); } - return result; + NRE_NEXT(result); } /* @@ -2386,9 +2386,14 @@ TEBCresume( pc++; cleanup = 1; TEBC_YIELD(); +#if 0 TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, + INT2PTR(yieldParameter), NULL, NULL); + return TCL_OK; +#else + NRE_JUMP(interp, TclNRCoroutineActivateCallback, corPtr, INT2PTR(yieldParameter), NULL, NULL); - return TCL_OK; +#endif } case INST_TAILCALL: { @@ -7666,7 +7671,7 @@ TEBCresume( TclDecrRefCount(srcPtr); TclStackFree(interp, TD); /* free my stack */ - return result; + NRE_NEXT(result); /* @@ -7760,7 +7765,7 @@ FinalizeOONext( contextPtr->index = PTR2INT(data[2]); contextPtr->skip = PTR2INT(data[3]); contextPtr->oPtr->flags &= ~FILTER_HANDLING; - return result; + NRE_NEXT(result); } static int @@ -7786,7 +7791,7 @@ FinalizeOONextFilter( contextPtr->index = PTR2INT(data[2]); contextPtr->skip = PTR2INT(data[3]); contextPtr->oPtr->flags |= FILTER_HANDLING; - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 0df7088..5336189 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -2006,7 +2006,7 @@ EvalFileCallback( } Tcl_DecrRefCount(objPtr); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclInterp.c b/generic/tclInterp.c index d27ed3f..96efa8c 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -3100,7 +3100,7 @@ NRPostInvokeHidden( Tcl_TransferResult(slaveInterp, result, interp); } Tcl_Release(slaveInterp); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclNRE.h b/generic/tclNRE.h index 1a72396..585b4c5 100644 --- a/generic/tclNRE.h +++ b/generic/tclNRE.h @@ -63,6 +63,13 @@ typedef struct NRE_stack { #define NEXT_CB(ptr) TclNextCallback(ptr) +#define NRE_NEXT(result) \ + return (result) + +#define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \ + TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \ + NRE_NEXT(TCL_OK) + MODULE_SCOPE NRE_callback *TclNewCallback(Tcl_Interp *interp); MODULE_SCOPE NRE_callback *TclPopCallback(Tcl_Interp *interp); MODULE_SCOPE NRE_callback *TclNextCallback(NRE_callback *ptr); diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index 4a59d6e..b8c447e 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -3366,7 +3366,7 @@ NsEval_Callback( */ TclPopStackFrame(interp); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclOO.c b/generic/tclOO.c index 5fca220..90de84b 100644 --- a/generic/tclOO.c +++ b/generic/tclOO.c @@ -1845,12 +1845,12 @@ FinalizeAlloc( Tcl_DeleteCommandFromToken(interp, oPtr->command); } DelRef(oPtr); - return TCL_ERROR; + NRE_NEXT(TCL_ERROR); } Tcl_RestoreInterpState(interp, state); *objectPtr = (Tcl_Object) oPtr; DelRef(oPtr); - return TCL_OK; + NRE_NEXT(TCL_OK); } /* @@ -2623,7 +2623,7 @@ FinalizeObjectCall( */ TclOODeleteContext(data[0]); - return result; + NRE_NEXT(result); } /* @@ -2787,7 +2787,7 @@ FinalizeNext( contextPtr->index = PTR2INT(data[1]); contextPtr->skip = PTR2INT(data[2]); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c index 6cf505a..8e04c19 100644 --- a/generic/tclOOBasic.c +++ b/generic/tclOOBasic.c @@ -59,10 +59,10 @@ FinalizeConstruction( Object *oPtr = data[0]; if (result != TCL_OK) { - return result; + NRE_NEXT(result); } Tcl_SetObjResult(interp, TclOOObjectName(interp, oPtr)); - return TCL_OK; + NRE_NEXT(TCL_OK); } /* @@ -134,7 +134,7 @@ DecrRefsPostClassConstructor( TclDecrRefCount(invoke[1]); TclDecrRefCount(invoke[2]); ckfree(invoke); - return result; + NRE_NEXT(result); } /* @@ -376,7 +376,7 @@ AfterNRDestructor( Tcl_DeleteCommandFromToken(interp, contextPtr->oPtr->command); } TclOODeleteContext(contextPtr); - return result; + NRE_NEXT(result); } /* @@ -473,7 +473,7 @@ FinalizeEval( */ TclPopStackFrame(interp); - return result; + NRE_NEXT(result); } /* @@ -921,7 +921,7 @@ NextRestoreFrame( if (contextPtr != NULL) { contextPtr->index = PTR2INT(data[2]); } - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index fa16a6e..1c91db6 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -319,7 +319,7 @@ SetFilterFlags( CallContext *contextPtr = data[0]; contextPtr->oPtr->flags |= FILTER_HANDLING; - return result; + NRE_NEXT(result); } static int @@ -331,7 +331,7 @@ ResetFilterFlags( CallContext *contextPtr = data[0]; contextPtr->oPtr->flags &= ~FILTER_HANDLING; - return result; + NRE_NEXT(result); } static int @@ -346,7 +346,7 @@ FinalizeMethodRefs( for (i=0 ; icallPtr->numChain ; i++) { TclOODelMethodRef(contextPtr->callPtr->chain[i].mPtr); } - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclOOMethod.c b/generic/tclOOMethod.c index 83be0aa..f7fb180 100644 --- a/generic/tclOOMethod.c +++ b/generic/tclOOMethod.c @@ -645,7 +645,7 @@ FinalizePMCall( DeleteProcedureMethodRecord(pmPtr); } TclStackFree(interp, fdPtr); - return result; + NRE_NEXT(result); } static int @@ -1288,7 +1288,7 @@ FinalizeForwardCall( Tcl_Obj **argObjs = data[0]; TclStackFree(interp, argObjs); - return result; + NRE_NEXT(result); } /* diff --git a/generic/tclProc.c b/generic/tclProc.c index ffde29d..277fbf0 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -830,7 +830,7 @@ Uplevel_Callback( */ ((Interp *)interp)->varFramePtr = savedVarFramePtr; - return result; + NRE_NEXT(result); } /* ARGSUSED */ @@ -1749,7 +1749,7 @@ InterpProcNR2( TclStackFree(interp, freePtr->compiledLocals); /* Free compiledLocals. */ TclStackFree(interp, freePtr); /* Free CallFrame. */ - return result; + NRE_NEXT(result); /* * Process any non-TCL_OK result code. @@ -2502,7 +2502,7 @@ ApplyNR2( } TclStackFree(interp, extraPtr); - return result; + NRE_NEXT(result); } /* -- cgit v0.12