summaryrefslogtreecommitdiffstats
path: root/generic/tclCompCmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclCompCmds.c')
-rw-r--r--generic/tclCompCmds.c63
1 files changed, 44 insertions, 19 deletions
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c
index 7046e54..bc9ef81 100644
--- a/generic/tclCompCmds.c
+++ b/generic/tclCompCmds.c
@@ -302,9 +302,17 @@ TclCompileArraySetCmd(
} else {
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_ARRAY_EXISTS_STK, envPtr);
- TclEmitInstInt1(INST_JUMP_TRUE1, 5, envPtr);
+ TclEmitInstInt1(INST_JUMP_TRUE1, 5
+#ifdef TCL_COMPILE_DEBUG
++10
+#endif
+, envPtr);
TclEmitOpcode( INST_ARRAY_MAKE_STK, envPtr);
- TclEmitInstInt1(INST_JUMP1, 3, envPtr);
+ TclEmitInstInt1(INST_JUMP1, 3
+#ifdef TCL_COMPILE_DEBUG
++10
+#endif
+, envPtr);
/* Each branch decrements stack depth, but we only take one. */
TclAdjustStackDepth(1, envPtr);
TclEmitOpcode( INST_POP, envPtr);
@@ -382,7 +390,11 @@ TclCompileArraySetCmd(
} else {
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_ARRAY_EXISTS_STK, envPtr);
- TclEmitInstInt1(INST_JUMP_TRUE1, 4, envPtr);
+ TclEmitInstInt1(INST_JUMP_TRUE1, 4
+#ifdef TCL_COMPILE_DEBUG
++15
+#endif
+, envPtr);
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_ARRAY_MAKE_STK, envPtr);
TclEmitInstInt4(INST_FOREACH_START4, infoIndex, envPtr);
@@ -442,9 +454,17 @@ TclCompileArrayUnsetCmd(
} else {
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_ARRAY_EXISTS_STK, envPtr);
- TclEmitInstInt1(INST_JUMP_FALSE1, 6, envPtr);
+ TclEmitInstInt1(INST_JUMP_FALSE1, 6
+#ifdef TCL_COMPILE_DEBUG
++10
+#endif
+, envPtr);
TclEmitInstInt1(INST_UNSET_STK, 1, envPtr);
- TclEmitInstInt1(INST_JUMP1, 3, envPtr);
+ TclEmitInstInt1(INST_JUMP1, 3
+#ifdef TCL_COMPILE_DEBUG
++10
+#endif
+, envPtr);
/* Each branch decrements stack depth, but we only take one. */
TclAdjustStackDepth(1, envPtr);
TclEmitOpcode( INST_POP, envPtr);
@@ -646,7 +666,11 @@ TclCompileCatchCmd(
TclEmitOpcode( INST_POP, envPtr);
PushStringLiteral(envPtr, "0");
- TclEmitInstInt1( INST_JUMP1, 3, envPtr);
+ TclEmitInstInt1( INST_JUMP1, 3
+#ifdef TCL_COMPILE_DEBUG
++5
+#endif
+, envPtr);
envPtr->currStackDepth = savedStackDepth;
ExceptionRangeTarget(envPtr, range, catchOffset);
TclEmitOpcode( INST_PUSH_RETURN_CODE, envPtr);
@@ -803,7 +827,14 @@ TclCompileContinueCmd(
*/
TclEmitOpcode(INST_CONTINUE, envPtr);
- PushStringLiteral(envPtr, ""); /* Evil hack! */
+#ifdef TCL_COMPILE_DEBUG
+ /*
+ * Instructions that raise exceptions don't really have to follow
+ * the usual stack management rules. But the checker wants them
+ * followed, so lie about stack usage to make it happy.
+ */
+ TclAdjustStackDepth(1, envPtr);
+#endif
return TCL_OK;
}
@@ -884,9 +915,8 @@ TclCompileDictSetCmd(
* Now emit the instruction to do the dict manipulation.
*/
- TclEmitInstInt4( INST_DICT_SET, numWords-2, envPtr);
+ TclEmitInstInt4( INST_DICT_SET, numWords-1, envPtr);
TclEmitInt4( dictVarIndex, envPtr);
- TclAdjustStackDepth(-1, envPtr);
return TCL_OK;
}
@@ -1003,8 +1033,7 @@ TclCompileDictGetCmd(
CompileWord(envPtr, tokenPtr, interp, i);
tokenPtr = TokenAfter(tokenPtr);
}
- TclEmitInstInt4(INST_DICT_GET, numWords-1, envPtr);
- TclAdjustStackDepth(-1, envPtr);
+ TclEmitInstInt4(INST_DICT_GET, numWords, envPtr);
return TCL_OK;
}
@@ -1040,8 +1069,7 @@ TclCompileDictExistsCmd(
CompileWord(envPtr, tokenPtr, interp, i);
tokenPtr = TokenAfter(tokenPtr);
}
- TclEmitInstInt4(INST_DICT_EXISTS, numWords-1, envPtr);
- TclAdjustStackDepth(-1, envPtr);
+ TclEmitInstInt4(INST_DICT_EXISTS, numWords, envPtr);
return TCL_OK;
}
@@ -1188,9 +1216,8 @@ TclCompileDictCreateCmd(
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, i+1);
tokenPtr = TokenAfter(tokenPtr);
- TclEmitInstInt4( INST_DICT_SET, 1, envPtr);
+ TclEmitInstInt4( INST_DICT_SET, 2, envPtr);
TclEmitInt4( worker, envPtr);
- TclAdjustStackDepth(-1, envPtr);
TclEmitOpcode( INST_POP, envPtr);
}
Emit14Inst( INST_LOAD_SCALAR, worker, envPtr);
@@ -1270,9 +1297,8 @@ TclCompileDictMergeCmd(
TclEmitInstInt4( INST_DICT_FIRST, infoIndex, envPtr);
TclEmitInstInt1( INST_JUMP_TRUE1, 24, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
- TclEmitInstInt4( INST_DICT_SET, 1, envPtr);
+ TclEmitInstInt4( INST_DICT_SET, 2, envPtr);
TclEmitInt4( workerIndex, envPtr);
- TclAdjustStackDepth(-1, envPtr);
TclEmitOpcode( INST_POP, envPtr);
TclEmitInstInt4( INST_DICT_NEXT, infoIndex, envPtr);
TclEmitInstInt1( INST_JUMP_FALSE1, -20, envPtr);
@@ -1499,9 +1525,8 @@ CompileDictEachCmd(
if (collect == TCL_EACH_COLLECT) {
Emit14Inst( INST_LOAD_SCALAR, keyVarIndex, envPtr);
TclEmitInstInt4(INST_OVER, 1, envPtr);
- TclEmitInstInt4(INST_DICT_SET, 1, envPtr);
+ TclEmitInstInt4(INST_DICT_SET, 2, envPtr);
TclEmitInt4( collectVar, envPtr);
- TclAdjustStackDepth(-1, envPtr);
TclEmitOpcode( INST_POP, envPtr);
}
TclEmitOpcode( INST_POP, envPtr);