Compare commits

...
1 Commits
Author SHA1 Message Date
mig 1c44a55411 stop looking at the C-stack depth 2013-08-23 18:30:22 +00:00
3 changed files with 13 additions and 10 deletions
+9 -8
View File
@@ -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;
/*
+1
View File
@@ -879,6 +879,7 @@ TclCreateExecEnv(
eePtr->interp = interp;
eePtr->callbackPtr = NULL;
eePtr->corPtr = NULL;
eePtr->stackLevel = 0;
eePtr->rewind = 0;
esPtr->prevPtr = NULL;
+3 -2
View File
@@ -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