diff options
author | mig <mig> | 2012-10-28 18:58:20 (GMT) |
---|---|---|
committer | mig <mig> | 2012-10-28 18:58:20 (GMT) |
commit | f7bae6ac6002df7f2c3a1636ec63c58c9d2fc61f (patch) | |
tree | cdebe2766e1d01cc901fca814411f1d7b63d3416 /generic | |
parent | 41128611bfaf31dda3432dbc81222ad68ae6f485 (diff) | |
download | tcl-f7bae6ac6002df7f2c3a1636ec63c58c9d2fc61f.zip tcl-f7bae6ac6002df7f2c3a1636ec63c58c9d2fc61f.tar.gz tcl-f7bae6ac6002df7f2c3a1636ec63c58c9d2fc61f.tar.bz2 |
fix INST_YIELD so that it works
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclExecute.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 30f8d77..b42e4ab 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -2345,17 +2345,33 @@ TEBCresume( goto gotError; } - Tcl_SetObjResult(interp, OBJ_AT_TOS); - TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, - INT2PTR(0), NULL, NULL); - #ifdef TCL_COMPILE_DEBUG TRACE_WITH_OBJ(("yield, result="), iPtr->objResultPtr); if (traceInstructions) { fprintf(stdout, "\n"); } #endif - goto checkForCatch; + /* TIP #280: Record the last piece of info needed by + * 'TclGetSrcInfoForPc', and push the frame. + */ + + bcFramePtr->data.tebc.pc = (char *) pc; + iPtr->cmdFramePtr = bcFramePtr; + + if (iPtr->flags & INTERP_DEBUG_FRAME) { + TclArgumentBCEnter((Tcl_Interp *) iPtr, objv, objc, + codePtr, bcFramePtr, pc - codePtr->codeStart); + } + + pc++; + cleanup = 1; + TEBC_YIELD(); + + Tcl_SetObjResult(interp, OBJ_AT_TOS); + TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, + INT2PTR(0), NULL, NULL); + + return TCL_OK; } case INST_DONE: |