From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13957 invoked by alias); 1 Mar 2011 04:01:00 -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: 28823 Received: (qmail 7723 invoked from network); 1 Mar 2011 04:00:49 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) 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.1 Received-SPF: none (ns1.primenet.com.au: domain at closedmail.com does not designate permitted sender hosts) From: Bart Schaefer Message-id: <110228200011.ZM7304@torch.brasslantern.com> Date: Mon, 28 Feb 2011 20:00:11 -0800 In-reply-to: <20110228094931.7deaa547@pwslap01u.europe.root.pri> Comments: In reply to Peter Stephenson "Re: Crash bug in typeset -T" (Feb 28, 9:49am) References: <110227223740.ZM5361@torch.brasslantern.com> <20110228094931.7deaa547@pwslap01u.europe.root.pri> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: Subject: Re: Crash bug in typeset -T MIME-version: 1.0 Content-type: text/plain; charset=us-ascii On Feb 28, 9:49am, Peter Stephenson wrote: } Subject: Re: Crash bug in typeset -T } } On Sun, 27 Feb 2011 22:37:40 -0800 } Bart Schaefer wrote: } > Obviously "typeset -T" needs to check if it's being applied to a } > parameter that's already tied ... but what should it do in that } > case? Error? } } Within looking in any detail, I think it's going to have to be an error. OK, patch below does this, and improves a couple of other error messages. Turns out that it's only necessary to check the scalar; if the array is being re-tied, re-creating it unsets the original scalar. This is fortunate because the code never retrieves the paramtab node for the array. } The reason you need to unset variables to retie them is that undoing it } is a lot of tricky code all over the place creating messy special cases. Seems as though bin_typeset() could save the values, unset the scalar (which has the side-effect of unsetting the array), and then recreate both parameters. However, I haven't attempted to do that. --- Src/builtin.c.~1.247.~ 2011-02-27 10:21:53.000000000 -0800 +++ Src/builtin.c 2011-02-28 19:55:09.000000000 -0800 @@ -2420,12 +2420,12 @@ } if (!strcmp(asg0.name, asg->name)) { unqueue_signals(); - zerrnam(name, "can't tie a variable to itself"); + zerrnam(name, "can't tie a variable to itself: %s", asg0.name); return 1; } if (strchr(asg0.name, '[') || strchr(asg->name, '[')) { unqueue_signals(); - zerrnam(name, "can't tie array elements"); + zerrnam(name, "can't tie array elements: %s", asg0.name); return 1; } /* @@ -2440,6 +2440,11 @@ if ((pm = (Param) paramtab->getnode(paramtab, asg0.name)) && !(pm->node.flags & PM_UNSET) && (locallevel == pm->level || !(on & PM_LOCAL))) { + if (pm->node.flags & PM_TIED) { + unqueue_signals(); + zerrnam(name, "can't tie already tied scalar: %s", asg0.name); + return 1; + } if (!asg0.value && !(PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED))) oldval = ztrdup(getsparam(asg0.name)); on |= (pm->node.flags & PM_EXPORTED);