From fb09b8a4da76d95a207b8229bdda56fad3c9c01e Mon Sep 17 00:00:00 2001 From: mig Date: Fri, 23 Aug 2013 18:30:22 +0000 Subject: stop looking at the C-stack depth --- generic/tclBasic.c | 17 +++++++++-------- generic/tclExecute.c | 1 + generic/tclInt.h | 5 +++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 96d74c4..e53fc57 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4282,6 +4282,7 @@ TclNRRunCallbacks( (void) Tcl_GetObjResult(interp); } + iPtr->execEnvPtr->stackLevel++; while (TOP_CB(interp) != rootPtr) { callbackPtr = TOP_CB(interp); procPtr = callbackPtr->procPtr; @@ -4289,6 +4290,7 @@ TclNRRunCallbacks( result = procPtr(callbackPtr->data, interp, result); TCLNR_FREE(interp, callbackPtr); } + iPtr->execEnvPtr->stackLevel--; return result; } @@ -8510,7 +8512,7 @@ NRCoroutineExitCallback( TclDeleteExecEnv(corPtr->eePtr); corPtr->eePtr = NULL; - corPtr->stackLevel = NULL; + corPtr->stackLevel = -1; /* * #280. @@ -8554,10 +8556,9 @@ TclNRCoroutineActivateCallback( { CoroutineData *corPtr = data[0]; int type = PTR2INT(data[1]); - int numLevels, unused; - int *stackLevel = &unused; + int numLevels; - if (!corPtr->stackLevel) { + if (COR_IS_SUSPENDED(corPtr)) { /* * -- Coroutine is suspended -- * Push the callback to restore the caller's context on yield or @@ -8572,7 +8573,7 @@ TclNRCoroutineActivateCallback( * the interp's environment to make it suitable to run this coroutine. */ - corPtr->stackLevel = stackLevel; + corPtr->stackLevel = corPtr->eePtr->stackLevel; numLevels = corPtr->auxNumLevels; corPtr->auxNumLevels = iPtr->numLevels; @@ -8586,7 +8587,7 @@ TclNRCoroutineActivateCallback( * Coroutine is active: yield */ - if (corPtr->stackLevel != stackLevel) { + if (corPtr->stackLevel != corPtr->eePtr->stackLevel) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "cannot yield: C stack busy", -1)); Tcl_SetErrorCode(interp, "TCL", "COROUTINE", "CANT_YIELD", @@ -8602,7 +8603,7 @@ TclNRCoroutineActivateCallback( Tcl_Panic("Yield received an option which is not implemented"); } - corPtr->stackLevel = NULL; + corPtr->stackLevel = -1; numLevels = iPtr->numLevels; iPtr->numLevels = corPtr->auxNumLevels; @@ -8846,7 +8847,7 @@ TclNRCoroutineObjCmd( corPtr->running.varFramePtr = iPtr->rootFramePtr; corPtr->running.cmdFramePtr = NULL; corPtr->running.lineLABCPtr = corPtr->lineLABCPtr; - corPtr->stackLevel = NULL; + corPtr->stackLevel = -1; corPtr->auxNumLevels = 0; /* diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 96004e2..81c9b37 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -879,6 +879,7 @@ TclCreateExecEnv( eePtr->interp = interp; eePtr->callbackPtr = NULL; eePtr->corPtr = NULL; + eePtr->stackLevel = 0; eePtr->rewind = 0; esPtr->prevPtr = NULL; diff --git a/generic/tclInt.h b/generic/tclInt.h index 6056119..1c1e600 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -1438,7 +1438,7 @@ typedef struct CoroutineData { CorContext caller; CorContext running; Tcl_HashTable *lineLABCPtr; /* See Interp.lineLABCPtr */ - void *stackLevel; + int stackLevel; int auxNumLevels; /* While the coroutine is running the * numLevels of the create/resume command is * stored here; for suspended coroutines it @@ -1456,11 +1456,12 @@ typedef struct ExecEnv { struct NRE_callback *callbackPtr; /* Top callback in NRE's stack. */ struct CoroutineData *corPtr; + int stackLevel; int rewind; } ExecEnv; #define COR_IS_SUSPENDED(corPtr) \ - ((corPtr)->stackLevel == NULL) + ((corPtr)->stackLevel == -1) /* * The definitions for the LiteralTable and LiteralEntry structures. Each -- cgit v0.12