summaryrefslogtreecommitdiffstats
path: root/generic/tclCompCmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclCompCmds.c')
-rw-r--r--generic/tclCompCmds.c71
1 files changed, 52 insertions, 19 deletions
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c
index 041694f..3ab03cc 100644
--- a/generic/tclCompCmds.c
+++ b/generic/tclCompCmds.c
@@ -54,7 +54,7 @@ static int CompileDictEachCmd(Tcl_Interp *interp,
* The structures below define the AuxData types defined in this file.
*/
-const AuxDataType tclForeachInfoType = {
+static const AuxDataType foreachInfoType = {
"ForeachInfo", /* name */
DupForeachInfo, /* dupProc */
FreeForeachInfo, /* freeProc */
@@ -62,7 +62,7 @@ const AuxDataType tclForeachInfoType = {
DisassembleForeachInfo /* disassembleProc */
};
-const AuxDataType tclNewForeachInfoType = {
+static const AuxDataType newForeachInfoType = {
"NewForeachInfo", /* name */
DupForeachInfo, /* dupProc */
FreeForeachInfo, /* freeProc */
@@ -70,7 +70,7 @@ const AuxDataType tclNewForeachInfoType = {
DisassembleNewForeachInfo /* disassembleProc */
};
-const AuxDataType tclDictUpdateInfoType = {
+static const AuxDataType dictUpdateInfoType = {
"DictUpdateInfo", /* name */
DupDictUpdateInfo, /* dupProc */
FreeDictUpdateInfo, /* freeProc */
@@ -81,6 +81,39 @@ const AuxDataType tclDictUpdateInfoType = {
/*
*----------------------------------------------------------------------
*
+ * TclGetAuxDataType --
+ *
+ * This procedure looks up an Auxdata type by name.
+ *
+ * Results:
+ * If an AuxData type with name matching "typeName" is found, a pointer
+ * to its AuxDataType structure is returned; otherwise, NULL is returned.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+const AuxDataType *
+TclGetAuxDataType(
+ const char *typeName) /* Name of AuxData type to look up. */
+{
+ if (!strcmp(typeName, foreachInfoType.name)) {
+ return &foreachInfoType;
+ } else if (!strcmp(typeName, newForeachInfoType.name)) {
+ return &newForeachInfoType;
+ } else if (!strcmp(typeName, dictUpdateInfoType.name)) {
+ return &dictUpdateInfoType;
+ } else if (!strcmp(typeName, tclJumptableInfoType.name)) {
+ return &tclJumptableInfoType;
+ }
+ return NULL;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* TclCompileAppendCmd --
*
* Procedure called to compile the "append" command.
@@ -351,7 +384,7 @@ TclCompileArraySetCmd(
TclEmitInstInt4(INST_UPVAR, localIndex, envPtr);
TclEmitOpcode(INST_POP, envPtr);
}
-
+
/*
* Prepare for the internal foreach.
*/
@@ -365,7 +398,7 @@ TclCompileArraySetCmd(
infoPtr->varLists[0]->numVars = 2;
infoPtr->varLists[0]->varIndexes[0] = keyVar;
infoPtr->varLists[0]->varIndexes[1] = valVar;
- infoIndex = TclCreateAuxData(infoPtr, &tclForeachInfoType, envPtr);
+ infoIndex = TclCreateAuxData(infoPtr, &newForeachInfoType, envPtr);
/*
* Start issuing instructions to write to the array.
@@ -547,7 +580,7 @@ TclCompileCatchCmd(
int resultIndex, optsIndex, range, dropScript = 0;
DefineLineInformation; /* TIP #280 */
int depth = TclGetStackDepth(envPtr);
-
+
/*
* If syntax does not match what we expect for [catch], do not compile.
* Let runtime checks determine if syntax has changed.
@@ -626,7 +659,7 @@ TclCompileCatchCmd(
}
ExceptionRangeEnds(envPtr, range);
-
+
/*
* Emit the "no errors" epilogue: push "0" (TCL_OK) as the catch result,
* and jump around the "error case" code.
@@ -636,14 +669,14 @@ TclCompileCatchCmd(
PushStringLiteral(envPtr, "0");
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &jumpFixup);
- /*
+ /*
* Emit the "error case" epilogue. Push the interpreter result and the
* return code.
*/
ExceptionRangeTarget(envPtr, range, catchOffset);
TclSetStackDepth(depth + dropScript, envPtr);
-
+
if (dropScript) {
TclEmitOpcode( INST_POP, envPtr);
}
@@ -1669,7 +1702,7 @@ TclCompileDictUpdateCmd(
* can't be snagged by literal sharing and forced to shimmer dangerously.
*/
- infoIndex = TclCreateAuxData(duiPtr, &tclDictUpdateInfoType, envPtr);
+ infoIndex = TclCreateAuxData(duiPtr, &dictUpdateInfoType, envPtr);
for (i=0 ; i<numVars ; i++) {
CompileWord(envPtr, keyTokenPtrs[i], interp, 2*i+2);
@@ -2530,7 +2563,7 @@ CompileEachloopCmd(
ForeachInfo *infoPtr=NULL; /* Points to the structure describing this
* foreach command. Stored in a AuxData
* record in the ByteCode. */
-
+
Tcl_Token *tokenPtr, *bodyTokenPtr;
int jumpBackOffset, infoIndex, range;
int numWords, numLists, i, j, code = TCL_OK;
@@ -2632,16 +2665,16 @@ CompileEachloopCmd(
* We will compile the foreach command.
*/
- infoIndex = TclCreateAuxData(infoPtr, &tclNewForeachInfoType, envPtr);
+ infoIndex = TclCreateAuxData(infoPtr, &newForeachInfoType, envPtr);
/*
* Create the collecting object, unshared.
*/
-
+
if (collect == TCL_EACH_COLLECT) {
TclEmitInstInt4(INST_LIST, 0, envPtr);
}
-
+
/*
* Evaluate each value list and leave it on stack.
*/
@@ -2655,7 +2688,7 @@ CompileEachloopCmd(
}
TclEmitInstInt4(INST_FOREACH_START, infoIndex, envPtr);
-
+
/*
* Inline compile the loop body.
*/
@@ -2665,7 +2698,7 @@ CompileEachloopCmd(
ExceptionRangeStarts(envPtr, range);
BODY(bodyTokenPtr, numWords - 1);
ExceptionRangeEnds(envPtr, range);
-
+
if (collect == TCL_EACH_COLLECT) {
TclEmitOpcode(INST_LMAP_COLLECT, envPtr);
} else {
@@ -2674,7 +2707,7 @@ CompileEachloopCmd(
/*
* Bottom of loop code: assign each loop variable and check whether
- * to terminate the loop. Set the loop's break target.
+ * to terminate the loop. Set the loop's break target.
*/
ExceptionRangeTarget(envPtr, range, continueOffset);
@@ -2688,7 +2721,7 @@ CompileEachloopCmd(
* Set the jumpback distance from INST_FOREACH_STEP to the start of the
* body's code. Misuse loopCtTemp for storing the jump size.
*/
-
+
jumpBackOffset = envPtr->exceptArrayPtr[range].continueOffset -
envPtr->exceptArrayPtr[range].codeOffset;
infoPtr->loopCtTemp = -jumpBackOffset;
@@ -2701,7 +2734,7 @@ CompileEachloopCmd(
if (collect != TCL_EACH_COLLECT) {
PushStringLiteral(envPtr, "");
}
-
+
done:
if (code == TCL_ERROR) {
FreeForeachInfo(infoPtr);