diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-03-29 07:47:18 +1100 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2006-03-29 07:47:18 +1100 |
commit | bd35d8ee1cce3e06db6f44fe9772ea3c154bb0ce (patch) | |
tree | dd61a4b4f05f34cea2c949de21446ac53b852c8e /src | |
parent | [PARSER] Removed useless parsebackquote flag (diff) | |
download | dash-bd35d8ee1cce3e06db6f44fe9772ea3c154bb0ce.tar.gz dash-bd35d8ee1cce3e06db6f44fe9772ea3c154bb0ce.zip |
[PARSER] Use alloca to get rid of setjmp
Now that the only thing protected by setjmp/longjmp is the saved string, we can allocate it on the stack to get rid of the jump.
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 38 |
1 files changed, 3 insertions, 35 deletions
diff --git a/src/parser.c b/src/parser.c index 375fd54..4362f6a 100644 --- a/src/parser.c +++ b/src/parser.c @@ -32,6 +32,7 @@ * SUCH DAMAGE. */ +#include <alloca.h> #include <stdlib.h> #include "shell.h" @@ -846,19 +847,6 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs) int dqvarnest; /* levels of variables expansion within double quotes */ int oldstyle; char const *prevsyntax; /* syntax before arithmetic */ -#if __GNUC__ - /* Avoid longjmp clobbering */ - (void) &out; - (void) "ef; - (void) &dblquote; - (void) &varnest; - (void) &arinest; - (void) &parenlevel; - (void) &dqvarnest; - (void) &oldstyle; - (void) &prevsyntax; - (void) &syntax; -#endif startlinno = plinno; dblquote = 0; @@ -1263,31 +1251,16 @@ badsub: synerror("Bad substitution"); parsebackq: { struct nodelist **nlpp; union node *n; - char *volatile str; - struct jmploc jmploc; - struct jmploc *volatile savehandler; + char *str; size_t savelen; int saveprompt; -#ifdef __GNUC__ - (void) &saveprompt; -#endif - if (setjmp(jmploc.loc)) { - if (str) - ckfree(str); - handler = savehandler; - longjmp(handler->loc, 1); - } - INTOFF; str = NULL; savelen = out - (char *)stackblock(); if (savelen > 0) { - str = ckmalloc(savelen); + str = alloca(savelen); memcpy(str, stackblock(), savelen); } - savehandler = handler; - handler = &jmploc; - INTON; if (oldstyle) { /* We must read until the closing backquote, giving special treatment to some slashes, and then push the string and @@ -1386,12 +1359,7 @@ done: if (str) { memcpy(out, str, savelen); STADJUST(savelen, out); - INTOFF; - ckfree(str); - str = NULL; - INTON; } - handler = savehandler; if (arinest || dblquote) USTPUTC(CTLBACKQ | CTLQUOTE, out); else |