zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <p.stephenson@samsung.com>
To: zsh workers <zsh-workers@zsh.org>
Subject: Re: More incmdpos stuff Re: Crash Re: Trial for 5.0.7
Date: Fri, 03 Oct 2014 13:27:02 +0100	[thread overview]
Message-ID: <20141003132702.044f9475@pwslap01u.europe.root.pri> (raw)
In-Reply-To: <CAHYJk3Q73heVqMyH+2c1_ihT4k+OghoJY+J9e0MJSTEL=AEM+w@mail.gmail.com>

On Fri, 03 Oct 2014 13:47:25 +0200
Mikael Magnusson <mikachu@gmail.com> wrote:
> % () ( echo hi; echo $@ ) ls
> hi
> ls --color=auto -T 0 -A -v --quoting-style=shell

I think the right answer is along the lines of "WHY THE **@*@*@ WOULD
ANYBODY USE SYNTAX LIKE THAT SHELL SYNTAX IS UNREADABLE ENOUGH AS IT IS
WITHOUT (FROTH, GIBBER, ...)", but instead here's a minimal change until
I get around to investigating why I thought I needed to leave incmdpos
= 1 for non-anymous functions.

diff --git a/Src/parse.c b/Src/parse.c
index 6cba050..860bb4b 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -729,7 +729,7 @@ par_pline(int *complex)
 
     p = ecadd(0);
 
-    if (!par_cmd(complex)) {
+    if (!par_cmd(complex, 0)) {
 	ecused--;
 	return 0;
     }
@@ -780,11 +780,15 @@ par_pline(int *complex)
 /*
  * cmd	: { redir } ( for | case | if | while | repeat |
  *				subsh | funcdef | time | dinbrack | dinpar | simple ) { redir }
+ *
+ * With zsh_construct non-zero, we're doing a zsh special in which
+ * the following token is not considered in command position.  This
+ * is used for arguments of anonymous functions.
  */
 
 /**/
 static int
-par_cmd(int *complex)
+par_cmd(int *complex, int zsh_construct)
 {
     int r, nr = 0;
 
@@ -839,12 +843,12 @@ par_cmd(int *complex)
     case INPAR:
 	*complex = 1;
 	cmdpush(CS_SUBSH);
-	par_subsh(complex);
+	par_subsh(complex, zsh_construct);
 	cmdpop();
 	break;
     case INBRACE:
 	cmdpush(CS_CURSH);
-	par_subsh(complex);
+	par_subsh(complex, zsh_construct);
 	cmdpop();
 	break;
     case FUNC:
@@ -1378,11 +1382,13 @@ par_repeat(int *complex)
 /*
  * subsh	: INPAR list OUTPAR |
  *                INBRACE list OUTBRACE [ "always" INBRACE list OUTBRACE ]
+ *
+ * zsh_construct is passed through to par_cmd(), q.v.
  */
 
 /**/
 static void
-par_subsh(int *complex)
+par_subsh(int *complex, int zsh_construct)
 {
     enum lextok otok = tok;
     int oecused = ecused, p, pp;
@@ -1395,7 +1401,7 @@ par_subsh(int *complex)
     ecadd(WCB_END());
     if (tok != ((otok == INPAR) ? OUTPAR : OUTBRACE))
 	YYERRORV(oecused);
-    incmdpos = 1;
+    incmdpos = !zsh_construct;
     zshlex();
 
     /* Optional always block.  No intervening SEPERs allowed. */
@@ -1760,10 +1766,21 @@ par_simple(int *complex, int nr)
 		sl = ecadd(0);
 		(void)ecadd(WCB_PIPE(WC_PIPE_END, 0));
 
-		if (!par_cmd(&c)) {
+		if (!par_cmd(&c, argc == 0)) {
 		    cmdpop();
 		    YYERROR(oecused);
 		}
+		if (argc == 0) {
+		    /*
+		     * Anonymous function, possibly with arguments.
+		     * N.B. for complex structures in particular
+		     * ( ... ) we rely on lower level code doing this
+		     * to get the immediately following word (the
+		     * first token after the ")" has already been
+		     * read).
+		     */
+		    incmdpos = 0;
+		}
 
 		set_sublist_code(sl, WC_SUBLIST_END, 0, ecused - 1 - sl, c);
 		set_list_code(ll, (Z_SYNC | Z_END), c);
diff --git a/Test/C04funcdef.ztst b/Test/C04funcdef.ztst
index a266031..1937570 100644
--- a/Test/C04funcdef.ztst
+++ b/Test/C04funcdef.ztst
@@ -272,6 +272,12 @@
 >ignorebraces is off
 >ignorebraces is still on here
 
+# lsfoo should not be expanded as an anonymous function argument
+ alias lsfoo='This is not ls.'
+ () (echo anon func; echo "$@") lsfoo
+0:Anonmous function with arguments in a form nobody sane would ever use but unfortunately we have to support anyway
+>anon func
+>lsfoo
 
 %clean
 


  reply	other threads:[~2014-10-03 12:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-03 11:47 Mikael Magnusson
2014-10-03 12:27 ` Peter Stephenson [this message]
2014-10-03 14:50   ` More crash " Bart Schaefer
2014-10-03 15:15     ` Peter Stephenson
2014-10-03 15:33       ` Bart Schaefer
2014-10-03 15:42         ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141003132702.044f9475@pwslap01u.europe.root.pri \
    --to=p.stephenson@samsung.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).