summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiguel Sofer <miguel.sofer@gmail.com>2016-01-18 06:12:15 (GMT)
committerMiguel Sofer <miguel.sofer@gmail.com>2016-01-18 06:12:15 (GMT)
commitad1616e27816a418512271c07f7016f8b6bce72e (patch)
tree733bc473514c2b9923cce55886368a018e1d1052
parent09b8d0d108bdb52be039e5126b6dbea0fa1e0aca (diff)
downloadtcl-ad1616e27816a418512271c07f7016f8b6bce72e.zip
tcl-ad1616e27816a418512271c07f7016f8b6bce72e.tar.gz
tcl-ad1616e27816a418512271c07f7016f8b6bce72e.tar.bz2
introduce macros NRE_JUMP and NRE_NEXT to abstract the NRE mechanism, previous to introducing an alternative to the trampoline implementation; no functional change for now
-rw-r--r--generic/tclBasic.c45
-rw-r--r--generic/tclCmdAH.c27
-rw-r--r--generic/tclCmdIL.c2
-rw-r--r--generic/tclCmdMZ.c12
-rw-r--r--generic/tclDictObj.c12
-rw-r--r--generic/tclEnsemble.c2
-rw-r--r--generic/tclExecute.c17
-rw-r--r--generic/tclIOUtil.c2
-rw-r--r--generic/tclInterp.c2
-rw-r--r--generic/tclNRE.h7
-rw-r--r--generic/tclNamesp.c2
-rw-r--r--generic/tclOO.c8
-rw-r--r--generic/tclOOBasic.c12
-rw-r--r--generic/tclOOCall.c6
-rw-r--r--generic/tclOOMethod.c4
-rw-r--r--generic/tclProc.c6
16 files changed, 92 insertions, 74 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 6ef0618..cb14afd 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -124,7 +124,7 @@ static void MathFuncWrongNumArgs(Tcl_Interp *interp, int expected,
int actual, Tcl_Obj *const *objv);
static Tcl_NRPostProc NRCoroutineCallerCallback;
static Tcl_NRPostProc NRCoroutineExitCallback;
-static int NRRoot(ClientData data[], Tcl_Interp *interp, int result);
+static int NRRoot(ClientData data[], Tcl_Interp *interp, int result);
static Tcl_NRPostProc NRStackBottom;
static Tcl_ObjCmdProc OldMathFuncProc;
@@ -4102,6 +4102,8 @@ TclNREvalObjv(
iPtr->numLevels++;
+
+ /* Can't use NRE_JUMP, as this function does not have a callback signature */
TclNRAddCallback(interp, EvalObjvCore, cmdPtr, INT2PTR(flags),
INT2PTR(objc), objv);
return TCL_OK;
@@ -4318,7 +4320,10 @@ NRRoot(
Tcl_Interp *interp,
int result)
{
- /* NOT CALLED */
+ /* Reset itself so that NRRunCallbacks can detect it and stop (without
+ * running it again)*/
+
+ TclNRAddCallback(interp, NRRoot, NULL, NULL, NULL, NULL);
return result;
}
@@ -4355,7 +4360,7 @@ NRCommand(
result = Tcl_LimitCheck(interp);
}
- return result;
+ NRE_NEXT(result);
}
/*
@@ -4429,7 +4434,7 @@ TEOV_RestoreVarFrame(
int result)
{
((Interp *) interp)->varFramePtr = data[0];
- return result;
+ NRE_NEXT(result);
}
static int
@@ -4458,7 +4463,7 @@ TEOV_Exception(
*/
TclUnsetCancelFlags(iPtr);
- return result;
+ NRE_NEXT(result);
}
static int
@@ -4487,7 +4492,7 @@ TEOV_Error(
Tcl_DecrRefCount(listPtr);
}
iPtr->flags &= ~ERR_ALREADY_LOGGED;
- return result;
+ NRE_NEXT(result);
}
static int
@@ -4613,7 +4618,7 @@ TEOV_NotFoundCallback(
}
TclStackFree(interp, objv);
- return result;
+ NRE_NEXT(result);
}
static int
@@ -4714,7 +4719,7 @@ TEOV_RunLeaveTraces(
result = traceCode;
}
Tcl_DecrRefCount(commandPtr);
- return result;
+ NRE_NEXT(result);
}
static inline Command *
@@ -5394,7 +5399,7 @@ TEOEx_ByteCodeCallback(
}
TclDecrRefCount(objPtr);
- return result;
+ NRE_NEXT(result);
}
static int
@@ -5408,7 +5413,7 @@ TEOEx_ListCallback(
TclDecrRefCount(objPtr);
TclDecrRefCount(listPtr);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -5826,7 +5831,7 @@ NRPostInvoke(
{
Interp *iPtr = (Interp *)interp;
iPtr->numLevels--;
- return result;
+ NRE_NEXT(result);
}
/*
@@ -7229,7 +7234,7 @@ DTraceCmdReturn(
TCL_DTRACE_CMD_RESULT(cmdName, result, TclGetString(r), r);
}
- return result;
+ NRE_NEXT(result);
}
TCL_DTRACE_DEBUG_LOG()
@@ -7571,7 +7576,7 @@ TclNRTailcallEval(
*/
TailcallCleanup(data, interp, result);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -7581,6 +7586,7 @@ TclNRTailcallEval(
TclMarkTailcall(interp);
TclNRAddCallback(interp, TailcallCleanup, listPtr, NULL, NULL,NULL);
iPtr->lookupNsPtr = (Namespace *) nsPtr;
+
return TclNREvalObjv(interp, objc-1, objv+1, 0, NULL);
}
@@ -7591,7 +7597,7 @@ TailcallCleanup(
int result)
{
Tcl_DecrRefCount((Tcl_Obj *) data[0]);
- return result;
+ NRE_NEXT(result);
}
void
@@ -7792,7 +7798,7 @@ NRCoroutineCallerCallback(
return RewindCoroutine(corPtr, result);
}
- return result;
+ NRE_NEXT(result);
}
static int
@@ -7835,7 +7841,7 @@ NRCoroutineExitCallback(
iPtr->execEnvPtr = corPtr->callerEEPtr;
iPtr->numLevels++;
- return result;
+ NRE_NEXT(result);
}
/*
@@ -7900,7 +7906,7 @@ TclNRCoroutineActivateCallback(
"cannot yield: C stack busy", -1));
Tcl_SetErrorCode(interp, "TCL", "COROUTINE", "CANT_YIELD",
NULL);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
if (type == CORO_ACTIVATE_YIELD) {
@@ -7920,7 +7926,7 @@ TclNRCoroutineActivateCallback(
iPtr->execEnvPtr = corPtr->callerEEPtr;
}
- return TCL_OK;
+ NRE_NEXT(TCL_OK);
}
/*
@@ -8225,13 +8231,14 @@ NRStackBottom(
/* Go back to the previous stack */
eePtr->NRStack = prev;
eePtr->callbackPtr = &prev->items[NRE_STACK_SIZE-1];
+ NRE_NEXT(result);
} else {
/* If the stack is empty, free everything */
ckfree(this);
eePtr->NRStack = NULL;
TOP_CB(interp) = NULL;
+ return result;
}
- return result;
}
NRE_callback *
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c
index f6d48f9..6f02f3b 100644
--- a/generic/tclCmdAH.c
+++ b/generic/tclCmdAH.c
@@ -210,7 +210,7 @@ CatchObjCmdCallback(
if (objc >= 3) {
if (NULL == Tcl_ObjSetVar2(interp, varNamePtr, NULL,
Tcl_GetObjResult(interp), TCL_LEAVE_ERR_MSG)) {
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
}
if (objc == 4) {
@@ -596,7 +596,7 @@ EvalCmdErrMsg(
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
"\n (\"eval\" body line %d)", Tcl_GetErrorLine(interp)));
}
- return result;
+ NRE_NEXT(result);
}
int
@@ -759,7 +759,7 @@ ExprCallback(
Tcl_SetObjResult(interp, resultPtr);
}
Tcl_DecrRefCount(resultPtr);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -2272,11 +2272,10 @@ ForSetupCallback(
if (result == TCL_ERROR) {
Tcl_AddErrorInfo(interp, "\n (\"for\" initial command)");
}
- return result;
+ NRE_NEXT(result);
}
- TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1], data[2],
+ NRE_JUMP(interp, TclNRForIterCallback, data[0], data[1], data[2],
data[3]);
- return TCL_OK;
}
int
@@ -2309,7 +2308,7 @@ TclNRForIterCallback(
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
"\n (loop body line %d)", Tcl_GetErrorLine(interp)));
}
- return result;
+ NRE_NEXT(result);
}
static int
@@ -2323,10 +2322,10 @@ ForCondCallback(
if (result != TCL_OK) {
Tcl_DecrRefCount(boolObj);
- return result;
+ NRE_NEXT(result);
} else if (Tcl_GetBooleanFromObj(interp, boolObj, &value) != TCL_OK) {
Tcl_DecrRefCount(boolObj);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
Tcl_DecrRefCount(boolObj);
@@ -2340,7 +2339,7 @@ ForCondCallback(
}
return TclNREvalObjEx(interp, /*body*/ data[1], 0);
}
- return result;
+ NRE_NEXT(result);
}
static int
@@ -2359,7 +2358,7 @@ ForNextCallback(
TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1],
data[2], NULL);
- return result;
+ NRE_NEXT(result);
}
static int
@@ -2372,11 +2371,11 @@ ForPostNextCallback(
if (result == TCL_ERROR) {
Tcl_AddErrorInfo(interp, "\n (\"for\" loop-end command)");
}
- return result;
+ NRE_NEXT(result);
}
TclNRAddCallback(interp, TclNRForIterCallback, data[0], data[1],
data[2], NULL);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -2629,7 +2628,7 @@ ForeachLoopStep(
done:
ForeachCleanup(interp, statePtr);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index a726932..9cdbcf7 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -252,7 +252,7 @@ IfConditionCallback(
if (result != TCL_OK) {
TclDecrRefCount(boolObj);
- return result;
+ NRE_NEXT(result);
}
if (Tcl_GetBooleanFromObj(interp, boolObj, &value) != TCL_OK) {
TclDecrRefCount(boolObj);
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 4655891..ad138ab 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -3942,7 +3942,7 @@ SwitchPostProc(
(overflow ? limit : patternLength), pattern,
(overflow ? "..." : ""), Tcl_GetErrorLine(interp)));
}
- return result;
+ NRE_NEXT(result);
}
/*
@@ -4352,7 +4352,7 @@ TryPostBody(
if (handlersObj != NULL) {
Tcl_DecrRefCount(handlersObj);
}
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
/*
@@ -4523,7 +4523,7 @@ TryPostBody(
Tcl_DecrRefCount(options);
Tcl_SetObjResult(interp, resultObj);
Tcl_DecrRefCount(resultObj);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -4565,7 +4565,7 @@ TryPostHandler(
TclGetString(cmdObj), TclGetString(handlerKindObj),
Tcl_GetErrorLine(interp)));
Tcl_DecrRefCount(options);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
/*
@@ -4606,7 +4606,7 @@ TryPostHandler(
Tcl_DecrRefCount(options);
Tcl_SetObjResult(interp, resultObj);
Tcl_DecrRefCount(resultObj);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -4663,7 +4663,7 @@ TryPostFinal(
Tcl_SetObjResult(interp, resultObj);
Tcl_DecrRefCount(resultObj);
}
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c
index 4e44e82..4bba648 100644
--- a/generic/tclDictObj.c
+++ b/generic/tclDictObj.c
@@ -2522,7 +2522,7 @@ DictForLoopCallback(
TclDecrRefCount(scriptObj);
Tcl_DictObjDone(searchPtr);
TclStackFree(interp, searchPtr);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -2730,7 +2730,7 @@ DictMapLoopCallback(
TclDecrRefCount(storagePtr->accumulatorObj);
Tcl_DictObjDone(&storagePtr->search);
TclStackFree(interp, storagePtr);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -3234,7 +3234,7 @@ FinalizeDictUpdate(
if (dictPtr == NULL) {
TclDecrRefCount(varName);
TclDecrRefCount(argsObj);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -3246,7 +3246,7 @@ FinalizeDictUpdate(
Tcl_DiscardInterpState(state);
TclDecrRefCount(varName);
TclDecrRefCount(argsObj);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
if (Tcl_IsShared(dictPtr)) {
@@ -3285,7 +3285,7 @@ FinalizeDictUpdate(
TCL_LEAVE_ERR_MSG) == NULL) {
Tcl_DiscardInterpState(state);
TclDecrRefCount(varName);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
TclDecrRefCount(varName);
@@ -3411,7 +3411,7 @@ FinalizeDictWith(
}
if (result != TCL_OK) {
Tcl_DiscardInterpState(state);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
return Tcl_RestoreInterpState(interp, state);
}
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index 959ff71..89b7381 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -1971,7 +1971,7 @@ TclClearRootEnsemble(
int result)
{
TclResetRewriteEnsemble(interp, 1);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index eb66bce..7264fd6 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -1418,7 +1418,7 @@ CopyCallback(
} else {
Tcl_DecrRefCount(resultPtr);
}
- return result;
+ NRE_NEXT(result);
}
/*
@@ -1476,7 +1476,7 @@ ExprObjCallback(
} else {
Tcl_DiscardInterpState(state);
}
- return result;
+ NRE_NEXT(result);
}
/*
@@ -2386,9 +2386,14 @@ TEBCresume(
pc++;
cleanup = 1;
TEBC_YIELD();
+#if 0
TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr,
+ INT2PTR(yieldParameter), NULL, NULL);
+ return TCL_OK;
+#else
+ NRE_JUMP(interp, TclNRCoroutineActivateCallback, corPtr,
INT2PTR(yieldParameter), NULL, NULL);
- return TCL_OK;
+#endif
}
case INST_TAILCALL: {
@@ -7666,7 +7671,7 @@ TEBCresume(
TclDecrRefCount(srcPtr);
TclStackFree(interp, TD); /* free my stack */
- return result;
+ NRE_NEXT(result);
/*
@@ -7760,7 +7765,7 @@ FinalizeOONext(
contextPtr->index = PTR2INT(data[2]);
contextPtr->skip = PTR2INT(data[3]);
contextPtr->oPtr->flags &= ~FILTER_HANDLING;
- return result;
+ NRE_NEXT(result);
}
static int
@@ -7786,7 +7791,7 @@ FinalizeOONextFilter(
contextPtr->index = PTR2INT(data[2]);
contextPtr->skip = PTR2INT(data[3]);
contextPtr->oPtr->flags |= FILTER_HANDLING;
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c
index 0df7088..5336189 100644
--- a/generic/tclIOUtil.c
+++ b/generic/tclIOUtil.c
@@ -2006,7 +2006,7 @@ EvalFileCallback(
}
Tcl_DecrRefCount(objPtr);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index d27ed3f..96efa8c 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -3100,7 +3100,7 @@ NRPostInvokeHidden(
Tcl_TransferResult(slaveInterp, result, interp);
}
Tcl_Release(slaveInterp);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclNRE.h b/generic/tclNRE.h
index 1a72396..585b4c5 100644
--- a/generic/tclNRE.h
+++ b/generic/tclNRE.h
@@ -63,6 +63,13 @@ typedef struct NRE_stack {
#define NEXT_CB(ptr) TclNextCallback(ptr)
+#define NRE_NEXT(result) \
+ return (result)
+
+#define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \
+ TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \
+ NRE_NEXT(TCL_OK)
+
MODULE_SCOPE NRE_callback *TclNewCallback(Tcl_Interp *interp);
MODULE_SCOPE NRE_callback *TclPopCallback(Tcl_Interp *interp);
MODULE_SCOPE NRE_callback *TclNextCallback(NRE_callback *ptr);
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c
index 4a59d6e..b8c447e 100644
--- a/generic/tclNamesp.c
+++ b/generic/tclNamesp.c
@@ -3366,7 +3366,7 @@ NsEval_Callback(
*/
TclPopStackFrame(interp);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclOO.c b/generic/tclOO.c
index 5fca220..90de84b 100644
--- a/generic/tclOO.c
+++ b/generic/tclOO.c
@@ -1845,12 +1845,12 @@ FinalizeAlloc(
Tcl_DeleteCommandFromToken(interp, oPtr->command);
}
DelRef(oPtr);
- return TCL_ERROR;
+ NRE_NEXT(TCL_ERROR);
}
Tcl_RestoreInterpState(interp, state);
*objectPtr = (Tcl_Object) oPtr;
DelRef(oPtr);
- return TCL_OK;
+ NRE_NEXT(TCL_OK);
}
/*
@@ -2623,7 +2623,7 @@ FinalizeObjectCall(
*/
TclOODeleteContext(data[0]);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -2787,7 +2787,7 @@ FinalizeNext(
contextPtr->index = PTR2INT(data[1]);
contextPtr->skip = PTR2INT(data[2]);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c
index 6cf505a..8e04c19 100644
--- a/generic/tclOOBasic.c
+++ b/generic/tclOOBasic.c
@@ -59,10 +59,10 @@ FinalizeConstruction(
Object *oPtr = data[0];
if (result != TCL_OK) {
- return result;
+ NRE_NEXT(result);
}
Tcl_SetObjResult(interp, TclOOObjectName(interp, oPtr));
- return TCL_OK;
+ NRE_NEXT(TCL_OK);
}
/*
@@ -134,7 +134,7 @@ DecrRefsPostClassConstructor(
TclDecrRefCount(invoke[1]);
TclDecrRefCount(invoke[2]);
ckfree(invoke);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -376,7 +376,7 @@ AfterNRDestructor(
Tcl_DeleteCommandFromToken(interp, contextPtr->oPtr->command);
}
TclOODeleteContext(contextPtr);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -473,7 +473,7 @@ FinalizeEval(
*/
TclPopStackFrame(interp);
- return result;
+ NRE_NEXT(result);
}
/*
@@ -921,7 +921,7 @@ NextRestoreFrame(
if (contextPtr != NULL) {
contextPtr->index = PTR2INT(data[2]);
}
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c
index fa16a6e..1c91db6 100644
--- a/generic/tclOOCall.c
+++ b/generic/tclOOCall.c
@@ -319,7 +319,7 @@ SetFilterFlags(
CallContext *contextPtr = data[0];
contextPtr->oPtr->flags |= FILTER_HANDLING;
- return result;
+ NRE_NEXT(result);
}
static int
@@ -331,7 +331,7 @@ ResetFilterFlags(
CallContext *contextPtr = data[0];
contextPtr->oPtr->flags &= ~FILTER_HANDLING;
- return result;
+ NRE_NEXT(result);
}
static int
@@ -346,7 +346,7 @@ FinalizeMethodRefs(
for (i=0 ; i<contextPtr->callPtr->numChain ; i++) {
TclOODelMethodRef(contextPtr->callPtr->chain[i].mPtr);
}
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclOOMethod.c b/generic/tclOOMethod.c
index 83be0aa..f7fb180 100644
--- a/generic/tclOOMethod.c
+++ b/generic/tclOOMethod.c
@@ -645,7 +645,7 @@ FinalizePMCall(
DeleteProcedureMethodRecord(pmPtr);
}
TclStackFree(interp, fdPtr);
- return result;
+ NRE_NEXT(result);
}
static int
@@ -1288,7 +1288,7 @@ FinalizeForwardCall(
Tcl_Obj **argObjs = data[0];
TclStackFree(interp, argObjs);
- return result;
+ NRE_NEXT(result);
}
/*
diff --git a/generic/tclProc.c b/generic/tclProc.c
index ffde29d..277fbf0 100644
--- a/generic/tclProc.c
+++ b/generic/tclProc.c
@@ -830,7 +830,7 @@ Uplevel_Callback(
*/
((Interp *)interp)->varFramePtr = savedVarFramePtr;
- return result;
+ NRE_NEXT(result);
}
/* ARGSUSED */
@@ -1749,7 +1749,7 @@ InterpProcNR2(
TclStackFree(interp, freePtr->compiledLocals);
/* Free compiledLocals. */
TclStackFree(interp, freePtr); /* Free CallFrame. */
- return result;
+ NRE_NEXT(result);
/*
* Process any non-TCL_OK result code.
@@ -2502,7 +2502,7 @@ ApplyNR2(
}
TclStackFree(interp, extraPtr);
- return result;
+ NRE_NEXT(result);
}
/*