summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormig <mig>2013-08-23 18:30:22 (GMT)
committermig <mig>2013-08-23 18:30:22 (GMT)
commitfb09b8a4da76d95a207b8229bdda56fad3c9c01e (patch)
tree301c1e4cea083599e34cff4f40e141e9d63b7ae7
parent0ae283a82593a1994e6ed6e5c7577603fa7f72bb (diff)
downloadtcl-fb09b8a4da76d95a207b8229bdda56fad3c9c01e.zip
tcl-fb09b8a4da76d95a207b8229bdda56fad3c9c01e.tar.gz
tcl-fb09b8a4da76d95a207b8229bdda56fad3c9c01e.tar.bz2
stop looking at the C-stack depthmig_stacklevels
-rw-r--r--generic/tclBasic.c17
-rw-r--r--generic/tclExecute.c1
-rw-r--r--generic/tclInt.h5
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