summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclBasic.c')
-rw-r--r--generic/tclBasic.c552
1 files changed, 271 insertions, 281 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 6d91c02..40c76b5 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -16,7 +16,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclBasic.c,v 1.355 2008/08/17 19:37:10 msofer Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.356 2008/08/20 15:31:06 dkf Exp $
*/
#include "tclInt.h"
@@ -506,8 +506,8 @@ Tcl_CreateInterp(void)
iPtr->cmdFramePtr = NULL;
iPtr->linePBodyPtr = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));
iPtr->lineBCPtr = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));
- iPtr->lineLAPtr = (Tcl_HashTable*) ckalloc(sizeof(Tcl_HashTable));
- iPtr->lineLABCPtr = (Tcl_HashTable*) ckalloc(sizeof(Tcl_HashTable));
+ iPtr->lineLAPtr = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));
+ iPtr->lineLABCPtr = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));
Tcl_InitHashTable(iPtr->linePBodyPtr, TCL_ONE_WORD_KEYS);
Tcl_InitHashTable(iPtr->lineBCPtr, TCL_ONE_WORD_KEYS);
Tcl_InitHashTable(iPtr->lineLAPtr, TCL_ONE_WORD_KEYS);
@@ -640,16 +640,16 @@ Tcl_CreateInterp(void)
statsPtr->numExecutions = 0;
statsPtr->numCompilations = 0;
statsPtr->numByteCodesFreed = 0;
- (void) memset(statsPtr->instructionCount, 0,
+ memset(statsPtr->instructionCount, 0,
sizeof(statsPtr->instructionCount));
statsPtr->totalSrcBytes = 0.0;
statsPtr->totalByteCodeBytes = 0.0;
statsPtr->currentSrcBytes = 0.0;
statsPtr->currentByteCodeBytes = 0.0;
- (void) memset(statsPtr->srcCount, 0, sizeof(statsPtr->srcCount));
- (void) memset(statsPtr->byteCodeCount, 0, sizeof(statsPtr->byteCodeCount));
- (void) memset(statsPtr->lifetimeCount, 0, sizeof(statsPtr->lifetimeCount));
+ memset(statsPtr->srcCount, 0, sizeof(statsPtr->srcCount));
+ memset(statsPtr->byteCodeCount, 0, sizeof(statsPtr->byteCodeCount));
+ memset(statsPtr->lifetimeCount, 0, sizeof(statsPtr->lifetimeCount));
statsPtr->currentInstBytes = 0.0;
statsPtr->currentLitBytes = 0.0;
@@ -660,7 +660,7 @@ Tcl_CreateInterp(void)
statsPtr->numLiteralsCreated = 0;
statsPtr->totalLitStringBytes = 0.0;
statsPtr->currentLitStringBytes = 0.0;
- (void) memset(statsPtr->literalCount, 0, sizeof(statsPtr->literalCount));
+ memset(statsPtr->literalCount, 0, sizeof(statsPtr->literalCount));
#endif /* TCL_COMPILE_STATS */
/*
@@ -696,7 +696,7 @@ Tcl_CreateInterp(void)
iPtr->pendingObjDataPtr = NULL;
iPtr->asyncReadyPtr = TclGetAsyncReadyPtr();
iPtr->atExitPtr = NULL;
-
+
/*
* Create the core commands. Do it here, rather than calling
* Tcl_CreateCommand, because it's faster (there's no need to check for a
@@ -828,7 +828,7 @@ Tcl_CreateInterp(void)
if (mathopNSPtr == NULL) {
Tcl_Panic("can't create math operator namespace");
}
- (void) Tcl_Export(interp, mathopNSPtr, "*", 1);
+ Tcl_Export(interp, mathopNSPtr, "*", 1);
strcpy(mathFuncName, "::tcl::mathop::");
for (opcmdInfoPtr=mathOpCmds ; opcmdInfoPtr->name!=NULL ; opcmdInfoPtr++){
TclOpCmdClientData *occdPtr = (TclOpCmdClientData *)
@@ -1049,7 +1049,7 @@ Tcl_DontCallWhenDeleted(
}
for (hPtr = Tcl_FirstHashEntry(hTablePtr, &hSearch); hPtr != NULL;
hPtr = Tcl_NextHashEntry(&hSearch)) {
- dPtr = (AssocData *) Tcl_GetHashValue(hPtr);
+ dPtr = Tcl_GetHashValue(hPtr);
if ((dPtr->proc == proc) && (dPtr->clientData == clientData)) {
ckfree((char *) dPtr);
Tcl_DeleteHashEntry(hPtr);
@@ -1298,7 +1298,6 @@ DeleteInterpProc(
Tcl_HashSearch search;
Tcl_HashTable *hTablePtr;
ResolverScheme *resPtr, *nextResPtr;
- CancelInfo *cancelInfo;
/*
* Punt if there is an error in the Tcl_Release/Tcl_Preserve matchup.
@@ -1334,15 +1333,13 @@ DeleteInterpProc(
Tcl_MutexLock(&cancelLock);
hPtr = Tcl_FindHashEntry(&cancelTable, (char *) iPtr);
if (hPtr != NULL) {
- cancelInfo = (CancelInfo *) Tcl_GetHashValue(hPtr);
+ CancelInfo *cancelInfo = Tcl_GetHashValue(hPtr);
if (cancelInfo != NULL) {
if (cancelInfo->result != NULL) {
ckfree((char *) cancelInfo->result);
- cancelInfo->result = NULL;
}
ckfree((char *) cancelInfo);
- cancelInfo = NULL;
}
Tcl_DeleteHashEntry(hPtr);
@@ -1395,8 +1392,7 @@ DeleteInterpProc(
hPtr = Tcl_FirstHashEntry(hTablePtr, &search);
for (; hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
- Tcl_DeleteCommandFromToken(interp,
- (Tcl_Command) Tcl_GetHashValue(hPtr));
+ Tcl_DeleteCommandFromToken(interp, Tcl_GetHashValue(hPtr));
}
Tcl_DeleteHashTable(hTablePtr);
ckfree((char *) hTablePtr);
@@ -1523,7 +1519,7 @@ DeleteInterpProc(
for (hPtr = Tcl_FirstHashEntry(iPtr->lineBCPtr, &hSearch);
hPtr != NULL;
hPtr = Tcl_NextHashEntry(&hSearch)) {
- ExtCmdLoc *eclPtr = (ExtCmdLoc *) Tcl_GetHashValue(hPtr);
+ ExtCmdLoc *eclPtr = Tcl_GetHashValue(hPtr);
if (eclPtr->type == TCL_LOCATION_SOURCE) {
Tcl_DecrRefCount(eclPtr->path);
@@ -1564,7 +1560,7 @@ DeleteInterpProc(
}
Tcl_DeleteHashTable(iPtr->lineLAPtr);
- ckfree((char*) iPtr->lineLAPtr);
+ ckfree((char *) iPtr->lineLAPtr);
iPtr->lineLAPtr = NULL;
if (iPtr->lineLABCPtr->numEntries) {
@@ -1577,7 +1573,7 @@ DeleteInterpProc(
}
Tcl_DeleteHashTable(iPtr->lineLABCPtr);
- ckfree((char*) iPtr->lineLABCPtr);
+ ckfree((char *) iPtr->lineLABCPtr);
iPtr->lineLABCPtr = NULL;
}
@@ -2002,7 +1998,7 @@ Tcl_CreateCommand(
* stuck in an infinite loop).
*/
- ckfree((char *) Tcl_GetHashValue(hPtr));
+ ckfree(Tcl_GetHashValue(hPtr));
}
} else {
/*
@@ -2260,7 +2256,7 @@ TclInvokeStringCommand(
{
Command *cmdPtr = clientData;
int i, result;
- const char **argv = (const char **)
+ const char **argv =
TclStackAlloc(interp, (unsigned)(objc + 1) * sizeof(char *));
for (i = 0; i < objc; i++) {
@@ -2274,7 +2270,7 @@ TclInvokeStringCommand(
result = (*cmdPtr->proc)(cmdPtr->clientData, interp, objc, argv);
- TclStackFree(interp, (void *) argv);
+ TclStackFree(interp, argv);
return result;
}
@@ -2306,10 +2302,10 @@ TclInvokeObjectCommand(
int argc, /* Number of arguments. */
register const char **argv) /* Argument strings. */
{
- Command *cmdPtr = (Command *) clientData;
+ Command *cmdPtr = clientData;
Tcl_Obj *objPtr;
int i, length, result;
- Tcl_Obj **objv = (Tcl_Obj **)
+ Tcl_Obj **objv =
TclStackAlloc(interp, (unsigned)(argc * sizeof(Tcl_Obj *)));
for (i = 0; i < argc; i++) {
@@ -3122,12 +3118,12 @@ CallCommandTraces(
}
static int
-CancelEvalProc(clientData, interp, code)
- ClientData clientData; /* Interp to cancel the script in progress. */
- Tcl_Interp *interp; /* Ignored */
- int code; /* Current return code from command. */
+CancelEvalProc(
+ ClientData clientData, /* Interp to cancel the script in progress. */
+ Tcl_Interp *interp, /* Ignored */
+ int code) /* Current return code from command. */
{
- CancelInfo *cancelInfo = (CancelInfo *) clientData;
+ CancelInfo *cancelInfo = clientData;
Interp *iPtr;
if (cancelInfo != NULL) {
@@ -3185,13 +3181,13 @@ CancelEvalProc(clientData, interp, code)
* command. This insures that traces get a correct NUL-terminated command
* string. The Tcl_Obj has refCount==1.
*
- * *** MAINTAINER WARNING ***
- * The returned Tcl_Obj is all wrong for any purpose but getting the
- * source string for an objc/objv command line in the stringRep (no
- * stringRep if no source is available) and the corresponding substituted
- * version in the List intrep.
- * This means that the intRep and stringRep DO NOT COINCIDE! Using these
- * Tcl_Objs normally is likely to break things.
+ * *** MAINTAINER WARNING ***
+ * The returned Tcl_Obj is all wrong for any purpose but getting the
+ * source string for an objc/objv command line in the stringRep (no
+ * stringRep if no source is available) and the corresponding substituted
+ * version in the List intrep.
+ * This means that the intRep and stringRep DO NOT COINCIDE! Using these
+ * Tcl_Objs normally is likely to break things.
*
*----------------------------------------------------------------------
*/
@@ -3370,7 +3366,6 @@ OldMathFuncProc(
args = (Tcl_Value *) ckalloc(dataPtr->numArgs * sizeof(Tcl_Value));
for (j = 1, k = 0; j < objc; ++j, ++k) {
-
/* TODO: Convert to TclGetNumberFromObj() ? */
valuePtr = objv[j];
result = Tcl_GetDoubleFromObj(NULL, valuePtr, &d);
@@ -3389,7 +3384,7 @@ OldMathFuncProc(
"argument to math function didn't have numeric value",
TCL_STATIC);
TclCheckBadOctal(interp, Tcl_GetString(valuePtr));
- ckfree((char *)args);
+ ckfree((char *) args);
return TCL_ERROR;
}
@@ -3421,7 +3416,7 @@ OldMathFuncProc(
break;
case TCL_INT:
if (ExprIntFunc(NULL, interp, 2, &(objv[j-1])) != TCL_OK) {
- ckfree((char *)args);
+ ckfree((char *) args);
return TCL_ERROR;
}
valuePtr = Tcl_GetObjResult(interp);
@@ -3430,7 +3425,7 @@ OldMathFuncProc(
break;
case TCL_WIDE_INT:
if (ExprWideFunc(NULL, interp, 2, &(objv[j-1])) != TCL_OK) {
- ckfree((char *)args);
+ ckfree((char *) args);
return TCL_ERROR;
}
valuePtr = Tcl_GetObjResult(interp);
@@ -3446,7 +3441,7 @@ OldMathFuncProc(
errno = 0;
result = (*dataPtr->proc)(dataPtr->clientData, interp, args, &funcResult);
- ckfree((char *)args);
+ ckfree((char *) args);
if (result != TCL_OK) {
return result;
}
@@ -3770,8 +3765,6 @@ Tcl_Canceled(
int flags)
{
register Interp *iPtr = (Interp *) interp;
- const char *id, *message = NULL;
- int length;
/*
* Traverse up the to the top-level interp, checking for the CANCELED flag
@@ -3781,7 +3774,7 @@ Tcl_Canceled(
* stop checking.
*/
- for (; iPtr!=NULL; iPtr = (Interp *) Tcl_GetMaster((Tcl_Interp *)iPtr)) {
+ for (; iPtr!=NULL; iPtr = (Interp *) Tcl_GetMaster((Tcl_Interp *) iPtr)) {
/*
* Has the current script in progress for this interpreter been
* canceled or is the stack being unwound due to the previous script
@@ -3815,6 +3808,9 @@ Tcl_Canceled(
*/
if (flags & TCL_LEAVE_ERR_MSG) {
+ const char *id, *message = NULL;
+ int length;
+
/*
* Setup errorCode variables so that we can differentiate
* between being canceled and unwound.
@@ -3972,7 +3968,7 @@ Tcl_CancelEval(
* TCL_ERROR. A result or error message is left in interp's result.
*
* Side effects:
- * Always pushes a callback. Other side effects depend on the command.
+ * Always pushes a callback. Other side effects depend on the command.
*
*----------------------------------------------------------------------
*/
@@ -3993,7 +3989,7 @@ Tcl_EvalObjv(
TEOV_callback *rootPtr = TOP_CB(interp);
result = TclNREvalObjv(interp, objc, objv, flags, NULL);
- return TclNRRunCallbacks(interp, result, rootPtr, 0);
+ return TclNRRunCallbacks(interp, result, rootPtr, 0);
}
int
@@ -4007,7 +4003,7 @@ TclNREvalObjv(
* evaluation of the script. Only
* TCL_EVAL_GLOBAL, TCL_EVAL_INVOKE and
* TCL_EVAL_NOERR are currently supported. */
- Command *cmdPtr) /* NULL if the Command is to be looked up
+ Command *cmdPtr) /* NULL if the Command is to be looked up
* here, otherwise the pointer to the
* requested Command struct to be invoked. */
{
@@ -4017,9 +4013,9 @@ TclNREvalObjv(
Tcl_ObjCmdProc *objProc;
ClientData objClientData;
Command **cmdPtrPtr;
-
+
iPtr->lookupNsPtr = NULL;
-
+
/*
* Push a callback with cleanup tasks for commands; the cmdPtr at data[0]
* will be filled later when the command is found: save its address at
@@ -4032,7 +4028,7 @@ TclNREvalObjv(
TclNRAddCallback(interp, NRCommand, NULL, NULL, NULL, NULL);
cmdPtrPtr = (Command **) &(TOP_CB(interp)->data[0]);
-
+
TclResetCancellation(interp, 0);
iPtr->numLevels++;
result = TclInterpReady(interp);
@@ -4081,7 +4077,7 @@ TclNREvalObjv(
cmdPtr = TEOV_LookupCmdFromObj(interp, objv[0], lookupNsPtr);
if (!cmdPtr) {
- notFound:
+ notFound:
result = TEOV_NotFound(interp, objc, objv, lookupNsPtr);
return result;
}
@@ -4144,7 +4140,7 @@ TclNREvalObjv(
*cmdPtrPtr = cmdPtr;
cmdPtr->refCount++;
-
+
/*
* Find the objProc to call: nreProc if available, objProc otherwise. Push
* a callback to do the actual running.
@@ -4165,12 +4161,12 @@ int
TclNRRunCallbacks(
Tcl_Interp *interp,
int result,
- struct TEOV_callback *rootPtr, /* All callbacks down to rootPtr not
- * inclusive are to be run */
- int tebcCall) /* Normal callers set this to 0; TEBC sets
- * it to 1 when executing a bytecode, to
- * 2 when cleaning up after a bytecode
- * returns. */
+ struct TEOV_callback *rootPtr,
+ /* All callbacks down to rootPtr not inclusive
+ * are to be run. */
+ int tebcCall) /* Normal callers set this to 0; TEBC sets it
+ * to 1 when executing a bytecode, to 2 when
+ * cleaning up after a bytecode returns. */
{
Interp *iPtr = (Interp *) interp;
TEOV_callback *callbackPtr;
@@ -4190,7 +4186,7 @@ TclNRRunCallbacks(
(void) Tcl_GetObjResult(interp);
}
- restart:
+ restart:
while (TOP_CB(interp) != rootPtr) {
callbackPtr = TOP_CB(interp);
@@ -4200,12 +4196,12 @@ TclNRRunCallbacks(
NRE_ASSERT(result==TCL_OK);
return TCL_OK;
}
-
+
/*
* IMPLEMENTATION REMARKS (FIXME)
*
- * Add here other direct handling possibilities for optimisation?
- * One could handle the very frequent NRCommand and NRRunObjProc right
+ * Add here other direct handling possibilities for optimisation? One
+ * could handle the very frequent NRCommand and NRRunObjProc right
* here to save an indirect function call and improve icache
* management. Would it? Test it, time it ...
*/
@@ -4237,12 +4233,11 @@ NRCommand(
Command *cmdPtr = data[0];
/* int cmdStart = PTR2INT(data[1]); NOT USED HERE */
-
if (cmdPtr) {
TclCleanupCommandMacro(cmdPtr);
}
((Interp *)interp)->numLevels--;
-
+
/* OPT ??
* Do not interrupt a series of cleanups with async or limit checks:
* just check at the end?
@@ -4259,7 +4254,7 @@ NRCommand(
}
return result;
}
-
+
static int
NRRunObjProc(
ClientData data[],
@@ -4295,23 +4290,25 @@ NRCallTEBC(
NRE_ASSERT(result == TCL_OK);
switch (type) {
- case TCL_NR_BC_TYPE:
- return TclExecuteByteCode(interp, data[1]);
- case TCL_NR_ATEXIT_TYPE:
- case TCL_NR_TAILCALL_TYPE:
- /* For atProcExit and tailcalls */
- Tcl_SetResult(interp,
- "atProcExit/tailcall can only be called from a proc or lambda", TCL_STATIC);
- return TCL_ERROR;
- case TCL_NR_YIELD_TYPE:
- if (iPtr->execEnvPtr->corPtr) {
- Tcl_SetResult(interp, "cannot yield: C stack busy", TCL_STATIC);
- } else {
- Tcl_SetResult(interp, "yield can only be called in a coroutine", TCL_STATIC);
- }
- return TCL_ERROR;
- default:
- Tcl_Panic("unknown call type to TEBC");
+ case TCL_NR_BC_TYPE:
+ return TclExecuteByteCode(interp, data[1]);
+ case TCL_NR_ATEXIT_TYPE:
+ case TCL_NR_TAILCALL_TYPE:
+ /* For atProcExit and tailcalls */
+ Tcl_SetResult(interp,
+ "atProcExit/tailcall can only be called from a proc or lambda",
+ TCL_STATIC);
+ return TCL_ERROR;
+ case TCL_NR_YIELD_TYPE:
+ if (iPtr->execEnvPtr->corPtr) {
+ Tcl_SetResult(interp, "cannot yield: C stack busy", TCL_STATIC);
+ } else {
+ Tcl_SetResult(interp, "yield can only be called in a coroutine",
+ TCL_STATIC);
+ }
+ return TCL_ERROR;
+ default:
+ Tcl_Panic("unknown call type to TEBC");
}
return result; /* not reached */
}
@@ -4485,8 +4482,7 @@ TEOV_NotFound(
Tcl_ListObjGetElements(NULL, currNsPtr->unknownHandlerPtr,
&handlerObjc, &handlerObjv);
newObjc = objc + handlerObjc;
- newObjv = (Tcl_Obj **) TclStackAlloc(interp,
- (int) sizeof(Tcl_Obj *) * newObjc);
+ newObjv = TclStackAlloc(interp, (int) sizeof(Tcl_Obj *) * newObjc);
/*
* Copy command prefix from unknown handler and add on the real command's
@@ -4928,7 +4924,7 @@ TclEvalEx(
* TIP #280. Track lines within the words of the current command.
*/
- int wordLine = line;
+ int wordLine = line;
const char *wordStart = parsePtr->commandStart;
/*
@@ -5018,7 +5014,7 @@ TclEvalEx(
int wordIdx = numWords;
int objIdx = objectsNeeded - 1;
- if ((numWords > minObjs) || (objectsNeeded > minObjs)) {
+ if ((numWords > minObjs) || (objectsNeeded > minObjs)) {
objv = objvSpace = (Tcl_Obj **)
ckalloc(objectsNeeded * sizeof(Tcl_Obj *));
lines = lineSpace = (int *)
@@ -5242,8 +5238,8 @@ TclAdvanceLines(
*
* TclArgumentEnter --
*
- * This procedure is a helper for the TIP #280 uplevel extension.
- * It enters location references for the arguments of a command to be
+ * This procedure is a helper for the TIP #280 uplevel extension. It
+ * enters location references for the arguments of a command to be
* invoked. Only the first entry has the actual data, further entries
* simply count the usage up.
*
@@ -5259,21 +5255,21 @@ TclAdvanceLines(
void
TclArgumentEnter(
- Tcl_Interp *interp,
- Tcl_Obj **objv,
- int objc,
- CmdFrame *cfPtr)
+ Tcl_Interp *interp,
+ Tcl_Obj **objv,
+ int objc,
+ CmdFrame *cfPtr)
{
- Interp *iPtr = (Interp*) interp;
+ Interp *iPtr = (Interp *) interp;
int new, i;
Tcl_HashEntry *hPtr;
CFWord *cfwPtr;
for (i = 1; i < objc; i++) {
/*
- * Ignore argument words without line information (= dynamic). If
- * they are variables they may have location information associated
- * with that, either through globally recorded 'set' invokations, or
+ * Ignore argument words without line information (= dynamic). If they
+ * are variables they may have location information associated with
+ * that, either through globally recorded 'set' invokations, or
* literals in bytecode. Eitehr way there is no need to record
* something here.
*/
@@ -5281,16 +5277,16 @@ TclArgumentEnter(
if (cfPtr->line[i] < 0) {
continue;
}
- hPtr = Tcl_CreateHashEntry(iPtr->lineLAPtr, (char*) objv[i], &new);
+ hPtr = Tcl_CreateHashEntry(iPtr->lineLAPtr, (char *) objv[i], &new);
if (new) {
/*
* The word is not on the stack yet, remember the current location
* and initialize references.
*/
- cfwPtr = (CFWord*) ckalloc(sizeof(CFWord));
+ cfwPtr = (CFWord *) ckalloc(sizeof(CFWord));
cfwPtr->framePtr = cfPtr;
- cfwPtr->word = i;
+ cfwPtr->word = i;
cfwPtr->refCount = 1;
Tcl_SetHashValue(hPtr, cfwPtr);
} else {
@@ -5299,7 +5295,7 @@ TclArgumentEnter(
* relevant. Just remember the reference to prevent early removal.
*/
- cfwPtr = (CFWord*) Tcl_GetHashValue(hPtr);
+ cfwPtr = Tcl_GetHashValue(hPtr);
cfwPtr->refCount++;
}
}
@@ -5327,29 +5323,29 @@ TclArgumentEnter(
void
TclArgumentRelease(
- Tcl_Interp *interp,
- Tcl_Obj **objv,
- int objc)
+ Tcl_Interp *interp,
+ Tcl_Obj **objv,
+ int objc)
{
- Interp *iPtr = (Interp*) interp;
- Tcl_HashEntry *hPtr;
- CFWord *cfwPtr;
+ Interp *iPtr = (Interp *) interp;
int i;
for (i = 1; i < objc; i++) {
- hPtr = Tcl_FindHashEntry(iPtr->lineLAPtr, (char *) objv[i]);
+ CFWord *cfwPtr;
+ Tcl_HashEntry *hPtr = Tcl_FindHashEntry(iPtr->lineLAPtr,
+ (char *) objv[i]);
if (!hPtr) {
continue;
}
- cfwPtr = (CFWord*) Tcl_GetHashValue(hPtr);
+ cfwPtr = (CFWord *) Tcl_GetHashValue(hPtr);
cfwPtr->refCount--;
if (cfwPtr->refCount > 0) {
continue;
}
- ckfree((char*) cfwPtr);
+ ckfree((char *) cfwPtr);
Tcl_DeleteHashEntry(hPtr);
}
}
@@ -5359,9 +5355,9 @@ TclArgumentRelease(
*
* TclArgumentBCEnter --
*
- * This procedure is a helper for the TIP #280 uplevel extension.
- * It enters location references for the literal arguments of commands
- * in bytecode about to be invoked. Only the first entry has the actual
+ * This procedure is a helper for the TIP #280 uplevel extension. It
+ * enters location references for the literal arguments of commands in
+ * bytecode about to be invoked. Only the first entry has the actual
* data, further entries simply count the usage up.
*
* Results:
@@ -5380,31 +5376,31 @@ TclArgumentBCEnter(
void *codePtr,
CmdFrame *cfPtr)
{
- Interp *iPtr = (Interp*) interp;
- Tcl_HashEntry *hePtr = Tcl_FindHashEntry(iPtr->lineBCPtr, (char*) codePtr);
+ Interp *iPtr = (Interp *) interp;
+ Tcl_HashEntry *hePtr = Tcl_FindHashEntry(iPtr->lineBCPtr,
+ (char *) codePtr);
if (hePtr) {
- ExtCmdLoc *eclPtr = (ExtCmdLoc*) Tcl_GetHashValue(hePtr);
+ ExtCmdLoc *eclPtr = Tcl_GetHashValue(hePtr);
int i;
for (i = 0; i < eclPtr->nueiloc; i++) {
-
ExtIndex *eiPtr = &eclPtr->eiloc[i];
Tcl_Obj *obj = eiPtr->obj;
int new;
Tcl_HashEntry *hPtr;
CFWordBC *cfwPtr;
- hPtr = Tcl_CreateHashEntry(iPtr->lineLABCPtr, (char*) obj, &new);
+ hPtr = Tcl_CreateHashEntry(iPtr->lineLABCPtr, (char *) obj, &new);
if (new) {
/*
* The word is not on the stack yet, remember the current
* location and initialize references.
*/
- cfwPtr = (CFWordBC*) ckalloc(sizeof(CFWordBC));
+ cfwPtr = (CFWordBC *) ckalloc(sizeof(CFWordBC));
cfwPtr->framePtr = cfPtr;
- cfwPtr->eiPtr = eiPtr;
+ cfwPtr->eiPtr = eiPtr;
cfwPtr->refCount = 1;
Tcl_SetHashValue(hPtr, cfwPtr);
} else {
@@ -5414,11 +5410,11 @@ TclArgumentBCEnter(
* removal.
*/
- cfwPtr = (CFWordBC*) Tcl_GetHashValue(hPtr);
- cfwPtr->refCount ++;
+ cfwPtr = Tcl_GetHashValue(hPtr);
+ cfwPtr->refCount++;
}
- } /* for */
- } /* if */
+ }
+ }
}
/*
@@ -5426,10 +5422,10 @@ TclArgumentBCEnter(
*
* TclArgumentBCRelease --
*
- * This procedure is a helper for the TIP #280 uplevel extension.
- * It removes the location references for the literal arguments of
- * commands in bytecode just done. Usage is counted down, the data
- * is removed only when no user is left over.
+ * This procedure is a helper for the TIP #280 uplevel extension. It
+ * removes the location references for the literal arguments of commands
+ * in bytecode just done. Usage is counted down, the data is removed only
+ * when no user is left over.
*
* Results:
* None.
@@ -5446,34 +5442,35 @@ TclArgumentBCRelease(
Tcl_Interp *interp,
void *codePtr)
{
- Interp *iPtr = (Interp*) interp;
- Tcl_HashEntry *hePtr = Tcl_FindHashEntry(iPtr->lineBCPtr, (char*) codePtr);
+ Interp *iPtr = (Interp *) interp;
+ Tcl_HashEntry *hePtr = Tcl_FindHashEntry(iPtr->lineBCPtr,
+ (char *) codePtr);
if (hePtr) {
- ExtCmdLoc *eclPtr = (ExtCmdLoc*) Tcl_GetHashValue(hePtr);
+ ExtCmdLoc *eclPtr = Tcl_GetHashValue(hePtr);
int i;
for (i = 0; i < eclPtr->nueiloc; i++) {
Tcl_Obj *obj = eclPtr->eiloc[i].obj;
Tcl_HashEntry *hPtr = Tcl_FindHashEntry(iPtr->lineLABCPtr,
- (char*) obj);
+ (char *) obj);
CFWordBC *cfwPtr;
if (!hPtr) {
continue;
}
- cfwPtr = (CFWordBC*) Tcl_GetHashValue(hPtr);
+ cfwPtr = Tcl_GetHashValue(hPtr);
cfwPtr->refCount--;
if (cfwPtr->refCount > 0) {
continue;
}
- ckfree((char*) cfwPtr);
+ ckfree((char *) cfwPtr);
Tcl_DeleteHashEntry(hPtr);
- } /* for */
- } /* if */
+ }
+ }
}
/*
@@ -5496,12 +5493,12 @@ TclArgumentBCRelease(
void
TclArgumentGet(
- Tcl_Interp *interp,
- Tcl_Obj *obj,
- CmdFrame **cfPtrPtr,
- int *wordPtr)
+ Tcl_Interp *interp,
+ Tcl_Obj *obj,
+ CmdFrame **cfPtrPtr,
+ int *wordPtr)
{
- Interp *iPtr = (Interp*) interp;
+ Interp *iPtr = (Interp *) interp;
Tcl_HashEntry *hPtr;
CmdFrame *framePtr;
@@ -5516,7 +5513,7 @@ TclArgumentGet(
((List *)obj->internalRep.twoPtrValue.ptr1)->canonicalFlag)) {
return;
}
-
+
/*
* First look for location information recorded in the argument
* stack. That is nearest.
@@ -5524,9 +5521,9 @@ TclArgumentGet(
hPtr = Tcl_FindHashEntry(iPtr->lineLAPtr, (char *) obj);
if (hPtr) {
- CFWord *cfwPtr = (CFWord*) Tcl_GetHashValue(hPtr);
+ CFWord *cfwPtr = Tcl_GetHashValue(hPtr);
- *wordPtr = cfwPtr->word;
+ *wordPtr = cfwPtr->word;
*cfPtrPtr = cfwPtr->framePtr;
return;
}
@@ -5538,14 +5535,14 @@ TclArgumentGet(
hPtr = Tcl_FindHashEntry(iPtr->lineLABCPtr, (char *) obj);
if (hPtr) {
- CFWordBC *cfwPtr = (CFWordBC*) Tcl_GetHashValue(hPtr);
+ CFWordBC *cfwPtr = Tcl_GetHashValue(hPtr);
ExtIndex *eiPtr = cfwPtr->eiPtr;
framePtr = cfwPtr->framePtr;
- framePtr->data.tebc.pc = (char*) (((ByteCode*)
+ framePtr->data.tebc.pc = (char *) (((ByteCode *)
framePtr->data.tebc.codePtr)->codeStart + eiPtr->pc);
*cfPtrPtr = cfwPtr->framePtr;
- *wordPtr = eiPtr->word;
+ *wordPtr = eiPtr->word;
return;
}
}
@@ -5677,7 +5674,7 @@ TclEvalObjEx(
TEOV_callback *rootPtr = TOP_CB(interp);
result = TclNREvalObjEx(interp, objPtr, flags, invoker, word);
- return TclNRRunCallbacks(interp, result, rootPtr, 0);
+ return TclNRRunCallbacks(interp, result, rootPtr, 0);
}
int
@@ -5709,21 +5706,21 @@ TclNREvalObjEx(
CmdFrame *eoFramePtr = NULL;
int objc;
Tcl_Obj **objv;
-
+
/*
* Pure List Optimization (no string representation). In this case, we
* can safely use Tcl_EvalObjv instead and get an appreciable
* improvement in execution speed. This is because it allows us to
* avoid a setFromAny step that would just pack everything into a
- * string and back out again.
+ * string and back out again.
*
* This also preserves any associations between list elements and
* location information for such elements.
*
* This restriction has been relaxed a bit by storing in lists whether
- * they are "canonical" or not (a canonical list being one that is either
- * pure or that has its string rep derived by UpdateStringOfList from
- * the internal rep).
+ * they are "canonical" or not (a canonical list being one that is
+ * either pure or that has its string rep derived by
+ * UpdateStringOfList from the internal rep).
*/
if (word != INT_MIN) {
@@ -5742,41 +5739,41 @@ TclNREvalObjEx(
* Note that we use (word==INTMIN) to signal that no command frame
* should be pushed, as needed by alias and ensemble redirections.
*/
-
- eoFramePtr = (CmdFrame *) TclStackAlloc(interp, sizeof(CmdFrame));
+
+ eoFramePtr = TclStackAlloc(interp, sizeof(CmdFrame));
eoFramePtr->nline = 0;
eoFramePtr->line = NULL;
-
+
eoFramePtr->type = TCL_LOCATION_EVAL_LIST;
eoFramePtr->level = (iPtr->cmdFramePtr == NULL?
1 : iPtr->cmdFramePtr->level + 1);
eoFramePtr->numLevels = iPtr->numLevels;
eoFramePtr->framePtr = iPtr->framePtr;
eoFramePtr->nextPtr = iPtr->cmdFramePtr;
-
- eoFramePtr->cmd.listPtr = objPtr;
+
+ eoFramePtr->cmd.listPtr = objPtr;
eoFramePtr->data.eval.path = NULL;
-
+
iPtr->cmdFramePtr = eoFramePtr;
}
-
+
/*
* Shimmer protection! Always pass an unshared obj. The caller could
* incr the refCount of objPtr AFTER calling us! To be completely safe
* we always make a copy. The callback takes care od the refCounts for
* both listPtr and objPtr.
*
- * FIXME OPT: preserve just the internal rep?
+ * FIXME OPT: preserve just the internal rep?
*/
-
+
Tcl_IncrRefCount(objPtr);
listPtr = TclListObjCopy(interp, objPtr);
Tcl_IncrRefCount(listPtr);
TclNRAddCallback(interp, TEOEx_ListCallback, objPtr, eoFramePtr,
listPtr, NULL);
-
+
ListObjGetElements(listPtr, objc, objv);
- return TclNREvalObjv(interp, objc, objv, flags, NULL);
+ return TclNREvalObjv(interp, objc, objv, flags, NULL);
}
if (!(flags & TCL_EVAL_DIRECT)) {
@@ -5806,7 +5803,7 @@ TclNREvalObjEx(
NULL, NULL);
return TCL_OK;
}
-
+
{
/*
* We're not supposed to use the compiler or byte-code
@@ -5824,55 +5821,53 @@ TclNREvalObjEx(
char *script;
int numSrcBytes;
-
+
Tcl_IncrRefCount(objPtr);
if (invoker == NULL) {
/*
* No context, force opening of our own.
*/
-
+
script = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
result = Tcl_EvalEx(interp, script, numSrcBytes, flags);
} else {
/*
* We have an invoker, describing the command asking for the
- * evaluation of a subordinate script. This script may originate in a
- * literal word, or from a variable, etc. Using the line array we now
- * check if we have good line information for the relevant word. The
- * type of context is relevant as well. In a non-'source' context we
- * don't have to try tracking lines.
+ * evaluation of a subordinate script. This script may originate
+ * in a literal word, or from a variable, etc. Using the line
+ * array we now check if we have good line information for the
+ * relevant word. The type of context is relevant as well. In a
+ * non-'source' context we don't have to try tracking lines.
*
- * First see if the word exists and is a literal. If not we go through
- * the easy dynamic branch. No need to perform more complex
- * invokations.
+ * First see if the word exists and is a literal. If not we go
+ * through the easy dynamic branch. No need to perform more
+ * complex invokations.
*/
int pc = 0;
- CmdFrame *ctxPtr = (CmdFrame *)
- TclStackAlloc(interp, sizeof(CmdFrame));
-
+ CmdFrame *ctxPtr = TclStackAlloc(interp, sizeof(CmdFrame));
+
*ctxPtr = *invoker;
if (invoker->type == TCL_LOCATION_BC) {
/*
* Note: Type BC => ctxPtr->data.eval.path is not used.
* ctxPtr->data.tebc.codePtr is used instead.
*/
-
+
TclGetSrcInfoForPc(ctxPtr);
pc = 1;
}
-
+
script = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
-
+
if ((invoker->nline <= word) ||
(invoker->line[word] < 0) ||
(ctxPtr->type != TCL_LOCATION_SOURCE)) {
/*
* Dynamic script, or dynamic context, force our own context.
*/
-
+
result = Tcl_EvalEx(interp, script, numSrcBytes, flags);
-
} else {
/*
* Absolute context to reuse.
@@ -5880,15 +5875,15 @@ TclNREvalObjEx(
iPtr->invokeCmdFramePtr = ctxPtr;
iPtr->evalFlags |= TCL_EVAL_CTX;
-
+
result = TclEvalEx(interp, script, numSrcBytes, flags,
ctxPtr->line[word]);
-
+
if (pc) {
/*
* Death of SrcInfo reference.
*/
-
+
Tcl_DecrRefCount(ctxPtr->data.eval.path);
}
}
@@ -6826,6 +6821,7 @@ ExprCeilFunc(
if (code != TCL_OK) {
return TCL_ERROR;
}
+
if (Tcl_GetBignumFromObj(NULL, objv[1], &big) == TCL_OK) {
Tcl_SetObjResult(interp, Tcl_NewDoubleObj(TclCeil(&big)));
mp_clear(&big);
@@ -6861,6 +6857,7 @@ ExprFloorFunc(
if (code != TCL_OK) {
return TCL_ERROR;
}
+
if (Tcl_GetBignumFromObj(NULL, objv[1], &big) == TCL_OK) {
Tcl_SetObjResult(interp, Tcl_NewDoubleObj(TclFloor(&big)));
mp_clear(&big);
@@ -6882,9 +6879,8 @@ ExprIsqrtFunc(
double d;
Tcl_WideInt w;
mp_int big;
- int exact = 0; /* Flag == 1 if the argument can be
- * represented in a double as an exact
- * integer. */
+ int exact = 0; /* Flag ==1 if the argument can be represented
+ * in a double as an exact integer. */
/*
* Check syntax.
@@ -6961,7 +6957,6 @@ ExprIsqrtFunc(
mp_clear(&big);
Tcl_SetObjResult(interp, Tcl_NewBignumObj(&root));
}
-
return TCL_OK;
negarg:
@@ -7750,7 +7745,7 @@ DTraceCmdReturn(
Tcl_Interp *interp,
int result)
{
- char *cmdName = TclGetString((Tcl_Obj *)data[0]);
+ char *cmdName = TclGetString((Tcl_Obj *) data[0]);
if (TCL_DTRACE_CMD_RETURN_ENABLED()) {
TCL_DTRACE_CMD_RETURN(cmdName, result);
@@ -7875,7 +7870,6 @@ Tcl_NRCreateCommand(
/* If not NULL, gives a function to call when
* this command is deleted. */
{
-
Command *cmdPtr = (Command *)
Tcl_CreateObjCommand(interp,cmdName,proc,clientData,deleteProc);
@@ -7911,7 +7905,6 @@ Tcl_NREvalObjv(
return TclNREvalObjv(interp, objc, objv, flags, NULL);
}
-
int
Tcl_NRCmdSwap(
Tcl_Interp *interp,
@@ -7920,7 +7913,7 @@ Tcl_NRCmdSwap(
Tcl_Obj *const objv[],
int flags)
{
- return TclNREvalObjv(interp, objc, objv, flags, (Command *)cmd);
+ return TclNREvalObjv(interp, objc, objv, flags, (Command *) cmd);
}
/*****************************************************************************
@@ -7931,18 +7924,18 @@ Tcl_NRCmdSwap(
* require more thought. Possibly need a new Tcl return code to do it right?
* Questions include:
* (1) How is the objc/objv tailcall to be run? My current thinking is that
- * it should essentially be
+ * it should essentially be
* [tailcall a b c] <=> [uplevel 1 [list a b c]]
* with two caveats
- * (a) the current frame is dropped first, after running all
- * pending cleanup tasks and saving its namespace
- * (b) 'a' is looked up in the returning frame's namespace, but the
- * command is run in the context to which we are returning
- * Current implementation does this if [tailcall] is called from within
- * a proc, errors otherwise.
+ * (a) the current frame is dropped first, after running all pending
+ * cleanup tasks and saving its namespace
+ * (b) 'a' is looked up in the returning frame's namespace, but the
+ * command is run in the context to which we are returning
+ * Current implementation does this if [tailcall] is called from within
+ * a proc, errors otherwise.
* (2) Should a tailcall bypass [catch] in the returning frame? Current
- * implementation does not (or does it? Changed, test!) - it causes an
- * error.
+ * implementation does not (or does it? Changed, test!) - it causes an
+ * error.
*
* FIXME NRE!
*/
@@ -7957,16 +7950,17 @@ TclNRAtProcExitObjCmd(
Interp *iPtr = (Interp *) interp;
Tcl_Obj *listPtr;
Namespace *nsPtr = iPtr->varFramePtr->nsPtr;
-
+
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "command ?arg ...?");
return TCL_ERROR;
}
- if (!iPtr->varFramePtr->isProcCallFrame || /* is not a body ... */
+ if (!iPtr->varFramePtr->isProcCallFrame || /* is not a body ... */
(iPtr->framePtr != iPtr->varFramePtr)) { /* or is upleveled */
Tcl_SetResult(interp,
- "atProcExit/tailcall can only be called from a proc or lambda", TCL_STATIC);
+ "atProcExit/tailcall can only be called from a proc or lambda",
+ TCL_STATIC);
return TCL_ERROR;
}
@@ -8041,14 +8035,13 @@ Tcl_NRAddCallback(
}
TclNRAddCallback(interp, postProcPtr, data0, data1, data2, data3);
}
-
/*
*----------------------------------------------------------------------
*
* TclNRCoroutineObjCmd -- (and friends)
*
- * This object-based function is invoked to process the "coroutine" Tcl
+ * This object-based function is invoked to process the "coroutine" Tcl
* command. It is heavily based on "apply".
*
* Results:
@@ -8065,27 +8058,25 @@ Tcl_NRAddCallback(
*----------------------------------------------------------------------
*/
-static int NRInterpCoroutine(ClientData clientData,
- Tcl_Interp *interp, int objc,
- Tcl_Obj *const objv[]);
-static int RewindCoroutine(CoroutineData *corPtr, int result);
-static void DeleteCoroutine(ClientData clientData);
-static void PlugCoroutineChains(CoroutineData *corPtr);
-
-static int NRCoroutineFirstCallback(ClientData data[],
- Tcl_Interp *interp, int result);
-static int NRCoroutineExitCallback(ClientData data[],
- Tcl_Interp *interp, int result);
-static int NRCoroutineCallerCallback(ClientData data[],
- Tcl_Interp *interp, int result);
-
+static int NRInterpCoroutine(ClientData clientData,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *const objv[]);
+static int RewindCoroutine(CoroutineData *corPtr, int result);
+static void DeleteCoroutine(ClientData clientData);
+static void PlugCoroutineChains(CoroutineData *corPtr);
+static int NRCoroutineFirstCallback(ClientData data[],
+ Tcl_Interp *interp, int result);
+static int NRCoroutineExitCallback(ClientData data[],
+ Tcl_Interp *interp, int result);
+static int NRCoroutineCallerCallback(ClientData data[],
+ Tcl_Interp *interp, int result);
static const CorContext NULL_CONTEXT = {NULL, NULL, NULL};
#define SAVE_CONTEXT(context) \
(context).framePtr = iPtr->framePtr; \
- (context).varFramePtr = iPtr->varFramePtr; \
+ (context).varFramePtr = iPtr->varFramePtr; \
(context).cmdFramePtr = iPtr->cmdFramePtr
#define RESTORE_CONTEXT(context) \
@@ -8108,10 +8099,11 @@ TclNRYieldObjCmd(
}
if (!iPtr->execEnvPtr->corPtr) {
- Tcl_SetResult(interp, "yield can only be called in a coroutine", TCL_STATIC);
+ Tcl_SetResult(interp, "yield can only be called in a coroutine",
+ TCL_STATIC);
return TCL_ERROR;
}
-
+
if (objc == 2) {
Tcl_SetObjResult(interp, objv[1]);
}
@@ -8129,7 +8121,7 @@ RewindCoroutine(
Tcl_Obj *objPtr;
Tcl_Interp *interp = corPtr->eePtr->interp;
Tcl_InterpState state = Tcl_SaveInterpState(interp, result);
-
+
NRE_ASSERT(COR_IS_SUSPENDED(corPtr));
NRE_ASSERT(corPtr->eePtr != NULL);
NRE_ASSERT(corPtr->eePtr->bottomPtr != NULL);
@@ -8139,7 +8131,7 @@ RewindCoroutine(
Tcl_IncrRefCount(objPtr);
corPtr->eePtr->rewind = 1;
- result = NRInterpCoroutine((ClientData) corPtr, interp, 1, &objPtr);
+ result = NRInterpCoroutine(corPtr, interp, 1, &objPtr);
NRE_ASSERT(iPtr->execEnvPtr == corPtr->eePtr);
@@ -8152,10 +8144,10 @@ static void
DeleteCoroutine(
ClientData clientData)
{
- CoroutineData *corPtr = (CoroutineData *) clientData;
-
+ register CoroutineData *corPtr = clientData;
+
if (COR_IS_SUSPENDED(corPtr)) {
- (void) RewindCoroutine(corPtr, TCL_OK);
+ RewindCoroutine(corPtr, TCL_OK);
}
}
@@ -8164,6 +8156,7 @@ PlugCoroutineChains(
CoroutineData *corPtr)
{
Tcl_Interp *interp = corPtr->eePtr->interp;
+
/*
* Called to plug the coroutine's running environment into the caller's,
* so that the frame chains are uninterrupted. Note that the levels and
@@ -8176,7 +8169,7 @@ PlugCoroutineChains(
corPtr->base.framePtr->callerPtr = corPtr->caller.framePtr;
corPtr->base.framePtr->callerVarPtr = corPtr->caller.varFramePtr;
-
+
corPtr->base.cmdFramePtr->nextPtr = corPtr->caller.cmdFramePtr;
corPtr->base.cmdFramePtr->level = (iPtr->cmdFramePtr == NULL?
1 : iPtr->cmdFramePtr->level + 1);
@@ -8190,18 +8183,15 @@ NRCoroutineFirstCallback(
int result)
{
CoroutineData *corPtr = data[0];
+ register CmdFrame *tmpPtr = iPtr->cmdFramePtr;
- {
- CmdFrame *tmpPtr = iPtr->cmdFramePtr;
-
- if (corPtr->eePtr) {
- while (tmpPtr->nextPtr != corPtr->caller.cmdFramePtr) {
- tmpPtr = tmpPtr->nextPtr;
- }
- corPtr->base.cmdFramePtr = tmpPtr;
+ if (corPtr->eePtr) {
+ while (tmpPtr->nextPtr != corPtr->caller.cmdFramePtr) {
+ tmpPtr = tmpPtr->nextPtr;
}
+ corPtr->base.cmdFramePtr = tmpPtr;
}
-
+
return result;
}
@@ -8218,36 +8208,36 @@ NRCoroutineCallerCallback(
* This is the last callback in the caller execEnv, right before switching
* to the coroutine's
*/
-
+
NRE_ASSERT(iPtr->execEnvPtr == corPtr->callerEEPtr);
-
+
if (!corPtr->eePtr) {
/*
* The execEnv was wound down but not deleted for our sake. We finish
* the job here. The caller context has already been restored.
*/
-
+
NRE_ASSERT(iPtr->varFramePtr == corPtr->caller.varFramePtr);
NRE_ASSERT(iPtr->framePtr == corPtr->caller.framePtr);
NRE_ASSERT(iPtr->cmdFramePtr == corPtr->caller.cmdFramePtr);
ckfree((char *) corPtr);
return result;
}
-
+
NRE_ASSERT(COR_IS_SUSPENDED(corPtr));
SAVE_CONTEXT(corPtr->running);
RESTORE_CONTEXT(corPtr->caller);
-
+
if (cmdPtr->flags & CMD_IS_DELETED) {
/*
* The command was deleted while it was running: wind down the execEnv,
* this will do the complete cleanup. RewindCoroutine will restore both
* the caller's context and interp state.
*/
-
+
return RewindCoroutine(corPtr, result);
}
-
+
return result;
}
@@ -8259,13 +8249,13 @@ NRCoroutineExitCallback(
{
CoroutineData *corPtr = data[0];
Command *cmdPtr = corPtr->cmdPtr;
-
+
/*
* This runs at the bottom of the Coroutine's execEnv: it will be executed
* when the coroutine returns or is wound down, but not when it yields. It
* deletes the coroutine and restores the caller's environment.
*/
-
+
NRE_ASSERT(interp == corPtr->eePtr->interp);
NRE_ASSERT(TOP_CB(interp) == NULL);
NRE_ASSERT(iPtr->execEnvPtr == corPtr->eePtr);
@@ -8277,7 +8267,7 @@ NRCoroutineExitCallback(
NRE_ASSERT(iPtr->framePtr->compiledLocals == NULL);
TclPopStackFrame(interp);
-
+
cmdPtr->deleteProc = NULL;
Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr);
TclCleanupCommandMacro(cmdPtr);
@@ -8293,7 +8283,7 @@ NRCoroutineExitCallback(
iPtr->varFramePtr = corPtr->caller.varFramePtr;
iPtr->execEnvPtr = corPtr->callerEEPtr;
-
+
return result;
}
@@ -8304,8 +8294,8 @@ NRInterpCoroutine(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- CoroutineData *corPtr = (CoroutineData *) clientData;
-
+ CoroutineData *corPtr = clientData;
+
if ((objc != 1) && (objc != 2)) {
Tcl_WrongNumArgs(interp, 1, objv, "?arg?");
return TCL_ERROR;
@@ -8317,23 +8307,23 @@ NRInterpCoroutine(
"\" is already running", NULL);
return TCL_ERROR;
}
-
-
+
/*
* Swap the interp's environment to make it suitable to run this coroutine.
* TEBC needs no info to resume executing after a suspension: the codePtr
- * will be read from the execEnv's saved bottomPtr.
+ * will be read from the execEnv's saved bottomPtr.
*/
-
+
if (objc == 2) {
Tcl_SetObjResult(interp, objv[1]);
}
-
+
SAVE_CONTEXT(corPtr->caller);
RESTORE_CONTEXT(corPtr->running);
PlugCoroutineChains(corPtr);
-
- TclNRAddCallback(interp, NRCoroutineCallerCallback, corPtr, NULL, NULL, NULL);
+
+ TclNRAddCallback(interp, NRCoroutineCallerCallback, corPtr, NULL, NULL,
+ NULL);
iPtr->execEnvPtr = corPtr->eePtr;
return TclExecuteByteCode(interp, NULL);
@@ -8356,7 +8346,6 @@ TclNRCoroutineObjCmd(
Namespace *nsPtr, *altNsPtr, *cxtNsPtr;
Tcl_DString ds;
-
if (objc < 3) {
Tcl_WrongNumArgs(interp, 1, objv, "name cmd ?arg ...?");
return TCL_ERROR;
@@ -8401,12 +8390,11 @@ TclNRCoroutineObjCmd(
Tcl_DStringAppend(&ds, "::", 2);
}
Tcl_DStringAppend(&ds, procName, -1);
-
+
cmdPtr = (Command *) Tcl_NRCreateCommand(interp, Tcl_DStringValue(&ds),
- /*objProc*/ NULL, NRInterpCoroutine, (ClientData) corPtr,
- DeleteCoroutine);
+ /*objProc*/ NULL, NRInterpCoroutine, corPtr, DeleteCoroutine);
Tcl_DStringFree(&ds);
-
+
corPtr->cmdPtr = cmdPtr;
cmdPtr->refCount++;
@@ -8414,28 +8402,30 @@ TclNRCoroutineObjCmd(
* Be sure not to pass a canonical list for the command so that we insure
* the body is bytecompiled: we need a TEBC instance to handle [yield]
*/
-
+
cmdObjPtr = Tcl_NewListObj(objc-2, &objv[2]);
TclGetString(cmdObjPtr);
TclFreeIntRep(cmdObjPtr);
cmdObjPtr->typePtr = NULL;
Tcl_IncrRefCount(cmdObjPtr);
-
+
/*
- * Set up the callback in caller execEnv and switch to the new
- * execEnv. Switch now so that the CallFrame is allocated on the new
- * execEnv's stack. Then push a CallFrame and CmdFrame.
+ * Set up the callback in caller execEnv and switch to the new execEnv.
+ * Switch now so that the CallFrame is allocated on the new execEnv's
+ * stack. Then push a CallFrame and CmdFrame.
*/
-
- TclNRAddCallback(interp, NRCoroutineCallerCallback, corPtr, NULL, NULL, NULL);
- TclNRAddCallback(interp, NRCoroutineFirstCallback, corPtr, NULL, NULL, NULL);
+
+ TclNRAddCallback(interp, NRCoroutineCallerCallback, corPtr, NULL, NULL,
+ NULL);
+ TclNRAddCallback(interp, NRCoroutineFirstCallback, corPtr, NULL, NULL,
+ NULL);
SAVE_CONTEXT(corPtr->caller);
iPtr->execEnvPtr = corPtr->eePtr;
framePtrPtr = &framePtr;
if (TCL_OK != TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr,
- NULL, 0)) {
+ NULL, 0)) {
corPtr->eePtr->corPtr = NULL;
TclDeleteExecEnv(corPtr->eePtr);
ckfree((char *) corPtr);
@@ -8443,10 +8433,10 @@ TclNRCoroutineObjCmd(
}
framePtr->objc = objc-2;
framePtr->objv = &objv[2];
-
+
SAVE_CONTEXT(corPtr->base);
corPtr->running = NULL_CONTEXT;
-
+
/*
* Eval things in 'uplevel #0', except for the very first command lookup
* which should be looked up in caller's context.
@@ -8455,14 +8445,14 @@ TclNRCoroutineObjCmd(
* clumsy for now: we have the "lambda is a nameless proc" hack, we'd need
* the cleaner "proc is a named lambda" to do this properly.
*/
-
- iPtr->varFramePtr = iPtr->rootFramePtr;
+
+ iPtr->varFramePtr = iPtr->rootFramePtr;
iPtr->lookupNsPtr = iPtr->framePtr->nsPtr;
- TclNRAddCallback(interp, NRCoroutineExitCallback, corPtr, NULL, NULL, NULL);
- return TclNRRunCallbacks(interp, TclNREvalObjEx(interp, cmdObjPtr, 0, NULL, 0), rootPtr, 0);
+ TclNRAddCallback(interp, NRCoroutineExitCallback, corPtr, NULL,NULL,NULL);
+ return TclNRRunCallbacks(interp,
+ TclNREvalObjEx(interp, cmdObjPtr, 0, NULL, 0), rootPtr, 0);
}
-
/*
* Local Variables: