From f468c8d414ed86b6cc49e569f0632e020ffe7b61 Mon Sep 17 00:00:00 2001 From: Miguel Sofer Date: Sat, 30 Jan 2016 23:48:17 +0000 Subject: NRE API change: callbacks now have three void* arguments (prev. 4) --- generic/tcl.decls | 3 +- generic/tclBasic.c | 83 ++++++++++++++++++++++++++++----------------------- generic/tclCmdAH.c | 42 +++++++++++++++----------- generic/tclCmdIL.c | 19 ++++++++---- generic/tclCmdMZ.c | 37 ++++++++++++++--------- generic/tclDecls.h | 4 +-- generic/tclDictObj.c | 27 +++++++++++------ generic/tclEnsemble.c | 3 +- generic/tclExecute.c | 52 +++++++++++++++++++------------- generic/tclIOUtil.c | 3 +- generic/tclInt.h | 26 ++++++++++++++++ generic/tclInterp.c | 4 +-- generic/tclNRE.h | 20 ++++++++----- generic/tclNamesp.c | 6 ++-- generic/tclOO.c | 20 ++++++++----- generic/tclOOBasic.c | 12 ++++---- generic/tclOOCall.c | 7 ++--- generic/tclOOMethod.c | 4 +-- generic/tclProc.c | 8 ++--- generic/tclTest.c | 8 ++--- 20 files changed, 234 insertions(+), 154 deletions(-) diff --git a/generic/tcl.decls b/generic/tcl.decls index 054e3ad..2fe1368 100644 --- a/generic/tcl.decls +++ b/generic/tcl.decls @@ -2147,8 +2147,7 @@ declare 586 { } declare 587 { void Tcl_NRAddCallback(Tcl_Interp *interp, Tcl_NRPostProc *postProcPtr, - ClientData data0, ClientData data1, ClientData data2, - ClientData data3) + ClientData data0, ClientData data1, ClientData data2) } # For use by NR extenders, to have a simple way to also provide a (required!) # classic objProc diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 295a74c..0732ae5 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4081,7 +4081,8 @@ TclNREvalObjv( * requested Command struct to be invoked. */ { Interp *iPtr = (Interp *) interp; - + ClientData *extra; + /* * data[1] stores a marker for use by tailcalls; it will be set to 1 by * command redirectors (imports, alias, ensembles) so that tailcall skips @@ -4092,20 +4093,21 @@ TclNREvalObjv( if (iPtr->deferredCallbacks) { iPtr->deferredCallbacks = NULL; } else if (iPtr->cmdSourcePtr) { - TclNRAddCallback(interp, NRCommand, iPtr->cmdSourcePtr, - NULL, NULL, NULL); + TclNRAddCallback(interp, NRCommand, iPtr->cmdSourcePtr,NULL, NULL); iPtr->cmdSourcePtr = NULL; } else { - TclNRAddCallback(interp, NRCommand, NULL, - NULL, NULL, NULL); + TclNRAddCallback(interp, NRCommand, NULL, NULL, NULL); } 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); + + NRE_newExtra(extra); + extra[0] = INT2PTR(objc); + extra[1] = (ClientData) objv; + TclNRAddCallback(interp, EvalObjvCore, cmdPtr, INT2PTR(flags), extra); return TCL_OK; } @@ -4117,12 +4119,15 @@ EvalObjvCore( { Command *cmdPtr = NULL, *preCmdPtr = data[0]; int flags = PTR2INT(data[1]); - int objc = PTR2INT(data[2]); - Tcl_Obj **objv = data[3]; + ClientData *extra = data[2]; + int objc = PTR2INT(extra[0]); + Tcl_Obj **objv = extra[1]; Interp *iPtr = (Interp *) interp; Namespace *lookupNsPtr = NULL; int enterTracesDone = 0; + NRE_freeExtra(extra); + /* * Push records for task to be done on return, in INVERSE order. First, if * needed, the exception handlers (as they should happen last). @@ -4250,8 +4255,11 @@ EvalObjvCore( */ cmdPtr->refCount++; + NRE_newExtra(extra); + extra[0] = cmdPtr; + extra[1] = objv; TclNRAddCallback(interp, TEOV_RunLeaveTraces, INT2PTR(objc), - commandPtr, cmdPtr, objv); + commandPtr, extra); } #ifdef USE_DTRACE @@ -4267,7 +4275,7 @@ EvalObjvCore( } if ((TCL_DTRACE_CMD_RETURN_ENABLED() || TCL_DTRACE_CMD_RESULT_ENABLED()) && objc) { - TclNRAddCallback(interp, DTraceCmdReturn, objv[0], NULL, NULL, NULL); + TclNRAddCallback(interp, DTraceCmdReturn, objv[0], NULL, NULL); } if (TCL_DTRACE_CMD_ENTRY_ENABLED() && objc) { TCL_DTRACE_CMD_ENTRY(TclGetString(objv[0]), objc - 1, @@ -4312,7 +4320,7 @@ TclNRSetRoot( (TOP_CB(interp)->data[0] == NULL))); if (!first) { - TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL); } } @@ -4325,7 +4333,7 @@ NRRoot( /* Reset itself so that NRRunCallbacks can detect it and stop (without * running it again)*/ - TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL); return result; } @@ -4344,7 +4352,7 @@ NRCommand( */ if (data[1] && (data[1] != INT2PTR(1))) { - TclNRAddCallback(interp, TclNRTailcallEval, data[1], NULL, NULL, NULL); + TclNRAddCallback(interp, TclNRTailcallEval, data[1], NULL, NULL); } /* OPT ?? @@ -4400,7 +4408,7 @@ TEOV_PushExceptionHandlers( */ TclNRAddCallback(interp, TEOV_Error, INT2PTR(objc), - (ClientData) objv, NULL, NULL); + (ClientData) objv, NULL); } if (iPtr->numLevels == 1) { @@ -4409,7 +4417,7 @@ TEOV_PushExceptionHandlers( */ TclNRAddCallback(interp, TEOV_Exception, INT2PTR(iPtr->evalFlags), - NULL, NULL, NULL); + NULL, NULL); } } @@ -4425,7 +4433,7 @@ TEOV_SwitchVarFrame( */ TclNRAddCallback(interp, TEOV_RestoreVarFrame, iPtr->varFramePtr, NULL, - NULL, NULL); + NULL); iPtr->varFramePtr = iPtr->rootFramePtr; } @@ -4590,7 +4598,7 @@ TEOV_NotFound( } TclSkipTailcall(interp); TclNRAddCallback(interp, TEOV_NotFoundCallback, INT2PTR(handlerObjc), - newObjv, savedNsPtr, NULL); + newObjv, savedNsPtr); return TclNREvalObjv(interp, newObjc, newObjv, TCL_EVAL_NOERR, NULL); } @@ -4684,11 +4692,14 @@ TEOV_RunLeaveTraces( int traceCode = TCL_OK; int objc = PTR2INT(data[0]); Tcl_Obj *commandPtr = data[1]; - Command *cmdPtr = data[2]; - Tcl_Obj **objv = data[3]; + ClientData * extra = data [2]; + Command *cmdPtr = extra[0]; + Tcl_Obj **objv = extra[1]; int length; const char *command = Tcl_GetStringFromObj(commandPtr, &length); + NRE_freeExtra(extra); + if (!(cmdPtr->flags & CMD_IS_DELETED)) { if (cmdPtr->flags & CMD_HAS_EXEC_TRACES){ traceCode = TclCheckExecutionTraces(interp, command, length, @@ -5305,7 +5316,7 @@ TclNREvalObjEx( Tcl_IncrRefCount(listPtr); TclMarkTailcall(interp); - TclNRAddCallback(interp, TEOEx_ListCallback, listPtr, objPtr, NULL, NULL); + TclNRAddCallback(interp, TEOEx_ListCallback, listPtr, objPtr, NULL); ListObjGetElements(listPtr, objc, objv); return TclNREvalObjv(interp, objc, objv, flags, NULL); @@ -5334,7 +5345,7 @@ TclNREvalObjEx( codePtr = TclCompileObj(interp, objPtr); TclNRAddCallback(interp, TEOEx_ByteCodeCallback, savedVarFramePtr, - objPtr, INT2PTR(allowExceptions), NULL); + objPtr, INT2PTR(allowExceptions)); return TclNRExecuteByteCode(interp, codePtr); } @@ -5814,7 +5825,7 @@ TclNRInvoke( /* Avoid the exception-handling brain damage when numLevels == 0 . */ iPtr->numLevels++; - Tcl_NRAddCallback(interp, NRPostInvoke, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, NRPostInvoke, NULL, NULL, NULL); /* * Normal command resolution of objv[0] isn't going to find cmdPtr. @@ -7405,8 +7416,7 @@ TclMarkTailcall( Interp *iPtr = (Interp *) interp; if (iPtr->deferredCallbacks == NULL) { - TclNRAddCallback(interp, NRCommand, NULL, NULL, - NULL, NULL); + TclNRAddCallback(interp, NRCommand, NULL, NULL, NULL); iPtr->deferredCallbacks = TOP_CB(interp); } } @@ -7425,7 +7435,7 @@ void TclPushTailcallPoint( Tcl_Interp *interp) { - TclNRAddCallback(interp, NRCommand, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, NRCommand, NULL, NULL, NULL); ((Interp *) interp)->numLevels++; } @@ -7586,7 +7596,7 @@ TclNRTailcallEval( */ TclMarkTailcall(interp); - TclNRAddCallback(interp, TailcallCleanup, listPtr, NULL, NULL,NULL); + TclNRAddCallback(interp, TailcallCleanup, listPtr, NULL, NULL); iPtr->lookupNsPtr = (Namespace *) nsPtr; return TclNREvalObjv(interp, objc-1, objv+1, 0, NULL); @@ -7608,13 +7618,12 @@ Tcl_NRAddCallback( Tcl_NRPostProc *postProcPtr, ClientData data0, ClientData data1, - ClientData data2, - ClientData data3) + ClientData data2) { if (!(postProcPtr)) { Tcl_Panic("Adding a callback without an objProc?!"); } - TclNRAddCallback(interp, postProcPtr, data0, data1, data2, data3); + TclNRAddCallback(interp, postProcPtr, data0, data1, data2); } /* @@ -7668,7 +7677,7 @@ TclNRYieldObjCmd( NRE_ASSERT(!COR_IS_SUSPENDED(corPtr)); TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, - clientData, NULL, NULL); + clientData, NULL); return TCL_OK; } @@ -7741,7 +7750,7 @@ RewindCoroutine( corPtr->eePtr->rewind = 1; TclNRAddCallback(interp, RewindCoroutineCallback, state, - NULL, NULL, NULL); + NULL, NULL); return TclNRInterpCoroutine(corPtr, interp, 0, NULL); } @@ -7882,7 +7891,7 @@ TclNRCoroutineActivateCallback( */ TclNRAddCallback(interp, NRCoroutineCallerCallback, corPtr, - NULL, NULL, NULL); + NULL, NULL); /* * Record the stackLevel at which the resume is happening, then swap @@ -8040,7 +8049,7 @@ TclNRInterpCoroutine( } TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, - NULL, NULL, NULL); + NULL, NULL); return TCL_OK; } @@ -8151,7 +8160,7 @@ TclNRCoroutineObjCmd( iPtr->execEnvPtr = corPtr->eePtr; TclNRAddCallback(interp, NRCoroutineExitCallback, corPtr, - NULL, NULL, NULL); + NULL, NULL); /* insure that the command is looked up in the correct namespace */ iPtr->lookupNsPtr = lookupNsPtr; @@ -8167,7 +8176,7 @@ TclNRCoroutineObjCmd( */ TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, - NULL, NULL, NULL); + NULL, NULL); return TCL_OK; } @@ -8272,7 +8281,7 @@ TclNewCallback( } eePtr->NRStack = this; eePtr->callbackPtr = &this->items[NRE_STACK_SIZE]; - TclNRAddCallback(interp, NRStackBottom, orig, NULL, NULL, NULL); + TclNRAddCallback(interp, NRStackBottom, orig, NULL, NULL); return --eePtr->callbackPtr; } diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 698782a..d7545d1 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -181,7 +181,7 @@ TclNRCatchObjCmd( } TclNRAddCallback(interp, CatchObjCmdCallback, INT2PTR(objc), - varNamePtr, optionVarNamePtr, NULL); + varNamePtr, optionVarNamePtr); return TclNREvalObjEx(interp, objv[1], 0); } @@ -634,7 +634,7 @@ TclNREvalObjCmd( objPtr = Tcl_ConcatObj(objc-1, objv+1); } - TclNRAddCallback(interp, EvalCmdErrMsg, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, EvalCmdErrMsg, NULL, NULL, NULL); return TclNREvalObjEx(interp, objPtr, 0); } @@ -733,10 +733,10 @@ TclNRExprObjCmd( Tcl_IncrRefCount(resultPtr); if (objc == 2) { objPtr = objv[1]; - TclNRAddCallback(interp, ExprCallback, resultPtr, NULL, NULL, NULL); + TclNRAddCallback(interp, ExprCallback, resultPtr, NULL, NULL); } else { objPtr = Tcl_ConcatObj(objc-1, objv+1); - TclNRAddCallback(interp, ExprCallback, resultPtr, objPtr, NULL, NULL); + TclNRAddCallback(interp, ExprCallback, resultPtr, objPtr, NULL); } return Tcl_NRExprObj(interp, objPtr, resultPtr); @@ -2258,7 +2258,7 @@ TclNRForObjCmd( } TclNRAddCallback(interp, ForSetupCallback, /*cond*/ objv[2], - /*body*/ objv[4], /*next*/ objv[3], NULL); + /*body*/ objv[4], /*next*/ objv[3]); return TclNREvalObjEx(interp, objv[1], 0); } @@ -2274,8 +2274,7 @@ ForSetupCallback( } NRE_NEXT(result); } - NRE_JUMP(interp, TclNRForIterCallback, data[0], data[1], data[2], - data[3]); + NRE_JUMP(interp, TclNRForIterCallback, data[0], data[1], data[2]); } int @@ -2285,7 +2284,8 @@ TclNRForIterCallback( int result) { Tcl_Obj *boolObj; - + ClientData *extra; + switch (result) { case TCL_OK: case TCL_CONTINUE: @@ -2296,9 +2296,11 @@ TclNRForIterCallback( */ Tcl_ResetResult(interp); + NRE_newExtra(extra); + extra[0] = data[2]; TclNewObj(boolObj); - TclNRAddCallback(interp, ForCondCallback, data[0], data[1], data[2], - boolObj); + extra[1] = boolObj; + TclNRAddCallback(interp, ForCondCallback, data[0], data[1], extra); return Tcl_NRExprObj(interp, /*cond*/ data[0], boolObj); case TCL_BREAK: result = TCL_OK; @@ -2317,9 +2319,13 @@ ForCondCallback( Tcl_Interp *interp, int result) { - Tcl_Obj *boolObj = data[3]; + ClientData *extra = data[2]; + Tcl_Obj *boolObj = extra[1]; int value; + data[2] = extra[0]; + NRE_freeExtra(extra); + if (result != TCL_OK) { Tcl_DecrRefCount(boolObj); NRE_NEXT(result); @@ -2335,10 +2341,10 @@ ForCondCallback( if (/*next*/ data[2]) { TclNRAddCallback(interp, ForNextCallback, data[0], data[1], - data[2], NULL); + data[2]); } else { TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], - data[2], NULL); + data[2]); } return TclNREvalObjEx(interp, /*body*/ data[1], 0); } @@ -2353,12 +2359,12 @@ ForNextCallback( if ((result == TCL_OK) || (result == TCL_CONTINUE)) { TclNRAddCallback(interp, ForPostNextCallback, data[0], data[1], - data[2], NULL); + data[2]); return TclNREvalObjEx(interp, next, 0); } TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], - data[2], NULL); + data[2]); NRE_NEXT(result); } @@ -2375,7 +2381,7 @@ ForPostNextCallback( NRE_NEXT(result); } TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], - data[2], NULL); + data[2]); NRE_NEXT(result); } @@ -2546,7 +2552,7 @@ EachloopCmd( goto done; } - TclNRAddCallback(interp, ForeachLoopStep, statePtr, NULL, NULL, NULL); + TclNRAddCallback(interp, ForeachLoopStep, statePtr, NULL, NULL); return TclNREvalObjEx(interp, objv[objc-1], 0); } @@ -2611,7 +2617,7 @@ ForeachLoopStep( goto done; } - TclNRAddCallback(interp, ForeachLoopStep, statePtr, NULL, NULL, NULL); + TclNRAddCallback(interp, ForeachLoopStep, statePtr, NULL, NULL); return TclNREvalObjEx(interp, statePtr->bodyPtr, 0); } diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index a0e8113..87fca8f 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -216,7 +216,8 @@ TclNRIfObjCmd( Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Obj *boolObj; - + ClientData *extra; + if (objc <= 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "wrong # args: no expression after \"%s\" argument", @@ -231,9 +232,12 @@ TclNRIfObjCmd( * to execute if the expression is true. */ + NRE_newExtra(extra); TclNewObj(boolObj); + extra[0] = INT2PTR(1); + extra[1] = boolObj; Tcl_NRAddCallback(interp, IfConditionCallback, INT2PTR(objc), - (ClientData) objv, INT2PTR(1), boolObj); + (ClientData) objv, extra); return Tcl_NRExprObj(interp, objv[1], boolObj); } @@ -245,11 +249,13 @@ IfConditionCallback( { int objc = PTR2INT(data[0]); Tcl_Obj *const *objv = data[1]; - int i = PTR2INT(data[2]); - Tcl_Obj *boolObj = data[3]; + ClientData *extra = data[2]; + int i = PTR2INT(extra[0]); + Tcl_Obj *boolObj = extra[1]; int value, thenScriptIndex = 0; const char *clause; + NRE_freeExtra(extra); if (result != TCL_OK) { TclDecrRefCount(boolObj); NRE_NEXT(result); @@ -314,9 +320,12 @@ IfConditionCallback( return TCL_ERROR; } if (!thenScriptIndex) { + NRE_newExtra(extra); TclNewObj(boolObj); + extra[0] = INT2PTR(i); + extra[1] = boolObj; Tcl_NRAddCallback(interp, IfConditionCallback, data[0], data[1], - INT2PTR(i), boolObj); + extra); return Tcl_NRExprObj(interp, objv[i], boolObj); } } diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index ad138ab..e0ce478 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -3914,7 +3914,7 @@ TclNRSwitchObjCmd( } Tcl_NRAddCallback(interp, SwitchPostProc, (ClientData) pattern, - NULL, NULL, NULL); + NULL, NULL); return TclNREvalObjEx(interp, objv[j], 0); } @@ -4136,6 +4136,7 @@ TclNRTryObjCmd( { Tcl_Obj *bodyObj, *handlersObj, *finallyObj = NULL; int i, bodyShared, haveHandlers, dummy, code; + ClientData *extra; static const char *const handlerNames[] = { "finally", "on", "trap", NULL }; @@ -4268,8 +4269,11 @@ TclNRTryObjCmd( * Execute the body. */ - Tcl_NRAddCallback(interp, TryPostBody, handlersObj, finallyObj, - (ClientData)objv, INT2PTR(objc)); + NRE_newExtra(extra); + extra[0] = (ClientData)objv; + extra[1] = INT2PTR(objc); + Tcl_NRAddCallback(interp, TryPostBody, handlersObj, finallyObj, extra); + return TclNREvalObjEx(interp, bodyObj, 0); } @@ -4336,9 +4340,11 @@ TryPostBody( handlersObj = data[0]; finallyObj = data[1]; - objv = data[2]; - objc = PTR2INT(data[3]); + ClientData *extra = data[2]; + objv = extra[0]; + objc = PTR2INT(extra[1]); + NRE_freeExtra(extra); cmdObj = objv[0]; /* @@ -4482,8 +4488,11 @@ TryPostBody( */ handlerBodyObj = info[4]; - Tcl_NRAddCallback(interp, TryPostHandler, objv, options, info[0], - INT2PTR((finallyObj == NULL) ? 0 : objc - 1)); + + NRE_newExtra(extra); + extra[0] = info[0]; + extra[1] = INT2PTR((finallyObj == NULL) ? 0 : objc - 1); + Tcl_NRAddCallback(interp, TryPostHandler, objv, options, extra); Tcl_DecrRefCount(handlersObj); return TclNREvalObjEx(interp, handlerBodyObj, 0); @@ -4509,8 +4518,7 @@ TryPostBody( */ if (finallyObj != NULL) { - Tcl_NRAddCallback(interp, TryPostFinal, resultObj, options, cmdObj, - NULL); + Tcl_NRAddCallback(interp, TryPostFinal, resultObj, options, cmdObj); return TclNREvalObjEx(interp, finallyObj, 0); } @@ -4549,9 +4557,11 @@ TryPostHandler( objv = data[0]; options = data[1]; - handlerKindObj = data[2]; - finally = PTR2INT(data[3]); + ClientData *extra = data[2]; + handlerKindObj = extra[0]; + finally = PTR2INT(extra[1]); + NRE_freeExtra(extra); cmdObj = objv[0]; finallyObj = finally ? objv[finally] : 0; @@ -4590,8 +4600,7 @@ TryPostHandler( */ if (finallyObj != NULL) { - Tcl_NRAddCallback(interp, TryPostFinal, resultObj, options, cmdObj, - NULL); + Tcl_NRAddCallback(interp, TryPostFinal, resultObj, options, cmdObj); /* The 'finally' script is always the last argument word. */ return TclNREvalObjEx(interp, finallyObj, 0); @@ -4713,7 +4722,7 @@ TclNRWhileObjCmd( * We reuse [for]'s callback, passing a NULL for the 'next' script. */ TclNRAddCallback(interp, TclNRForIterCallback, /*cond*/ objv[1], - /*body*/ objv[2], /*next*/ NULL, NULL); + /*body*/ objv[2], /*next*/ NULL); return TCL_OK; } diff --git a/generic/tclDecls.h b/generic/tclDecls.h index 054c21a..3ae7454 100644 --- a/generic/tclDecls.h +++ b/generic/tclDecls.h @@ -1694,7 +1694,7 @@ EXTERN int Tcl_NRCmdSwap(Tcl_Interp *interp, Tcl_Command cmd, EXTERN void Tcl_NRAddCallback(Tcl_Interp *interp, Tcl_NRPostProc *postProcPtr, ClientData data0, ClientData data1, - ClientData data2, ClientData data3); + ClientData data2); /* 588 */ EXTERN int Tcl_NRCallObjProc(Tcl_Interp *interp, Tcl_ObjCmdProc *objProc, @@ -2432,7 +2432,7 @@ typedef struct TclStubs { int (*tcl_NREvalObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 584 */ int (*tcl_NREvalObjv) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], int flags); /* 585 */ int (*tcl_NRCmdSwap) (Tcl_Interp *interp, Tcl_Command cmd, int objc, Tcl_Obj *const objv[], int flags); /* 586 */ - void (*tcl_NRAddCallback) (Tcl_Interp *interp, Tcl_NRPostProc *postProcPtr, ClientData data0, ClientData data1, ClientData data2, ClientData data3); /* 587 */ + void (*tcl_NRAddCallback) (Tcl_Interp *interp, Tcl_NRPostProc *postProcPtr, ClientData data0, ClientData data1, ClientData data2); /* 587 */ int (*tcl_NRCallObjProc) (Tcl_Interp *interp, Tcl_ObjCmdProc *objProc, ClientData clientData, int objc, Tcl_Obj *const objv[]); /* 588 */ unsigned (*tcl_GetFSDeviceFromStat) (const Tcl_StatBuf *statPtr); /* 589 */ unsigned (*tcl_GetFSInodeFromStat) (const Tcl_StatBuf *statPtr); /* 590 */ diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 4bba648..6da9539 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -2361,6 +2361,7 @@ DictForNRCmd( Tcl_Obj **varv, *keyObj, *valueObj; Tcl_DictSearch *searchPtr; int varc, done; + ClientData *extra; if (objc != 4) { Tcl_WrongNumArgs(interp, 1, objv, @@ -2427,8 +2428,11 @@ DictForNRCmd( * Run the script. */ + NRE_newExtra(extra); + extra[0] = valueVarObj; + extra[1] = scriptObj; TclNRAddCallback(interp, DictForLoopCallback, searchPtr, keyVarObj, - valueVarObj, scriptObj); + extra); return TclNREvalObjEx(interp, scriptObj, 0); /* @@ -2452,11 +2456,14 @@ DictForLoopCallback( { Tcl_DictSearch *searchPtr = data[0]; Tcl_Obj *keyVarObj = data[1]; - Tcl_Obj *valueVarObj = data[2]; - Tcl_Obj *scriptObj = data[3]; + ClientData *extra = data[2]; + Tcl_Obj *valueVarObj = extra[0]; + Tcl_Obj *scriptObj = extra[1]; Tcl_Obj *keyObj, *valueObj; int done; + NRE_freeExtra(extra); + /* * Process the result from the previous execution of the script body. */ @@ -2508,8 +2515,11 @@ DictForLoopCallback( * Run the script. */ + NRE_newExtra(extra); + extra[0] = valueVarObj; + extra[1] = scriptObj; TclNRAddCallback(interp, DictForLoopCallback, searchPtr, keyVarObj, - valueVarObj, scriptObj); + extra); return TclNREvalObjEx(interp, scriptObj, 0); /* @@ -2628,7 +2638,7 @@ DictMapNRCmd( * Run the script. */ - TclNRAddCallback(interp, DictMapLoopCallback, storagePtr, NULL,NULL,NULL); + TclNRAddCallback(interp, DictMapLoopCallback, storagePtr, NULL,NULL); return TclNREvalObjEx(interp, storagePtr->scriptObj, 0); /* @@ -2716,7 +2726,7 @@ DictMapLoopCallback( * Run the script. */ - TclNRAddCallback(interp, DictMapLoopCallback, storagePtr, NULL,NULL,NULL); + TclNRAddCallback(interp, DictMapLoopCallback, storagePtr, NULL,NULL); return TclNREvalObjEx(interp, storagePtr->scriptObj, 0); /* @@ -3201,7 +3211,7 @@ DictUpdateCmd( objPtr = Tcl_NewListObj(objc-3, objv+2); Tcl_IncrRefCount(objPtr); Tcl_IncrRefCount(objv[1]); - TclNRAddCallback(interp, FinalizeDictUpdate, objv[1], objPtr, NULL,NULL); + TclNRAddCallback(interp, FinalizeDictUpdate, objv[1], objPtr, NULL); return TclNREvalObjEx(interp, objv[objc-1], 0); } @@ -3350,8 +3360,7 @@ DictWithCmd( Tcl_IncrRefCount(pathPtr); } Tcl_IncrRefCount(objv[1]); - TclNRAddCallback(interp, FinalizeDictWith, objv[1], keysPtr, pathPtr, - NULL); + TclNRAddCallback(interp, FinalizeDictWith, objv[1], keysPtr, pathPtr); return TclNREvalObjEx(interp, objv[objc-1], 0); } diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index 89b7381..faf3ab7 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -1882,8 +1882,7 @@ NsEnsembleImplementationCmdNR( 2 + ensemblePtr->numParameters; iPtr->ensembleRewrite.numInsertedObjs = prefixObjc + ensemblePtr->numParameters; - TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, - NULL); + TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL); } else { register int ni = 2 + ensemblePtr->numParameters - iPtr->ensembleRewrite.numInsertedObjs; diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 9ca623f..42f4073 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -136,7 +136,7 @@ typedef struct TEBCdata { do { \ esPtr->tosPtr = tosPtr; \ TclNRAddCallback(interp, TEBCresume, \ - TD, pc, INT2PTR(cleanup), NULL); \ + TD, pc, INT2PTR(cleanup)); \ } while (0) #define TEBC_DATA_DIG() \ @@ -1401,7 +1401,7 @@ Tcl_ExprObj( TclNRSetRoot(interp); TclNewObj(resultPtr); Tcl_NRAddCallback(interp, CopyCallback, resultPtrPtr, resultPtr, - NULL, NULL); + NULL); Tcl_NRExprObj(interp, objPtr, resultPtr); return TclNRRunCallbacks(interp, TCL_OK); } @@ -1460,7 +1460,7 @@ Tcl_NRExprObj( codePtr = CompileExprObj(interp, objPtr); Tcl_NRAddCallback(interp, ExprObjCallback, state, resultPtr, - NULL, NULL); + NULL); return TclNRExecuteByteCode(interp, codePtr); } @@ -1935,7 +1935,7 @@ TclNRExecuteByteCode( #endif TclNRAddCallback(interp, TEBCresume, TD, /* pc */ NULL, - /* cleanup */ INT2PTR(0), NULL); + /* cleanup */ INT2PTR(0)); return TCL_OK; } @@ -2393,11 +2393,11 @@ TEBCresume( #if 1 // FIXME! Why?? TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, - INT2PTR(yieldParameter), NULL, NULL); + INT2PTR(yieldParameter), NULL); return TCL_OK; #else NRE_JUMP(interp, TclNRCoroutineActivateCallback, corPtr, - INT2PTR(yieldParameter), NULL, NULL); + INT2PTR(yieldParameter), NULL); #endif } @@ -2881,7 +2881,7 @@ TEBCresume( TEBC_YIELD(); TclMarkTailcall(interp); - TclNRAddCallback(interp, TclClearRootEnsemble, NULL,NULL,NULL,NULL); + TclNRAddCallback(interp, TclClearRootEnsemble, NULL,NULL,NULL); return TclNREvalObjEx(interp, objPtr, TCL_EVAL_INVOKE); /* @@ -4602,14 +4602,20 @@ TEBCresume( TclPushTailcallPoint(interp); oPtr = contextPtr->oPtr; - if (oPtr->flags & FILTER_HANDLING) { - TclNRAddCallback(interp, FinalizeOONextFilter, - framePtr, contextPtr, INT2PTR(contextPtr->index), - INT2PTR(contextPtr->skip)); - } else { - TclNRAddCallback(interp, FinalizeOONext, - framePtr, contextPtr, INT2PTR(contextPtr->index), - INT2PTR(contextPtr->skip)); + { + ClientData *extra; + + NRE_newExtra(extra); + extra[0] = INT2PTR(contextPtr->index); + extra[1] = INT2PTR(contextPtr->skip); + + if (oPtr->flags & FILTER_HANDLING) { + TclNRAddCallback(interp, FinalizeOONextFilter, + framePtr, contextPtr, extra); + } else { + TclNRAddCallback(interp, FinalizeOONext, + framePtr, contextPtr, extra); + } } contextPtr->skip = skip; contextPtr->index = newDepth; @@ -7738,7 +7744,8 @@ FinalizeOONext( { Interp *iPtr = (Interp *) interp; CallContext *contextPtr = data[1]; - + ClientData *extra = data[2]; + /* * Reset the variable lookup frame. */ @@ -7750,9 +7757,11 @@ FinalizeOONext( * and want to operate in the outer context again. */ - contextPtr->index = PTR2INT(data[2]); - contextPtr->skip = PTR2INT(data[3]); + contextPtr->index = PTR2INT(extra[0]); + contextPtr->skip = PTR2INT(extra[1]); contextPtr->oPtr->flags &= ~FILTER_HANDLING; + + NRE_freeExtra(extra); NRE_NEXT(result); } @@ -7764,7 +7773,8 @@ FinalizeOONextFilter( { Interp *iPtr = (Interp *) interp; CallContext *contextPtr = data[1]; - + ClientData *extra = data[2]; + /* * Reset the variable lookup frame. */ @@ -7776,8 +7786,8 @@ FinalizeOONextFilter( * and want to operate in the outer context again. */ - contextPtr->index = PTR2INT(data[2]); - contextPtr->skip = PTR2INT(data[3]); + contextPtr->index = PTR2INT(extra[0]); + contextPtr->skip = PTR2INT(extra[1]); contextPtr->oPtr->flags |= FILTER_HANDLING; NRE_NEXT(result); } diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 5336189..144b6ed 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -1960,8 +1960,7 @@ TclNREvalFile( */ iPtr->evalFlags |= TCL_EVAL_FILE; - TclNRAddCallback(interp, EvalFileCallback, oldScriptFile, pathPtr, objPtr, - NULL); + TclNRAddCallback(interp, EvalFileCallback, oldScriptFile, pathPtr, objPtr); return TclNREvalObjEx(interp, objPtr, 0); } diff --git a/generic/tclInt.h b/generic/tclInt.h index fbfa5a7..4a3a0c1 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -4356,6 +4356,32 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; {enum { ct_assert_value = 1/(!!(e)) };} /* + *---------------------------------------------------------------- + * Allocator for small structs (<=sizeof(Tcl_Obj)) using the Tcl_Obj pool. + * Only checked at compile time. + * + * ONLY USE FOR CONSTANT nBytes. + * + * DO NOT LET THEM CROSS THREAD BOUNDARIES + *---------------------------------------------------------------- + */ + +#define TclSmallAlloc(nbytes, memPtr) \ + do { \ + Tcl_Obj *objPtr; \ + TCL_CT_ASSERT((nbytes)<=sizeof(Tcl_Obj)); \ + TclIncrObjsAllocated(); \ + TclAllocObjStorage(objPtr); \ + memPtr = (ClientData) (objPtr); \ + } while (0) + +#define TclSmallFree(memPtr) \ + do { \ + TclFreeObjStorage((Tcl_Obj *) (memPtr)); \ + TclIncrObjsFreed(); \ + } while (0) + +/* * Support for Clang Static Analyzer */ diff --git a/generic/tclInterp.c b/generic/tclInterp.c index f285d99..4c118e2 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -1841,7 +1841,7 @@ AliasNRCmd( */ if (isRootEnsemble) { - TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, TclClearRootEnsemble, NULL, NULL, NULL); } TclSkipTailcall(interp); return Tcl_NREvalObj(interp, listPtr, flags); @@ -3065,7 +3065,7 @@ SlaveInvokeHidden( TclNRSetRoot(slaveInterp); } Tcl_NRAddCallback(interp, NRPostInvokeHidden, slaveInterp, - NULL, NULL, NULL); + NULL, NULL); return TclNRInvoke(NULL, slaveInterp, objc, objv); } else { Namespace *nsPtr, *dummy1, *dummy2; diff --git a/generic/tclNRE.h b/generic/tclNRE.h index 74b5997..03532df 100644 --- a/generic/tclNRE.h +++ b/generic/tclNRE.h @@ -23,26 +23,30 @@ typedef struct NRE_stack { struct NRE_stack *next; } NRE_stack; +#define NRE_newExtra(ptr) \ + TclSmallAlloc(5*sizeof(ClientData), ptr) +#define NRE_freeExtra(ptr) TclSmallFree(ptr) + /* * Inline versions of Tcl_NRAddCallback and friends */ #define TOP_CB(iPtr) (((Interp *)(iPtr))->execEnvPtr->callbackPtr) -#define TclNRAddCallback(interp,postProcPtr,data0,data1,data2,data3) \ +#define TclNRAddCallback(interp,postProcPtr,data0,data1,data2) \ do { \ NRE_callback *cbPtr; \ ALLOC_CB(interp, cbPtr); \ - INIT_CB(cbPtr, postProcPtr,data0,data1,data2,data3); \ + INIT_CB(cbPtr, postProcPtr,data0,data1,data2); \ } while (0) -#define INIT_CB(cbPtr, postProcPtr,data0,data1,data2,data3) \ +#define INIT_CB(cbPtr, postProcPtr,data0,data1,data2) \ do { \ cbPtr->procPtr = (postProcPtr); \ cbPtr->data[0] = (ClientData)(data0); \ cbPtr->data[1] = (ClientData)(data1); \ cbPtr->data[2] = (ClientData)(data2); \ - cbPtr->data[3] = (ClientData)(data3); \ + cbPtr->data[3] = NULL; \ } while (0) #define POP_CB(interp, cbPtr) \ @@ -65,15 +69,15 @@ typedef struct NRE_stack { #define NRE_TRAMPOLINE 0 #if NRE_TRAMPOLINE -#define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \ - TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \ +#define NRE_JUMP(interp,postProcPtr,data0,data1,data2) \ + TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2)); \ NRE_NEXT(TCL_OK) #define NRE_NEXT(result) \ return (result) #else /* no trampoline, optimized sibcalls */ -#define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \ - TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \ +#define NRE_JUMP(interp,postProcPtr,data0,data1,data2) \ + TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2)); \ NRE_NEXT(TCL_OK) #define NRE_NEXT(result) \ do { /* optimized indirect sibling calls?! */ \ diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index b8c447e..f51a709 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -3335,8 +3335,7 @@ NRNamespaceEvalCmd( objPtr = Tcl_ConcatObj(objc-2, objv+2); } - TclNRAddCallback(interp, NsEval_Callback, namespacePtr, "eval", - NULL, NULL); + TclNRAddCallback(interp, NsEval_Callback, namespacePtr, "eval", NULL); return TclNREvalObjEx(interp, objPtr, 0); } @@ -3777,8 +3776,7 @@ NRNamespaceInscopeCmd( Tcl_DecrRefCount(listPtr); /* We're done with the list object. */ } - TclNRAddCallback(interp, NsEval_Callback, namespacePtr, "inscope", - NULL, NULL); + TclNRAddCallback(interp, NsEval_Callback, namespacePtr, "inscope", NULL); return TclNREvalObjEx(interp, cmdObjPtr, 0); } diff --git a/generic/tclOO.c b/generic/tclOO.c index d08273b..4350dcc 100644 --- a/generic/tclOO.c +++ b/generic/tclOO.c @@ -1751,7 +1751,8 @@ TclNRNewObjectInstance( CallContext *contextPtr; Tcl_InterpState state; Object *oPtr; - + ClientData *extra; + /* * Check if we're going to create an object over an existing command; * that's not allowed. @@ -1825,8 +1826,10 @@ TclNRNewObjectInstance( */ AddRef(oPtr); - TclNRAddCallback(interp, FinalizeAlloc, contextPtr, oPtr, state, - objectPtr); + NRE_newExtra(extra); + extra[0] = state; + extra[1] = objectPtr; + TclNRAddCallback(interp, FinalizeAlloc, contextPtr, oPtr, extra); TclPushTailcallPoint(interp); return TclOOInvokeContext(contextPtr, interp, objc, objv); } @@ -1839,8 +1842,11 @@ FinalizeAlloc( { CallContext *contextPtr = data[0]; Object *oPtr = data[1]; - Tcl_InterpState state = data[2]; - Tcl_Object *objectPtr = data[3]; + ClientData *extra = data[2]; + Tcl_InterpState state = extra[0]; + Tcl_Object *objectPtr = extra[1]; + + NRE_freeExtra(extra); /* * It's an error if the object was whacked in the constructor. Force this @@ -2631,7 +2637,7 @@ TclOOObjectCmdCore( * for the duration. */ - TclNRAddCallback(interp, FinalizeObjectCall, contextPtr, NULL,NULL,NULL); + TclNRAddCallback(interp, FinalizeObjectCall, contextPtr, NULL,NULL); return TclOOInvokeContext(contextPtr, interp, objc, objv); } @@ -2785,7 +2791,7 @@ TclNRObjectContextInvokeNext( */ TclNRAddCallback(interp, FinalizeNext, contextPtr, - INT2PTR(contextPtr->index), INT2PTR(contextPtr->skip), NULL); + INT2PTR(contextPtr->index), INT2PTR(contextPtr->skip)); contextPtr->index++; contextPtr->skip = skip; diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c index 8e04c19..856660a 100644 --- a/generic/tclOOBasic.c +++ b/generic/tclOOBasic.c @@ -46,7 +46,7 @@ static inline Tcl_Object * AddConstructionFinalizer( Tcl_Interp *interp) { - TclNRAddCallback(interp, FinalizeConstruction, NULL, NULL, NULL, NULL); + TclNRAddCallback(interp, FinalizeConstruction, NULL, NULL, NULL); return (Tcl_Object *) &(TOP_CB(interp)->data[0]); } @@ -112,7 +112,7 @@ TclOO_Class_Constructor( Tcl_IncrRefCount(invoke[1]); Tcl_IncrRefCount(invoke[2]); TclNRAddCallback(interp, DecrRefsPostClassConstructor, - invoke, NULL, NULL, NULL); + invoke, NULL, NULL); /* * Tricky point: do not want the extra reported level in the Tcl stack @@ -353,7 +353,7 @@ TclOO_Object_Destroy( contextPtr->callPtr->flags |= DESTRUCTOR; contextPtr->skip = 0; TclNRAddCallback(interp, AfterNRDestructor, contextPtr, - NULL, NULL, NULL); + NULL, NULL); TclPushTailcallPoint(interp); return TclOOInvokeContext(contextPtr, interp, 0, NULL); } @@ -443,7 +443,7 @@ TclOO_Object_Eval( * the script completes. */ - TclNRAddCallback(interp, FinalizeEval, object, NULL, NULL, NULL); + TclNRAddCallback(interp, FinalizeEval, object, NULL, NULL); return TclNREvalObjEx(interp, scriptPtr, 0); } @@ -797,7 +797,7 @@ TclOONextObjCmd( * that this is like [uplevel 1] and not [eval]. */ - TclNRAddCallback(interp, NextRestoreFrame, framePtr, NULL,NULL,NULL); + TclNRAddCallback(interp, NextRestoreFrame, framePtr, NULL,NULL); iPtr->varFramePtr = framePtr->callerVarPtr; return TclNRObjectContextInvokeNext(interp, context, objc, objv, 1); } @@ -868,7 +868,7 @@ TclOONextToObjCmd( */ TclNRAddCallback(interp, NextRestoreFrame, framePtr, - contextPtr, INT2PTR(contextPtr->index), NULL); + contextPtr, INT2PTR(contextPtr->index)); contextPtr->index = i-1; iPtr->varFramePtr = framePtr->callerVarPtr; return TclNRObjectContextInvokeNext(interp, diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index 1c91db6..e3e0126 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -283,8 +283,7 @@ TclOOInvokeContext( * this call is finished. */ - TclNRAddCallback(interp, FinalizeMethodRefs, contextPtr, NULL, NULL, - NULL); + TclNRAddCallback(interp, FinalizeMethodRefs, contextPtr, NULL, NULL); } /* @@ -292,9 +291,9 @@ TclOOInvokeContext( */ if (contextPtr->oPtr->flags & FILTER_HANDLING) { - TclNRAddCallback(interp, SetFilterFlags, contextPtr, NULL,NULL,NULL); + TclNRAddCallback(interp, SetFilterFlags, contextPtr, NULL,NULL); } else { - TclNRAddCallback(interp, ResetFilterFlags,contextPtr,NULL,NULL,NULL); + TclNRAddCallback(interp, ResetFilterFlags,contextPtr,NULL,NULL); } if (isFilter || contextPtr->callPtr->flags & FILTER_HANDLING) { contextPtr->oPtr->flags |= FILTER_HANDLING; diff --git a/generic/tclOOMethod.c b/generic/tclOOMethod.c index f7fb180..aa56efa 100644 --- a/generic/tclOOMethod.c +++ b/generic/tclOOMethod.c @@ -602,7 +602,7 @@ InvokeProcedureMethod( * Now invoke the body of the method. */ - TclNRAddCallback(interp, FinalizePMCall, pmPtr, context, fdPtr, NULL); + TclNRAddCallback(interp, FinalizePMCall, pmPtr, context, fdPtr); return TclNRInterpProcCore(interp, fdPtr->nameObj, Tcl_ObjectContextSkippedArgs(context), fdPtr->errProc); } @@ -1273,7 +1273,7 @@ InvokeForwardMethod( Tcl_ListObjGetElements(NULL, fmPtr->prefixObj, &numPrefixes, &prefixObjs); argObjs = InitEnsembleRewrite(interp, objc, objv, skip, numPrefixes, prefixObjs, &len); - Tcl_NRAddCallback(interp, FinalizeForwardCall, argObjs, NULL, NULL, NULL); + Tcl_NRAddCallback(interp, FinalizeForwardCall, argObjs, NULL, NULL); ((Interp *)interp)->lookupNsPtr = (Namespace *) contextPtr->oPtr->namespacePtr; return TclNREvalObjv(interp, len, argObjs, TCL_EVAL_NOERR, NULL); diff --git a/generic/tclProc.c b/generic/tclProc.c index 277fbf0..67b6bfc 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -901,8 +901,7 @@ TclNRUplevelObjCmd( objPtr = Tcl_ConcatObj(objc, objv); } - TclNRAddCallback(interp, Uplevel_Callback, savedVarFramePtr, NULL, NULL, - NULL); + TclNRAddCallback(interp, Uplevel_Callback, savedVarFramePtr, NULL, NULL); return TclNREvalObjEx(interp, objPtr, 0); } @@ -1695,8 +1694,7 @@ TclNRInterpProcCore( procPtr->refCount++; codePtr = procPtr->bodyPtr->internalRep.twoPtrValue.ptr1; - TclNRAddCallback(interp, InterpProcNR2, procNameObj, errorProc, - NULL, NULL); + TclNRAddCallback(interp, InterpProcNR2, procNameObj, errorProc, NULL); return TclNRExecuteByteCode(interp, codePtr); } @@ -2483,7 +2481,7 @@ TclNRApplyObjCmd( result = TclPushProcCallFrame(procPtr, interp, objc, objv, 1); if (result == TCL_OK) { - TclNRAddCallback(interp, ApplyNR2, extraPtr, NULL, NULL, NULL); + TclNRAddCallback(interp, ApplyNR2, extraPtr, NULL, NULL); result = TclNRInterpProcCore(interp, objv[1], 2, &MakeLambdaError); } return result; diff --git a/generic/tclTest.c b/generic/tclTest.c index baf54ec..4a9a0bd 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -6575,13 +6575,13 @@ NREUnwind_callback( { if (data[0] == INT2PTR(-1)) { TclNRAddCallback(interp, NREUnwind_callback, NRE_depth(), INT2PTR(-1), - INT2PTR(-1), NULL); + INT2PTR(-1)); } else if (data[1] == INT2PTR(-1)) { TclNRAddCallback(interp, NREUnwind_callback, data[0], NRE_depth(), - INT2PTR(-1), NULL); + INT2PTR(-1)); } else if (data[2] == INT2PTR(-1)) { TclNRAddCallback(interp, NREUnwind_callback, data[0], data[1], - NRE_depth(), NULL); + NRE_depth()); } else { Tcl_Obj *idata[3]; idata[0] = Tcl_NewIntObj((int) (data[1] - data[0])); @@ -6605,7 +6605,7 @@ TestNREUnwind( */ TclNRAddCallback(interp, NREUnwind_callback, INT2PTR(-1), INT2PTR(-1), - INT2PTR(-1), NULL); + INT2PTR(-1)); return TCL_OK; } -- cgit v0.12