From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2858 invoked by alias); 15 Dec 2017 10:21:39 -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: List-Unsubscribe: X-Seq: 42131 Received: (qmail 21138 invoked by uid 1010); 15 Dec 2017 10:21:39 -0000 X-Qmail-Scanner-Diagnostics: from mailout2.w1.samsung.com 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(210.118.77.12):SA:0(-6.9/5.0):. Processed in 11.318129 secs); 15 Dec 2017 10:21:39 -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=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, SPF_HELO_PASS,SPF_PASS,T_DKIM_INVALID,T_RP_MATCHES_RCVD autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20171215102122euoutp023b5e9babf5c81ad6d63487ac32a9a9a3~AcJo8iQk92621526215euoutp02U DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1513333282; bh=kDvKCmzeRTyQxGo+fYN8TKscY8PItPlabBRoPNVSKvY=; h=Date:From:To:Subject:In-reply-to:References:From; b=hh9rbS5F0qVwEYoWksGvugrQnlLTDtKEJO93SeZP+Sp9orKUPmt93Y401ni5eOYwF WZ1yX8pFmCy+QhpW3zSmX0VCeS0U0xDbkwcDX1b6lT9a6lxyYSPB6gjokICw6PuWth APFzsjyAaRQZpTrXWMY7EV9lEOvePKGDvtBF67Kw= X-AuditID: cbfec7f2-f793b6d000003243-5e-5a33a2214c9d Date: Fri, 15 Dec 2017 10:21:18 +0000 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: [BUG] Anonymous functions cause funcfiletrace to produce function-relative line numbers Message-id: <20171215102118.7bdfff2e@pwslap01u.europe.root.pri> In-reply-to: <26AB704C-51B8-49FE-87E2-3BCDE5F7DF42@dana.is> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHIsWRmVeSWpSXmKPExsWy7djPc7qKi4yjDPb8MrU42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGX9XX2AvOCRSsebkTqYGxjv8XYwcHBICJhIr15d3MXICmWIS F+6tZ+ti5OIQEljKKDH/+wJWCKeXSeJJ90RmmIZlH00h4ssYJVre9rFAONOYJG6t3sUO4Zxh lFi75wLUrLOMEtNmLWcDWcIioCqxtusJmM0mYCgxddNsRhBbREBc4uza8ywgtrBAmsTuh1/B 4rwC9hKdL46zg9icAtYSG04eZAax+QX0Ja7+/cQEcbi9xMwrZ6DqBSV+TL4HNodZQEdi27bH 7BC2vMTmNW+ZQQ6SEFjAJvG3czI7RLOLxIMPR1khbGGJV8e3QMVlJC5P7maBsPsZgQHgC9E8 g1Hi9JkdbBAJa4m+2xcZITbwSUzaNh0aSLwSHW1CECUeEmc+r4Ca4yixfus5RkiorGaSWDj7 BtMERoVZSA6fheTwWUgOX8DIvIpRJLW0ODc9tdhYrzgxt7g0L10vOT93EyMwFZz+d/zTDsav J6wOMQpwMCrx8Fq0GUUJsSaWFVfmHmKU4GBWEuG952YcJcSbklhZlVqUH19UmpNafIhRmoNF SZzXNqotUkggPbEkNTs1tSC1CCbLxMEp1cC47a6K0QKref3yV5fuj9rxqJZ39pXSm70OEnUa 00tFJQS+vm786Kubx9y0YtOV21231194+Dt+X8DeacwP55t1tp15+FbG9khj8ndP/5TPF44c nDT32/xt9+ISUx33LX4S2Fjktmz66QOZB84FTziQdV2IZe+1wgON2+Y5Lz/b906lNTgo0+36 GSWW4oxEQy3mouJEAOyUihIBAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrHLMWRmVeSWpSXmKPExsVy+t/xq7qKi4yjDHbv47c42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGX9XX2AvOCRSsebkTqYGxjv8XYwcHBICJhLLPpp2MXICmWIS F+6tZwOxhQSWMEpMeWDdxcgFZM9gktj+9A5U4hyjxNxuUYjEWUaJ9/u2s4IkWARUJdZ2PQEr YhMwlJi6aTYjiC0iIC5xdu15FhBbWCBNYvfDr2BxXgF7ic4Xx9lBbE4Ba4kNJw8yQwxdyyTx e+MmJpAEv4C+xNW/n5ggzrOXmHnlDFSzoMSPyffAhjILaEls3tbECmHLS2xe85YZ4lJ1iRt3 d7NPYBSehaRlFpKWWUhaFjAyr2IUSS0tzk3PLTbSK07MLS7NS9dLzs/dxAgM5W3Hfm7Zwdj1 LvgQowAHoxIPr0WbUZQQa2JZcWXuIUYJDmYlEd57bsZRQrwpiZVVqUX58UWlOanFhxilOViU xHl796yOFBJITyxJzU5NLUgtgskycXBKNTAqL26TaLwaNLWyKFdlY3s3V8KSOD3D8LmRK82/ mbxPXznp1/FlAi1ZB5ZyOtez3mjIl19oULWp/n1kbU7pi0c1FVVSDVtSq78vMb1a3PIr2M35 xFu+1GU3TP9a/165ZO/2KC2X3IsP/ruZ7z1zdZKDrGmT/hGXHMYkJZuX8wVs11cLurHWuyix FGckGmoxFxUnAgB8pL2BYQIAAA== X-CMS-MailID: 20171215102121eucas1p242263d314bc1a50232aefb132eebbb7e X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171210232854epcas2p2f9d4f0ac2ad31feb5a54d61da49e7140 X-RootMTR: 20171210232854epcas2p2f9d4f0ac2ad31feb5a54d61da49e7140 References: <20171211094116.48e29012@pwslap01u.europe.root.pri> <20171211101238.410a91b1@pwslap01u.europe.root.pri> <26AB704C-51B8-49FE-87E2-3BCDE5F7DF42@dana.is> On Mon, 11 Dec 2017 15:57:06 -0600 dana wrote: > On 11 Dec 2017, at 04:12, Peter Stephenson wrote: > > Oops, try this instead. > panic() { > print -rC2 -- $functrace $funcfiletrace > exit 1 > } > puts() { > panic > } > main() { > () { puts } > } > main > > The output, after applying the patch: > > puts:1 tracetest.zsh:15 > (anon):0 tracetest.zsh:9 > main:1 tracetest.zsh:9 > tracetest.zsh:11 tracetest.zsh:11 Hmm... it looks like anonymous functions do need special handling after all, for reasons I haven't put my finger on but will be down to the different relationship between the point of definition and point of execution compared with normal functions. See if this helps... BTW this also implements one of the (trivial in this case) bits I proposed for Daniel's problem. Needs a test; this is very easy to break. pws diff --git a/Src/exec.c b/Src/exec.c index 664d790..a3ac3b1 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -5104,6 +5104,7 @@ execfuncdef(Estate state, Eprog redir_prog) LinkList args; anon_func = 1; + shf->node.flags |= PM_ANONYMOUS; state->pc = end; end += *state->pc++; @@ -5669,11 +5670,13 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval) funcsave->fstack.caller = funcstack ? funcstack->name : dupstring(funcsave->argv0 ? funcsave->argv0 : argzero); funcsave->fstack.lineno = lineno; + funcsave->fstack.flineno = shfunc->lineno; + if (funcstack && (shfunc->node.flags & PM_ANONYMOUS)) + funcsave->fstack.flineno += funcstack->flineno; funcsave->fstack.prev = funcstack; funcsave->fstack.tp = FS_FUNC; funcstack = &funcsave->fstack; - funcsave->fstack.flineno = shfunc->lineno; funcsave->fstack.filename = getshfuncfile(shfunc); prog = shfunc->funcdef; diff --git a/Src/zsh.h b/Src/zsh.h index 24d06ba..22ae954 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1875,6 +1875,7 @@ struct tieddata { #define PM_DONTIMPORT_SUID (1<<19) /* do not import if running setuid */ #define PM_LOADDIR (1<<19) /* (function) filename gives load directory */ #define PM_SINGLE (1<<20) /* special can only have a single instance */ +#define PM_ANONYMOUS (1<<20) /* (function) anonymous function */ #define PM_LOCAL (1<<21) /* this parameter will be made local */ #define PM_SPECIAL (1<<22) /* special builtin parameter */ #define PM_DONTIMPORT (1<<23) /* do not import this variable */