Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Crash bug in typeset -T
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 <schaefer@xxxxxxxxxxxxxxxx> 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);
Messages sorted by:
Reverse Date,
Date,
Thread,
Author