Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Remove partial duplication of strsetfn and arrsetfn
- X-seq: zsh-workers 54299
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] Remove partial duplication of strsetfn and arrsetfn
- Date: Mon, 6 Apr 2026 17:19:44 +0200
- Arc-authentication-results: i=1; mx.google.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=m8yiJXvkTHCZAtY/agUKO6jtUZXc3R3RHGERiPbRj+8=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=PEGmOHhNPym+zX7WkzvcEHsWz6LUV1AV37eHnztGXTRMUW5B6C3SXZfkMc9vh2/aXx yzVBE1xdg3D4bYx80SKg7qtgB1R0y6XDeanZ2IYslBi8wwfjk8CfX+ONbrjL4yXbwvI1 ZNCropjzIN4rPQBGbThEUx+vxwbyMZE3YVp4IeAUIQ2/PL7YD59mujvohVJJ7Yab3VaA 01v8/xB818RxoCyOaThdiWcZHG+kX1D5din/nwHWzp4TE6H+vxwGQuhyG4vq/DdQjy9X cDPz4Oqe0WoCM4mfB8rv/Fw7eABsAz2vm2NUi07+Ny/6TtdaLH3qRX2DnNtpe4q56NJu roDg==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1775488796; cv=none; d=google.com; s=arc-20240605; b=MtQcmV90ZQFWWWLKEhrNnYB65F4CpvQ6fpZxVYsMFuf4ivLc+IM3asfz3VOjmPGbPM HXFbMBoCuEuviTWcdvdJbCTpj2RJpmjTdzt5zf/XNIKZasfn0lpolHBS/zAkjKmrjFBF ll/9N9+gjWzGQJ2R1K8guKX0173kWmxplA9EkpclUztPoybY7BhMXGoVzl94cSwIIpq5 InnZu6wxUz4/3CZ1ZlTcLbt6VicG3Crs2ucDHmFElyJMS7m2B018Zk12eie1PnyUTK2r 6TpVrF5kasIlJP8ikVXhGbDqr7X+0qOamAY01hu04QB/gpLwgNgB+yviY1Lt0kBPvRn0 9f2w==
- Archived-at: <https://zsh.org/workers/54299>
- List-id: <zsh-workers.zsh.org>
A simple cleanup that removes some duplication and decreases the potential for future bugs.
Philippe
diff --git a/Src/params.c b/Src/params.c
index 461e02acf..82fa796ea 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2778,17 +2778,10 @@ assignstrvalue(Value v, char *val, int flags)
strcat(x + v->start, z + v->end);
v->pm->gsu.s->setfn(v->pm, x);
} else {
- Param pm = v->pm;
/* Size doesn't change, can limit actions to only
* overwriting bytes in already allocated string */
memcpy(z + v->start, val, vlen);
- /* Implement remainder of strsetfn */
- if (!(pm->node.flags & PM_HASHELEM) &&
- ((pm->node.flags & PM_NAMEDDIR) ||
- isset(AUTONAMEDIRS))) {
- pm->node.flags |= PM_NAMEDDIR;
- adduserdir(pm->node.nam, z, 0, 0);
- }
+ v->pm->gsu.s->setfn(v->pm, z);
}
zsfree(val);
}
@@ -2982,10 +2975,7 @@ setarrvalue(Value v, char **val)
}
if (pre_assignment_length == post_assignment_length
- && v->pm->gsu.a->setfn == arrsetfn
- /* ... and isn't something that arrsetfn() treats specially */
- && 0 == (v->pm->node.flags & (PM_SPECIAL|PM_UNIQUE))
- && NULL == v->pm->ename)
+ && v->pm->gsu.a->setfn == arrsetfn)
{
/* v->start is 0-based */
p = old + v->start;
@@ -2995,6 +2985,7 @@ setarrvalue(Value v, char **val)
/* Give away ownership of the string */
*p++ = *r++;
}
+ v->pm->gsu.a->setfn(v->pm, old);
} else {
/* arr+=( ... )
* arr[${#arr}+x,...]=( ... ) */
@@ -4059,15 +4050,15 @@ strgetfn(Param pm)
mod_export void
strsetfn(Param pm, char *x)
{
- zsfree(pm->u.str);
- pm->u.str = x;
+ if (pm->u.str != x) {
+ if (pm->u.str) zsfree(pm->u.str);
+ pm->u.str = x;
+ }
if (!(pm->node.flags & PM_HASHELEM) &&
((pm->node.flags & PM_NAMEDDIR) || isset(AUTONAMEDIRS))) {
pm->node.flags |= PM_NAMEDDIR;
adduserdir(pm->node.nam, x, 0, 0);
}
- /* If you update this function, you may need to update the
- * `Implement remainder of strsetfn' block in assignstrvalue(). */
}
/* Function to get value of an array parameter */
@@ -4087,16 +4078,15 @@ arrgetfn(Param pm)
mod_export void
arrsetfn(Param pm, char **x)
{
- if (pm->u.arr && pm->u.arr != x)
- freearray(pm->u.arr);
+ if (pm->u.arr != x) {
+ if (pm->u.arr) freearray(pm->u.arr);
+ pm->u.arr = x;
+ }
if (pm->node.flags & PM_UNIQUE)
uniqarray(x);
- pm->u.arr = x;
/* Arrays tied to colon-arrays may need to fix the environment */
if (pm->ename && x)
arrfixenv(pm->ename, x);
- /* If you extend this function, update the list of conditions in
- * setarrvalue(). */
}
/* Function to get value of an association parameter */
Messages sorted by:
Reverse Date,
Date,
Thread,
Author