about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2023-02-12 11:29:10 -0800
committerBart Schaefer <schaefer@zsh.org>2023-02-12 11:29:10 -0800
commit3e55a135c10d3582af22a3e6dc616f57ea212df8 (patch)
tree0a36a3336c938f62686c1b98417484e3941b4111 /Src
parent102145b0487ddd7d2a048a0787b79146434d2cd6 (diff)
downloadzsh-3e55a135c10d3582af22a3e6dc616f57ea212df8.tar.gz
zsh-3e55a135c10d3582af22a3e6dc616f57ea212df8.tar.xz
zsh-3e55a135c10d3582af22a3e6dc616f57ea212df8.zip
51374: Expose named references in $parameters, fix substitution error.
Diffstat (limited to 'Src')
-rw-r--r--Src/Modules/parameter.c11
-rw-r--r--Src/params.c10
2 files changed, 16 insertions, 5 deletions
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index 5bf675e2a..a659300fd 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -105,10 +105,15 @@ getpmparameter(UNUSED(HashTable ht), const char *name)
     pm->node.nam = dupstring(name);
     pm->node.flags = PM_SCALAR | PM_READONLY;
     pm->gsu.s = &nullsetscalar_gsu;
-    if ((rpm = (Param) realparamtab->getnode(realparamtab, name)) &&
-	!(rpm->node.flags & PM_UNSET))
+    if ((rpm = (Param) realparamtab->getnode2(realparamtab, name)) &&
+	!(rpm->node.flags & PM_UNSET)) {
 	pm->u.str = paramtypestr(rpm);
-    else {
+	if ((rpm->node.flags & PM_NAMEREF) &&
+	    (rpm = (Param) realparamtab->getnode(realparamtab, name)) &&
+	    !(rpm->node.flags & PM_UNSET)) {
+	    pm->u.str = zhtricat(pm->u.str, "-", paramtypestr(rpm));
+	}
+    } else {
 	pm->u.str = dupstring("");
 	pm->node.flags |= (PM_UNSET|PM_SPECIAL);
     }
diff --git a/Src/params.c b/Src/params.c
index 69b7f484f..98950d88f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2155,7 +2155,7 @@ fetchvalue(Value v, char **pptr, int bracks, int flags)
 		return NULL;
 	    if (ss)
 		*ss = sav;
-	    s = ss;
+	    s = dyncat(ss,*pptr);
 	}
 	if (PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED)) {
 	    /* Overload v->isarr as the flag bits for hashed arrays. */
@@ -6170,6 +6170,7 @@ setscope(Param pm)
 {
     if (pm->node.flags & PM_NAMEREF) {
 	Param basepm;
+	struct asgment stop;
 	char *t = pm->u.str ? itype_end(pm->u.str, IIDENT, 0) : NULL;
 
 	/* Temporarily change nameref to array parameter itself */
@@ -6177,7 +6178,12 @@ setscope(Param pm)
 	    *t = 0;
 	else
 	    t = 0;
-	basepm = (Param)resolve_nameref(pm, NULL);
+	stop.name = "";
+	stop.value.scalar = NULL;
+	stop.flags = PM_NAMEREF;
+	if (locallevel)
+	    stop.flags |= PM_LOCAL;
+	basepm = (Param)resolve_nameref(pm, &stop);
 	if (t) {
 	    pm->width = t - pm->u.str;
 	    *t = '[';