diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2012-12-19 11:42:46 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2012-12-19 11:42:46 (GMT) |
commit | d9823d1d2b4d2f7e653dbd27b3ce38b470cf7b42 (patch) | |
tree | 708322eb43a1d2e6430c6e9112ccbb9fc850838c /generic/tclCompCmdsSZ.c | |
parent | 0d9c3c6fea70ee5c02ec0c52388a1914bca1ff4c (diff) | |
parent | ee58f2d325a281f03cf6669e8d7ae2c377a5af2d (diff) | |
download | tcl-d9823d1d2b4d2f7e653dbd27b3ce38b470cf7b42.zip tcl-d9823d1d2b4d2f7e653dbd27b3ce38b470cf7b42.tar.gz tcl-d9823d1d2b4d2f7e653dbd27b3ce38b470cf7b42.tar.bz2 |
merge main dev branch
Diffstat (limited to 'generic/tclCompCmdsSZ.c')
-rw-r--r-- | generic/tclCompCmdsSZ.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c index 060e14a..990f8e1 100644 --- a/generic/tclCompCmdsSZ.c +++ b/generic/tclCompCmdsSZ.c @@ -1007,6 +1007,34 @@ TclSubstCompile( TclEmitPush(literal, envPtr); count++; continue; + case TCL_TOKEN_VARIABLE: + /* + * Check for simple variable access; see if we can only generate + * TCL_OK or TCL_ERROR from the substituted variable read; if so, + * there is no need to generate elaborate exception-management + * code. Note that the first component of TCL_TOKEN_VARIABLE is + * always TCL_TOKEN_TEXT... + */ + + if (tokenPtr->numComponents > 1) { + int i, foundCommand = 0; + + for (i=2 ; i<=tokenPtr->numComponents ; i++) { + if (tokenPtr[i].type == TCL_TOKEN_COMMAND) { + foundCommand = 1; + break; + } + } + if (foundCommand) { + break; + } + } + + envPtr->line = bline; + TclCompileVarSubst(interp, tokenPtr, envPtr); + bline = envPtr->line; + count++; + continue; } while (count > 255) { @@ -1395,12 +1423,7 @@ TclCompileSwitchCmd( if (TCL_OK != TclFindElement(NULL, bytes, numBytes, &(bodyTokenArray[numWords].start), &bytes, &(bodyTokenArray[numWords].size), &literal) || !literal) { - abort: - ckfree((char *) bodyToken); - ckfree((char *) bodyTokenArray); - ckfree((char *) bodyLines); - ckfree((char *) bodyContLines); - return TCL_ERROR; + goto abort; } bodyTokenArray[numWords].type = TCL_TOKEN_TEXT; @@ -1425,7 +1448,12 @@ TclCompileSwitchCmd( numWords++; } if (numWords % 2) { - goto abort; + abort: + ckfree((char *) bodyToken); + ckfree((char *) bodyTokenArray); + ckfree((char *) bodyLines); + ckfree((char *) bodyContLines); + return TCL_ERROR; } } else if (numWords % 2 || numWords == 0) { /* |