From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16079 invoked by alias); 2 Sep 2017 19:44:33 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 41633 Received: (qmail 24866 invoked by uid 1010); 2 Sep 2017 19:44:33 -0000 X-Qmail-Scanner-Diagnostics: from know-smtprelay-omc-1.server.virginmedia.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(80.0.253.65):SA:0(-1.9/5.0):. Processed in 4.305232 secs); 02 Sep 2017 19:44:33 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE, SPF_PASS,T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: p.w.stephenson@ntlworld.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | X-Originating-IP: [86.21.219.59] X-Authenticated-User: p.w.stephenson@ntlworld.com X-Spam: 0 X-Authority: v=2.1 cv=NqQsCJpJ c=1 sm=1 tr=0 a=utowdAHh8RITBM/6U1BPxA==:117 a=utowdAHh8RITBM/6U1BPxA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=kj9zAlcOel0A:10 a=x7bEGLp0ZPQA:10 a=7YfXLusrAAAA:8 a=d4R-3CkzhXKiRtgYRqMA:9 a=CjuIK1q_8ugA:10 a=SLz71HocmBbuEhFRYD3r:22 Date: Sat, 2 Sep 2017 20:37:20 +0100 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: function definition with & operator Message-ID: <20170902203720.459f8e0f@ntlworld.com> In-Reply-To: References: X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.28; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ntlworld.com; s=meg.feb2017; t=1504381042; bh=1KNFR5VmsVbK2hQ9YTFCz+8jZAbjn0Ch1z41quMGRho=; h=Date:From:To:Subject:In-Reply-To:References; b=4kb2ka4SRKKhbiVeXYIGUiQLFHdRK+H9hnH9XgdOPIqJwn/PlX/Tsy2t/y2oZwUop No80Q/NJJ3lSdKPkfOsR2m+uDscujsT5IvTBZXn3ZxwEylSq2EA0pPHCd9OyiylvDv 3H+GpCFykTRwtqNrwIzoTxQg+sviIDSfIk8l6J/M2JJami5wvlkx7JdNJ51j+hOf+t vWxnVLMXU6jpvK0pnQ8boSg6bLahkEMLYKmxKUkWxyxrNmjrHf7giZsTfsHrjx1w02 6rZXsWAZM7tg8yPjYrdhnfZ6RgKxi+WbOjnpmBhqqw3ZWJdKCH/OuVeSDIsAtr95DE FCvvLce2so78Q== On Fri, 1 Sep 2017 14:09:55 -0400 Eric Cook wrote: > The other week when messing around i noticed that you can define an function > in (what i thought would be) the background and it will remain in defined. > > % foo() bar & type -f foo > foo () { > bar > } > % unfunction foo > % { foo() { bar }; : } & type -f foo > [1] 14551 > foo not found > > I don't have an actual use for it, but it is an minor bug. Potentially major with anonymous functions: % () { in_background=1; } & % print $in_background 1 That's definitely not expected. The problem appears to be actually quite general --- we decide a sublist (something up to a || or &&, unless an list terminator comes along first) is simple before we look for a & or relative. If we decide it is simple, we then ignore the effect of the & or |. We keep the effect for the list, which isn't marked simple, but that doesn't help fix it for the sublist. I'm really not sure how we've got away with this but I think it's because execsimple() only does a limited amount locally and if the list is simple enough that the fork happens right down in the lowest levels it will still happen; that doesn't apply in the case of a function definition which execsimple() special cases. I think the following is good enough --- this is at a level below where we decide if the list is backgrounded, but I think the appropriate terminator always has to be the next tokens for this to happen. It does the expected in the cases above. pws diff --git a/Src/parse.c b/Src/parse.c index 2705252..6e0856b 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -808,8 +808,13 @@ par_sublist(int *cmplx) WC_SUBLIST_END), f, (e - 1 - p), c); cmdpop(); - } else + } else { + if (tok == AMPER || tok == AMPERBANG) { + c = 1; + *cmplx |= c; + } set_sublist_code(p, WC_SUBLIST_END, f, (e - 1 - p), c); + } return 1; } else { ecused--;