summaryrefslogtreecommitdiffstats
path: root/generic/tclCompile.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclCompile.c')
-rw-r--r--generic/tclCompile.c48
1 files changed, 14 insertions, 34 deletions
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index 6ac5fb9..763e8f1 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -1887,10 +1887,7 @@ CompileCmdCompileProc(
Command *cmdPtr,
CompileEnv *envPtr)
{
- int savedNumCmds = envPtr->numCommands;
- int startStackDepth = envPtr->currStackDepth;
- int startCodeOffset = envPtr->codeNext - envPtr->codeStart;
- int incrOffset = -1;
+ int unwind = 0, incrOffset = -1;
DefineLineInformation;
/*
@@ -1908,6 +1905,7 @@ CompileCmdCompileProc(
switch (envPtr->atCmdStart) {
case 0:
+ unwind = tclInstructionTable[INST_START_CMD].numBytes;
TclEmitInstInt4(INST_START_CMD, 0, envPtr);
incrOffset = envPtr->codeNext - envPtr->codeStart;
TclEmitInt4(0, envPtr);
@@ -1922,25 +1920,7 @@ CompileCmdCompileProc(
;
}
- if (TCL_OK == cmdPtr->compileProc(interp, parsePtr, cmdPtr, envPtr)) {
-
-#ifdef TCL_COMPILE_DEBUG
- /*
- * Confirm that the command compiler generated a
- * single value on the stack as its result. This
- * is only done in debugging mode, as it *should*
- * be correct and normal users have no reasonable
- * way to fix it anyway.
- */
-
- int diff = envPtr->currStackDepth - startStackDepth;
-
- if (diff != 1) {
- Tcl_Panic("bad stack adjustment when compiling"
- " %.*s (was %d instead of 1)", parsePtr->tokenPtr->size,
- parsePtr->tokenPtr->start, diff);
- }
-#endif
+ if (TCL_OK == TclAttemptCompileProc(interp, parsePtr, 1, cmdPtr, envPtr)) {
if (incrOffset >= 0) {
/*
* We successfully compiled a command. Increment the number
@@ -1950,21 +1930,15 @@ CompileCmdCompileProc(
unsigned char *startPtr = incrPtr - 5;
TclIncrUInt4AtPtr(incrPtr, 1);
- TclStoreInt4AtPtr(envPtr->codeNext - startPtr, startPtr + 1);
+ if (unwind) {
+ /* We started the INST_START_CMD. Record the code length. */
+ TclStoreInt4AtPtr(envPtr->codeNext - startPtr, startPtr + 1);
+ }
}
return TCL_OK;
}
- /*
- * Restore numCommands, codeNext, and currStackDepth to their
- * correct values, removing any commands compiled before the
- * failure to produce bytecode got reported.
- * [Bugs 705406, 735055, 3614102]
- */
-
- envPtr->numCommands = savedNumCmds;
- envPtr->codeNext = envPtr->codeStart + startCodeOffset;
- envPtr->currStackDepth = startStackDepth;
+ envPtr->codeNext -= unwind; /* Unwind INST_START_CMD */
/*
* Throw out any line information generated by the failed
@@ -1976,6 +1950,12 @@ CompileCmdCompileProc(
mapPtr->loc[mapPtr->nuloc].line = NULL;
}
+ /*
+ * Reset the index of next command.
+ * Toss out any from failed nested partial compiles.
+ */
+ envPtr->numCommands = mapPtr->nuloc;
+
return TCL_ERROR;
}