summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authormig <mig>2013-01-07 02:54:12 (GMT)
committermig <mig>2013-01-07 02:54:12 (GMT)
commit1173ed18bf1993f83cbe65d6701ca0a767effc96 (patch)
tree9d4f6c06dfeb86a8300e8b8eef64f298a871ceb0 /generic
parentec92e0fe7aab90d9f617a9467fab055a64704538 (diff)
downloadtcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.zip
tcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.tar.gz
tcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.tar.bz2
reenable compiled tailcall
Diffstat (limited to 'generic')
-rw-r--r--generic/tclBasic.c6
-rw-r--r--generic/tclCompCmdsSZ.c4
-rw-r--r--generic/tclExecute.c14
3 files changed, 8 insertions, 16 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 52c2896..eed5d65 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -249,7 +249,7 @@ static const CmdInfo builtInCmds[] = {
{"split", Tcl_SplitObjCmd, NULL, NULL, 1},
{"subst", Tcl_SubstObjCmd, TclCompileSubstCmd, TclNRSubstObjCmd, 1},
{"switch", Tcl_SwitchObjCmd, TclCompileSwitchCmd, TclNRSwitchObjCmd, 1},
- {"tailcall", NULL, NULL, TclNRTailcallObjCmd, 1},
+ {"tailcall", NULL, TclCompileTailcallCmd, TclNRTailcallObjCmd, 1},
{"throw", Tcl_ThrowObjCmd, TclCompileThrowCmd, NULL, 1},
{"trace", Tcl_TraceObjCmd, NULL, NULL, 1},
{"try", Tcl_TryObjCmd, TclCompileTryCmd, TclNRTryObjCmd, 1},
@@ -8412,7 +8412,7 @@ TclNRTailcallObjCmd(
|| (nsPtr != ns1Ptr)) {
Tcl_Panic("Tailcall failed to find the proper namespace");
}
- Tcl_ListObjReplace(interp, listPtr, 0, 1, 1, &nsObjPtr);
+ TclListObjSetElement(interp, listPtr, 0, nsObjPtr);
iPtr->varFramePtr->tailcallPtr = listPtr;
}
@@ -8574,7 +8574,7 @@ TclNRYieldToObjCmd(
|| (nsPtr != ns1Ptr)) {
Tcl_Panic("yieldto failed to find the proper namespace");
}
- Tcl_ListObjReplace(interp, listPtr, 0, 1, 1, &nsObjPtr);
+ TclListObjSetElement(interp, listPtr, 0, nsObjPtr);
/*
diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c
index 1d04d8b..6e31481 100644
--- a/generic/tclCompCmdsSZ.c
+++ b/generic/tclCompCmdsSZ.c
@@ -1953,11 +1953,13 @@ TclCompileTailcallCmd(
return TCL_ERROR;
}
+ /* make room for the nsObjPtr */
+ CompileWord(envPtr, tokenPtr, interp, 0);
for (i=1 ; i<parsePtr->numWords ; i++) {
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, i);
}
- TclEmitInstInt1( INST_TAILCALL, parsePtr->numWords-1, envPtr);
+ TclEmitInstInt1( INST_TAILCALL, parsePtr->numWords, envPtr);
return TCL_OK;
}
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 9a49ef9..61ad12d 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -2399,7 +2399,6 @@ TEBCresume(
case INST_TAILCALL: {
Tcl_Obj *listPtr, *nsObjPtr;
- NRE_callback *tailcallPtr;
opnd = TclGetUInt1AtPtr(pc+1);
@@ -2433,17 +2432,8 @@ TEBCresume(
listPtr = Tcl_NewListObj(opnd, &OBJ_AT_DEPTH(opnd-1));
nsObjPtr = Tcl_NewStringObj(iPtr->varFramePtr->nsPtr->fullName, -1);
- Tcl_IncrRefCount(listPtr);
- Tcl_IncrRefCount(nsObjPtr);
-
- /*
- * Unstitch ourselves and do a [return].
- */
-
- TclNRAddCallback(interp, TclNRTailcallEval, listPtr, nsObjPtr,
- NULL, NULL);
- POP_CB(interp, tailcallPtr);
- iPtr->varFramePtr->tailcallPtr = tailcallPtr;
+ TclListObjSetElement(interp, listPtr, 0, nsObjPtr);
+ iPtr->varFramePtr->tailcallPtr = listPtr;
result = TCL_RETURN;
cleanup = opnd;