diff options
author | mig <mig> | 2013-01-07 02:54:12 (GMT) |
---|---|---|
committer | mig <mig> | 2013-01-07 02:54:12 (GMT) |
commit | 1173ed18bf1993f83cbe65d6701ca0a767effc96 (patch) | |
tree | 9d4f6c06dfeb86a8300e8b8eef64f298a871ceb0 /generic | |
parent | ec92e0fe7aab90d9f617a9467fab055a64704538 (diff) | |
download | tcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.zip tcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.tar.gz tcl-1173ed18bf1993f83cbe65d6701ca0a767effc96.tar.bz2 |
reenable compiled tailcall
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclBasic.c | 6 | ||||
-rw-r--r-- | generic/tclCompCmdsSZ.c | 4 | ||||
-rw-r--r-- | generic/tclExecute.c | 14 |
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; |