From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13273 invoked by alias); 20 Dec 2017 17:39:53 -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: 42152 Received: (qmail 20588 invoked by uid 1010); 20 Dec 2017 17:39:53 -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 1.990021 secs); 20 Dec 2017 17:39:53 -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, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,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 20171220173945euoutp0272a54e6d53084282e04afa5d0c323d14~CEW1AI3ie1319813198euoutp02Y DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1513791585; bh=b7fqSPjZKXEmoyncexjJNS1I+a10xDovrJ1HLqyAT6A=; h=Date:From:To:Subject:In-reply-to:References:From; b=O2EXJ2XF0wtJpi5z+HaDecErLcop/T659KlkfrR4UudSRBwIsWrX0l4JAQoOJ/Pg7 XSdVxCrO6jPfFWTwlHHREfq2tio6ifWxH2z5d06ACxJTOrtT5dqLwmURcL3OcFpSdu g9dAzuYS5nxYiX1lV11yFHgeS2iMd+omLv+sRRpU= X-AuditID: cbfec7f5-f79d06d0000031c7-c0-5a3aa0608cf4 Date: Wed, 20 Dec 2017 17:39:41 +0000 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: [BUG] Anonymous functions cause funcfiletrace to produce function-relative line numbers Message-id: <20171220173941.141333d3@pwslap01u.europe.root.pri> In-reply-to: <20171218090155.58c65907@pwslap01u.europe.root.pri> 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+NgFnrPIsWRmVeSWpSXmKPExsWy7djPc7oJC6yiDPrvGFgcbH7I5MDoserg B6YAxigum5TUnMyy1CJ9uwSujP+7trMW/OGv2PB7GXsD43/uLkZODgkBE4kzp66zQ9hiEhfu rWcDsYUEljJKrHlW38XIBWT3Mkl8aprEDNMw6+5uVojEMkaJ6cd2MkI405gkDvS0sEM4Zxgl dry+zwzhnGWUOLZlGtgSFgFVicM7toPZbAKGElM3zWYEsUUExCXOrj3PAmILC6RJ7H74FSzO K2AvMe3OXbDdnAIOEisXbAOL8wvoS1z9+4kJ4iZ7iZlXzkDVC0r8mHwPbA6zgI7Etm2P2SFs eYnNa96CHSQhMIdNYnNbMxtEs4vE+u4nLBC2sMSr41ugoSEj0dlxEGpBP6PEk25fiOYZjBKn z+yAaraW6Lt9kRFiA5/EpG3TgTZwAMV5JTrahCBKPCTOfF4BNd9RYv3Wc9DwOsEs8fTJRcYJ jAqzkBw+C8nhs5AcvoCReRWjSGppcW56arGpXnFibnFpXrpecn7uJkZgMjj97/jXHYxLj1kd YhTgYFTi4b2RahUlxJpYVlyZe4hRgoNZSYS3+rNllBBvSmJlVWpRfnxRaU5q8SFGaQ4WJXFe 26i2SCGB9MSS1OzU1ILUIpgsEwenVANjJdfz/fYSJ+3CTL7fSdtydjlrnW+BafmEs5nfpiZy f/e4wRD7e19eVl1gpsbznjfvs2afc0vMuOVquissdJISh7aP2e2Wc0LtEz9tezdZa01q0tlV 6W0q2wInbs/dxbXaj33+w41VVxMfBrZ9VPPTffGsL0/87tyyf5P03xf9CinNEvNkMBRRYinO SDTUYi4qTgQAx07L7gIDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrALMWRmVeSWpSXmKPExsVy+t/xy7oJC6yiDO53MlscbH7I5MDoserg B6YAxigum5TUnMyy1CJ9uwSujP+7trMW/OGv2PB7GXsD43/uLkZODgkBE4lZd3ezQthiEhfu rWfrYuTiEBJYwijR1nmLGcKZwSSxZsZ5FgjnHKPE7vlzwVqEBM4ySiw4KAhiswioShzesZ0d xGYTMJSYumk2I4gtIiAucXYtSDMnh7BAmsTuh1/B4rwC9hLT7txlBrE5BRwkVi7Yxgix4BSz xPmPj5hAEvwC+hJX/35igrjPXmLmlTNQzYISPybfAxvKLKAlsXlbEyuELS+xec1bZojj1CVu 3N3NPoFReBaSlllIWmYhaVnAyLyKUSS1tDg3PbfYUK84Mbe4NC9dLzk/dxMjMJy3Hfu5eQfj pY3BhxgFOBiVeHhvpFpFCbEmlhVX5h5ilOBgVhLhrf5sGSXEm5JYWZValB9fVJqTWnyIUZqD RUmct3fP6kghgfTEktTs1NSC1CKYLBMHp1QDY8OBiuh3/b8sEzb8m+PLqGbb9ifMWMHd5GPP Kz7597/1tq3JCIpMteFMlXxsry76Qze75FNqQiuXW2egYrjeXxbfMx3q53/qFZy7c3Tjz1nM ObbFZd7XMiqUs/gF7J7kBUbE5K0y5129+KdqiBGDS6RwFBNbnkRZwF0vw3TRb50y9g6n+ZRY ijMSDbWYi4oTAd6iM2hjAgAA X-CMS-MailID: 20171220173944eucas1p22350819bf794cb3ccb0b6087fd805a9b 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> <20171215102118.7bdfff2e@pwslap01u.europe.root.pri> <20171218090155.58c65907@pwslap01u.europe.root.pri> I think this might be going in the right direction. We don't need PM_ANONYMOUS, and in fact we've tested before by using a special name pointer, but I quite like it for future use anyway... I tried it with the following... #snip # this is line 1 foo() { bar() { () { (){ print -rC2 -- $functrace $funcfiletrace; } } } } foo bar #snip and got (anon):0 ./why.txt:5 bar:0 ./why.txt:5 ./why.txt:8 ./why.txt:8 zsh:1 zsh:1 which looks an improvement. Probably not much activity till the New Year now. pws diff --git a/Src/exec.c b/Src/exec.c index 3678ef8..38cc24a 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -5089,7 +5089,11 @@ execfuncdef(Estate state, Eprog redir_prog) shf->node.flags = 0; /* No dircache here, not a directory */ shf->filename = ztrdup(scriptfilename); - shf->lineno = lineno; + shf->lineno = + (funcstack && (funcstack->tp == FS_FUNC || + funcstack->tp == FS_EVAL)) ? + funcstack->flineno + lineno : + lineno; /* * redir_prog is permanently allocated --- but if * this function has multiple names we need an additional @@ -5109,6 +5113,7 @@ execfuncdef(Estate state, Eprog redir_prog) LinkList args; anon_func = 1; + shf->node.flags |= PM_ANONYMOUS; state->pc = end; end += *state->pc++; 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 */