summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorMiguel Sofer <miguel.sofer@gmail.com>2016-01-14 03:37:27 (GMT)
committerMiguel Sofer <miguel.sofer@gmail.com>2016-01-14 03:37:27 (GMT)
commite767324f47d4f598aec432dd1c03319c032bc886 (patch)
treea0679d34658211dd20b91bd833815598a7b14363 /generic
parentb6c01d2ebc11cbe13c4e3656235f1909103dcf53 (diff)
downloadtcl-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.c84
-rw-r--r--generic/tclCmdMZ.c14
-rw-r--r--generic/tclInt.h18
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 */