mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-06-21 10:28:05 +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>
|
2023-08-28 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
|
||||||
|
|
||||||
* Shohei YOSHIDA: 52098(+comment), 52099, 52100, 52105(+52106):
|
* 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
|
* calling the original unsetfn. This assures that if the old unsetfn
|
||||||
* wants to use its getfn or setfn, they're unconditionally present.
|
* wants to use its getfn or setfn, they're unconditionally present.
|
||||||
* The "explicit" flag indicates that "unset" was called, if zero the
|
* 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;
|
pm->gsu.s = gsu;
|
||||||
if (locallevel <= pm->level)
|
if (locallevel <= pm->level)
|
||||||
gsu->unsetfn(pm, explicit);
|
gsu->unsetfn(pm, explicit);
|
||||||
if (explicit)
|
if (explicit) {
|
||||||
|
pm->node.flags |= PM_DECLARED;
|
||||||
pm->gsu.s = (GsuScalar)c;
|
pm->gsu.s = (GsuScalar)c;
|
||||||
else
|
} else
|
||||||
zfree(c, sizeof(struct gsu_closure));
|
zfree(c, sizeof(struct gsu_closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,9 +310,10 @@ ppi_unsetfn(Param pm, int explicit)
|
||||||
pm->gsu.i = gsu;
|
pm->gsu.i = gsu;
|
||||||
if (locallevel <= pm->level)
|
if (locallevel <= pm->level)
|
||||||
gsu->unsetfn(pm, explicit);
|
gsu->unsetfn(pm, explicit);
|
||||||
if (explicit)
|
if (explicit) {
|
||||||
|
pm->node.flags |= PM_DECLARED;
|
||||||
pm->gsu.i = (GsuInteger)c;
|
pm->gsu.i = (GsuInteger)c;
|
||||||
else
|
} else
|
||||||
zfree(c, sizeof(struct gsu_closure));
|
zfree(c, sizeof(struct gsu_closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,9 +350,10 @@ ppf_unsetfn(Param pm, int explicit)
|
||||||
pm->gsu.f = gsu;
|
pm->gsu.f = gsu;
|
||||||
if (locallevel <= pm->level)
|
if (locallevel <= pm->level)
|
||||||
gsu->unsetfn(pm, explicit);
|
gsu->unsetfn(pm, explicit);
|
||||||
if (explicit)
|
if (explicit) {
|
||||||
|
pm->node.flags |= PM_DECLARED;
|
||||||
pm->gsu.f = (GsuFloat)c;
|
pm->gsu.f = (GsuFloat)c;
|
||||||
else
|
} else
|
||||||
zfree(c, sizeof(struct gsu_closure));
|
zfree(c, sizeof(struct gsu_closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,9 +391,10 @@ ppa_unsetfn(Param pm, int explicit)
|
||||||
pm->gsu.a = gsu;
|
pm->gsu.a = gsu;
|
||||||
if (locallevel <= pm->level)
|
if (locallevel <= pm->level)
|
||||||
gsu->unsetfn(pm, explicit);
|
gsu->unsetfn(pm, explicit);
|
||||||
if (explicit)
|
if (explicit) {
|
||||||
|
pm->node.flags |= PM_DECLARED;
|
||||||
pm->gsu.a = (GsuArray)c;
|
pm->gsu.a = (GsuArray)c;
|
||||||
else
|
} else
|
||||||
zfree(c, sizeof(struct gsu_closure));
|
zfree(c, sizeof(struct gsu_closure));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,9 +433,10 @@ pph_unsetfn(Param pm, int explicit)
|
||||||
pm->gsu.h = gsu;
|
pm->gsu.h = gsu;
|
||||||
if (locallevel <= pm->level)
|
if (locallevel <= pm->level)
|
||||||
gsu->unsetfn(pm, explicit);
|
gsu->unsetfn(pm, explicit);
|
||||||
if (explicit)
|
if (explicit) {
|
||||||
|
pm->node.flags |= PM_DECLARED;
|
||||||
pm->gsu.h = (GsuHash)c;
|
pm->gsu.h = (GsuHash)c;
|
||||||
else
|
} else
|
||||||
zfree(c, sizeof(struct gsu_closure));
|
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: ptr1
|
||||||
*?*no such variable: ptr2
|
*?*no such variable: ptr2
|
||||||
|
|
||||||
|
() {
|
||||||
|
private x=1
|
||||||
|
unset x
|
||||||
|
x=2
|
||||||
|
}
|
||||||
|
0:regression test for unset private
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
|
|
||||||
rm -r private.TMP
|
rm -r private.TMP
|
||||||
|
|
Loading…
Reference in a new issue