1
0
Fork 0
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:
Bart Schaefer 2023-09-03 11:42:00 -07:00
parent a8853323dd
commit 9ff1b2810e
3 changed files with 30 additions and 11 deletions

View file

@ -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):

View file

@ -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));
}

View file

@ -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