From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7608 invoked by alias); 29 Sep 2014 20:27:47 -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: 33286 Received: (qmail 21905 invoked from network); 29 Sep 2014 20:27:33 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) 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 autolearn=ham version=3.3.2 X-Originating-IP: [80.3.229.105] X-Spam: 0 X-Authority: v=2.1 cv=dY0O3Bne c=1 sm=1 tr=0 a=uz1KDxDNIq33yePw376BBA==:117 a=uz1KDxDNIq33yePw376BBA==:17 a=NLZqzBF-AAAA:8 a=uObrxnre4hsA:10 a=kj9zAlcOel0A:10 a=4w-698AodLLrPGi0UL0A:9 a=gqyc2FUVYcudfpVw:21 a=l3cp4YP5VusJl_uv:21 a=CjuIK1q_8ugA:10 Date: Mon, 29 Sep 2014 21:27:29 +0100 From: Peter Stephenson To: "Zsh Hackers' List" Subject: Re: PATCH: functions with redirections Message-ID: <20140929212729.79f81382@pws-pc.ntlworld.com> In-Reply-To: <20140929205236.2eb5e622@pws-pc.ntlworld.com> References: <20140929205236.2eb5e622@pws-pc.ntlworld.com> X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.7; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit One thing I missed is multiply named functions. diff --git a/Src/exec.c b/Src/exec.c index 1c2a904..cedadc8 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -4306,6 +4306,7 @@ execfuncdef(Estate state, Eprog redir_prog) Shfunc shf; char *s = NULL; int signum, nprg, sbeg, nstrs, npats, len, plen, i, htok = 0, ret = 0; + int nfunc = 0; Wordcode beg = state->pc, end; Eprog prog; Patprog *pp; @@ -4330,6 +4331,8 @@ execfuncdef(Estate state, Eprog redir_prog) } } + DPUTS(!names && redir_prog, + "Passing redirection to anon function definition."); while (!names || (s = (char *) ugetnode(names))) { if (!names) { prog = (Eprog) zhalloc(sizeof(*prog)); @@ -4371,7 +4374,15 @@ execfuncdef(Estate state, Eprog redir_prog) shf->node.flags = 0; shf->filename = ztrdup(scriptfilename); shf->lineno = lineno; - shf->redir = redir_prog; + /* + * redir_prog is permanently allocated --- but if + * this function has multiple names we need an additional + * one. + */ + if (nfunc++ && redir_prog) + shf->redir = dupeprog(redir_prog, 0); + else + shf->redir = redir_prog; shfunc_set_sticky(shf); if (!names) { @@ -4427,6 +4438,10 @@ execfuncdef(Estate state, Eprog redir_prog) shfunctab->addnode(shfunctab, ztrdup(s), shf); } } + if (!nfunc && redir_prog) { + /* For completeness, shouldn't happen */ + freeeprog(redir_prog); + } state->pc = end; return ret; } diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst index 436ae59..6c38a31 100644 --- a/Test/A04redirect.ztst +++ b/Test/A04redirect.ztst @@ -491,3 +491,19 @@ > print I want to tell you about $var > print Also, this might be an error >&2 >} < input2 > output2 2>&1 + + 1func 2func 3func() { print Ich heisse $0 } >output3 + for i in 1 2 3; do + f=${i}func + print Running $f + $f + cat output3 + unfunction $f + done +0:multiply named functions with redirection +>Running 1func +>Ich heisse 1func +>Running 2func +>Ich heisse 2func +>Running 3func +>Ich heisse 3func pws