mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-06-18 21:38:03 +02:00
users/29220: fix bug with assignment to private following explicit unset
This commit is contained in:
parent
a8853323dd
commit
9ff1b2810e
3 changed files with 30 additions and 11 deletions
|
@ -1,3 +1,8 @@
|
|||
2023-09-03 Bart Schaefer <schaefer@zsh.org>
|
||||
|
||||
* users/29220: Src/Modules/param_private.c, Test/V10private.ztst:
|
||||
fix bug with assignment to private following explicit unset
|
||||
|
||||
2023-08-28 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
|
||||
|
||||
* Shohei YOSHIDA: 52098(+comment), 52099, 52100, 52105(+52106):
|
||||
|
|
|
@ -230,7 +230,9 @@ setfn_error(Param pm)
|
|||
* calling the original unsetfn. This assures that if the old unsetfn
|
||||
* wants to use its getfn or setfn, they're unconditionally present.
|
||||
* The "explicit" flag indicates that "unset" was called, if zero the
|
||||
* parameter is going out of scope (see params.c).
|
||||
* parameter is going out of scope (see params.c). PM_DECLARED is
|
||||
* asserted as if TYPESET_TO_UNSET were in use so that the private
|
||||
* parameter is re-used rather than re-created when assigned again.
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -268,9 +270,10 @@ pps_unsetfn(Param pm, int explicit)
|
|||
pm->gsu.s = gsu;
|
||||
if (locallevel <= pm->level)
|
||||
gsu->unsetfn(pm, explicit);
|
||||
if (explicit)
|
||||
if (explicit) {
|
||||
pm->node.flags |= PM_DECLARED;
|
||||
pm->gsu.s = (GsuScalar)c;
|
||||
else
|
||||
} else
|
||||
zfree(c, sizeof(struct gsu_closure));
|
||||
}
|
||||
|
||||
|
@ -307,9 +310,10 @@ ppi_unsetfn(Param pm, int explicit)
|
|||
pm->gsu.i = gsu;
|
||||
if (locallevel <= pm->level)
|
||||
gsu->unsetfn(pm, explicit);
|
||||
if (explicit)
|
||||
if (explicit) {
|
||||
pm->node.flags |= PM_DECLARED;
|
||||
pm->gsu.i = (GsuInteger)c;
|
||||
else
|
||||
} else
|
||||
zfree(c, sizeof(struct gsu_closure));
|
||||
}
|
||||
|
||||
|
@ -346,9 +350,10 @@ ppf_unsetfn(Param pm, int explicit)
|
|||
pm->gsu.f = gsu;
|
||||
if (locallevel <= pm->level)
|
||||
gsu->unsetfn(pm, explicit);
|
||||
if (explicit)
|
||||
if (explicit) {
|
||||
pm->node.flags |= PM_DECLARED;
|
||||
pm->gsu.f = (GsuFloat)c;
|
||||
else
|
||||
} else
|
||||
zfree(c, sizeof(struct gsu_closure));
|
||||
}
|
||||
|
||||
|
@ -386,9 +391,10 @@ ppa_unsetfn(Param pm, int explicit)
|
|||
pm->gsu.a = gsu;
|
||||
if (locallevel <= pm->level)
|
||||
gsu->unsetfn(pm, explicit);
|
||||
if (explicit)
|
||||
if (explicit) {
|
||||
pm->node.flags |= PM_DECLARED;
|
||||
pm->gsu.a = (GsuArray)c;
|
||||
else
|
||||
} else
|
||||
zfree(c, sizeof(struct gsu_closure));
|
||||
}
|
||||
|
||||
|
@ -427,9 +433,10 @@ pph_unsetfn(Param pm, int explicit)
|
|||
pm->gsu.h = gsu;
|
||||
if (locallevel <= pm->level)
|
||||
gsu->unsetfn(pm, explicit);
|
||||
if (explicit)
|
||||
if (explicit) {
|
||||
pm->node.flags |= PM_DECLARED;
|
||||
pm->gsu.h = (GsuHash)c;
|
||||
else
|
||||
} else
|
||||
zfree(c, sizeof(struct gsu_closure));
|
||||
}
|
||||
|
||||
|
|
|
@ -377,6 +377,13 @@ F:Should we allow "public" namerefs to private parameters?
|
|||
*?*no such variable: ptr1
|
||||
*?*no such variable: ptr2
|
||||
|
||||
() {
|
||||
private x=1
|
||||
unset x
|
||||
x=2
|
||||
}
|
||||
0:regression test for unset private
|
||||
|
||||
%clean
|
||||
|
||||
rm -r private.TMP
|
||||
|
|
Loading…
Reference in a new issue