diff options
author | Miguel Sofer <miguel.sofer@gmail.com> | 2016-01-14 03:37:27 (GMT) |
---|---|---|
committer | Miguel Sofer <miguel.sofer@gmail.com> | 2016-01-14 03:37:27 (GMT) |
commit | e767324f47d4f598aec432dd1c03319c032bc886 (patch) | |
tree | a0679d34658211dd20b91bd833815598a7b14363 /generic | |
parent | b6c01d2ebc11cbe13c4e3656235f1909103dcf53 (diff) | |
download | tcl-e767324f47d4f598aec432dd1c03319c032bc886.zip tcl-e767324f47d4f598aec432dd1c03319c032bc886.tar.gz tcl-e767324f47d4f598aec432dd1c03319c032bc886.tar.bz2 |
remove callback in for/while, was required for tip 280
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclCmdAH.c | 84 | ||||
-rw-r--r-- | generic/tclCmdMZ.c | 14 | ||||
-rw-r--r-- | generic/tclInt.h | 18 |
3 files changed, 25 insertions, 91 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 27b3b69..f6d48f9 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -182,11 +182,6 @@ TclNRCatchObjCmd( TclNRAddCallback(interp, CatchObjCmdCallback, INT2PTR(objc), varNamePtr, optionVarNamePtr, NULL); - - /* - * TIP #280. Make invoking context available to caught script. - */ - return TclNREvalObjEx(interp, objv[1], 0); } @@ -629,10 +624,6 @@ TclNREvalObjCmd( } if (objc == 2) { - /* - * TIP #280. Make argument location available to eval'd script. - */ - objPtr = objv[1]; } else { /* @@ -2261,26 +2252,13 @@ TclNRForObjCmd( int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - ForIterData *iterPtr; - if (objc != 5) { Tcl_WrongNumArgs(interp, 1, objv, "start test next command"); return TCL_ERROR; } - TclSmallAllocEx(interp, sizeof(ForIterData), iterPtr); - iterPtr->cond = objv[2]; - iterPtr->body = objv[4]; - iterPtr->next = objv[3]; - iterPtr->msg = "\n (\"for\" body line %d)"; - iterPtr->word = 4; - - TclNRAddCallback(interp, ForSetupCallback, iterPtr, NULL, NULL, NULL); - - /* - * TIP #280. Make invoking context available to initial script. - */ - + TclNRAddCallback(interp, ForSetupCallback, /*cond*/ objv[2], + /*body*/ objv[4], /*next*/ objv[3], NULL); return TclNREvalObjEx(interp, objv[1], 0); } @@ -2290,16 +2268,14 @@ ForSetupCallback( Tcl_Interp *interp, int result) { - ForIterData *iterPtr = data[0]; - if (result != TCL_OK) { if (result == TCL_ERROR) { Tcl_AddErrorInfo(interp, "\n (\"for\" initial command)"); } - TclSmallFreeEx(interp, iterPtr); return result; } - TclNRAddCallback(interp, TclNRForIterCallback, iterPtr, NULL, NULL, NULL); + TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], data[2], + data[3]); return TCL_OK; } @@ -2309,7 +2285,6 @@ TclNRForIterCallback( Tcl_Interp *interp, int result) { - ForIterData *iterPtr = data[0]; Tcl_Obj *boolObj; switch (result) { @@ -2323,18 +2298,17 @@ TclNRForIterCallback( Tcl_ResetResult(interp); TclNewObj(boolObj); - TclNRAddCallback(interp, ForCondCallback, iterPtr, boolObj, NULL, - NULL); - return Tcl_NRExprObj(interp, iterPtr->cond, boolObj); + TclNRAddCallback(interp, ForCondCallback, data[0], data[1], data[2], + boolObj); + return Tcl_NRExprObj(interp, /*cond*/ data[0], boolObj); case TCL_BREAK: result = TCL_OK; Tcl_ResetResult(interp); break; case TCL_ERROR: - Tcl_AppendObjToErrorInfo(interp, - Tcl_ObjPrintf(iterPtr->msg, Tcl_GetErrorLine(interp))); + Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( + "\n (loop body line %d)", Tcl_GetErrorLine(interp))); } - TclSmallFreeEx(interp, iterPtr); return result; } @@ -2344,33 +2318,28 @@ ForCondCallback( Tcl_Interp *interp, int result) { - ForIterData *iterPtr = data[0]; - Tcl_Obj *boolObj = data[1]; + Tcl_Obj *boolObj = data[3]; int value; if (result != TCL_OK) { Tcl_DecrRefCount(boolObj); - TclSmallFreeEx(interp, iterPtr); return result; } else if (Tcl_GetBooleanFromObj(interp, boolObj, &value) != TCL_OK) { Tcl_DecrRefCount(boolObj); - TclSmallFreeEx(interp, iterPtr); return TCL_ERROR; } Tcl_DecrRefCount(boolObj); if (value) { - /* TIP #280. */ - if (iterPtr->next) { - TclNRAddCallback(interp, ForNextCallback, iterPtr, NULL, NULL, - NULL); + if (/*next*/ data[2]) { + TclNRAddCallback(interp, ForNextCallback, data[0], data[1], + data[2], NULL); } else { - TclNRAddCallback(interp, TclNRForIterCallback, iterPtr, NULL, - NULL, NULL); + TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], + data[2], NULL); } - return TclNREvalObjEx(interp, iterPtr->body, 0); + return TclNREvalObjEx(interp, /*body*/ data[1], 0); } - TclSmallFreeEx(interp, iterPtr); return result; } @@ -2380,21 +2349,16 @@ ForNextCallback( Tcl_Interp *interp, int result) { - ForIterData *iterPtr = data[0]; - Tcl_Obj *next = iterPtr->next; + Tcl_Obj *next = /*body*/ data[2]; if ((result == TCL_OK) || (result == TCL_CONTINUE)) { - TclNRAddCallback(interp, ForPostNextCallback, iterPtr, NULL, NULL, - NULL); - - /* - * TIP #280. Make invoking context available to next script. - */ - + TclNRAddCallback(interp, ForPostNextCallback, data[0], data[1], + data[2], NULL); return TclNREvalObjEx(interp, next, 0); } - TclNRAddCallback(interp, TclNRForIterCallback, iterPtr, NULL, NULL, NULL); + TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], + data[2], NULL); return result; } @@ -2404,16 +2368,14 @@ ForPostNextCallback( Tcl_Interp *interp, int result) { - ForIterData *iterPtr = data[0]; - if ((result != TCL_BREAK) && (result != TCL_OK)) { if (result == TCL_ERROR) { Tcl_AddErrorInfo(interp, "\n (\"for\" loop-end command)"); - TclSmallFreeEx(interp, iterPtr); } return result; } - TclNRAddCallback(interp, TclNRForIterCallback, iterPtr, NULL, NULL, NULL); + TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], + data[2], NULL); return result; } diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 9f5aff5..4655891 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -4704,8 +4704,6 @@ TclNRWhileObjCmd( int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - ForIterData *iterPtr; - if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "test command"); return TCL_ERROR; @@ -4714,16 +4712,8 @@ TclNRWhileObjCmd( /* * We reuse [for]'s callback, passing a NULL for the 'next' script. */ - - TclSmallAllocEx(interp, sizeof(ForIterData), iterPtr); - iterPtr->cond = objv[1]; - iterPtr->body = objv[2]; - iterPtr->next = NULL; - iterPtr->msg = "\n (\"while\" body line %d)"; - iterPtr->word = 2; - - TclNRAddCallback(interp, TclNRForIterCallback, iterPtr, NULL, - NULL, NULL); + TclNRAddCallback(interp, TclNRForIterCallback, /*cond*/ objv[1], + /*body*/ objv[2], /*next*/ NULL, NULL); return TCL_OK; } diff --git a/generic/tclInt.h b/generic/tclInt.h index 3c89465..46fb3a1 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -2505,24 +2505,6 @@ MODULE_SCOPE void TclPushTailcallPoint(Tcl_Interp *interp); MODULE_SCOPE void TclMarkTailcall(Tcl_Interp *interp); MODULE_SCOPE void TclSkipTailcall(Tcl_Interp *interp); -/* - * This structure holds the data for the various iteration callbacks used to - * NRE the 'for' and 'while' commands. We need a separate structure because we - * have more than the 4 client data entries we can provide directly thorugh - * the callback API. It is the 'word' information which puts us over the - * limit. It is needed because the loop body is argument 4 of 'for' and - * argument 2 of 'while'. Not providing the correct index confuses the #280 - * code. We TclSmallAlloc/Free this.//// - */ - -typedef struct ForIterData { - Tcl_Obj *cond; /* Loop condition expression. */ - Tcl_Obj *body; /* Loop body. */ - Tcl_Obj *next; /* Loop step script, NULL for 'while'. */ - const char *msg; /* Error message part. */ - int word; /* Index of the body script in the command */ -} ForIterData; - /* TIP #357 - Structure doing the bookkeeping of handles for Tcl_LoadFile * and Tcl_FindSymbol. This structure corresponds to an opaque * typedef in tcl.h */ |