From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27595 invoked from network); 24 Feb 2000 10:04:21 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 24 Feb 2000 10:04:21 -0000 Received: (qmail 11719 invoked by alias); 24 Feb 2000 10:04:08 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 9863 Received: (qmail 11633 invoked from network); 24 Feb 2000 10:03:19 -0000 Date: Thu, 24 Feb 2000 11:03:14 +0100 (MET) Message-Id: <200002241003.LAA18138@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: Peter Stephenson's message of Wed, 23 Feb 2000 18:58:28 +0000 Subject: Re: PATCH: parser (was: Re: PATCH: Improved _mailboxes) Peter Stephenson wrote: > This will probably be my last email for a while... > > Sven Wischnowsky wrote: > > Here is the first of the two. As I said, this mainly makes the parser > > create wordcode directly, no more extra compilation phase. > > I'm getting a core dump in zfinit from my .zshrc (after both patches, in > fact). It's in text.c. Actually, there seem to be two bugs there. One > happens when a function is empty and you run `which' or equivalent: > getpermtext() calls gettext2() without realising that the prog.len is zero, > so it's only going to find garbage. This must be because the code for > end-of-text is not being added, or if it was removed it's not being tested > enough. Oops. There were only three places where I forgot to use par_save_list() instead of par_list(). That's fixed now. > I can't offhand see what's causing the second, but this seems to tickle it > on my system (although I only tried this after masking out the previous one > by putting an if (prog.len) before the call to gettext2()): > > chpwd() { > if [[ ${+ZFTP_USER} = 1 && -n $ZFTP_USER ]]; then > zftp_chpwd > else > [[ -t 1 && -t 2 ]] && header -P "%m: %~"; > fi > } > which chpwd > > causes a crash with a backtrace as follows, although it's probably more > useful to know that it seems to go wrong at the start of the second `[['. The problem was that I forgot to tell text.c about simplified sublists. Bye Sven diff -ru ../z.old/Src/parse.c Src/parse.c --- ../z.old/Src/parse.c Thu Feb 24 10:46:25 2000 +++ Src/parse.c Thu Feb 24 10:54:02 2000 @@ -1154,13 +1154,13 @@ yylex(); if (tok == INBRACE && usebrace) { yylex(); - par_list(complex); + par_save_list(complex); if (tok != OUTBRACE) { cmdpop(); YYERRORV(oecused); } } else { - par_list(complex); + par_save_list(complex); if (tok != FI) { cmdpop(); YYERRORV(oecused); @@ -1507,7 +1507,7 @@ int c = 0; yylex(); - par_list(&c); + par_save_list(&c); if (tok != OUTBRACE) { cmdpop(); lineno += oldlineno; diff -ru ../z.old/Src/text.c Src/text.c --- ../z.old/Src/text.c Thu Feb 24 10:46:26 2000 +++ Src/text.c Thu Feb 24 10:58:46 2000 @@ -269,7 +269,7 @@ taddstr("! "); if (WC_SUBLIST_FLAGS(code) & WC_SUBLIST_COPROC) taddstr("coproc "); - tpush(code, (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END)); + s = tpush(code, (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END)); } else { if (!(stack = (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END))) { taddstr((WC_SUBLIST_TYPE(code) == WC_SUBLIST_OR) ? @@ -282,6 +282,8 @@ taddstr("coproc "); } } + if (!stack && (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_SIMPLE)) + state->pc++; break; case WC_PIPE: if (!s) { -- Sven Wischnowsky wischnow@informatik.hu-berlin.de