about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2024-03-09 22:02:57 -0800
committerBart Schaefer <schaefer@zsh.org>2024-03-09 22:02:57 -0800
commitea5a5d6ec430cad1a73f3179fcc018c90a315c35 (patch)
tree899961e758d4fb0a006ee51628d4d043451fd08d
parent47c7bc9b1493c7374f076b5471cfd57ee30f4ba5 (diff)
downloadzsh-ea5a5d6ec430cad1a73f3179fcc018c90a315c35.tar.gz
zsh-ea5a5d6ec430cad1a73f3179fcc018c90a315c35.tar.xz
zsh-ea5a5d6ec430cad1a73f3179fcc018c90a315c35.zip
52725: updated named reference semantics
-rw-r--r--ChangeLog4
-rw-r--r--Src/Modules/ksh93.c44
2 files changed, 36 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 620c74fcf..a2609a1cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2024-03-09  Bart Schaefer  <schaefer@zsh.org>
+
+	* 52725: Src/Modules/ksh93.c: updated named reference semantics
+
 2024-03-09  Stephane Chazelas  <stephane@chazelas.org>
 
 	* 52721: fix metafication and regexp/subject confusion in
diff --git a/Src/Modules/ksh93.c b/Src/Modules/ksh93.c
index 6760cbca0..8d10317dc 100644
--- a/Src/Modules/ksh93.c
+++ b/Src/Modules/ksh93.c
@@ -113,18 +113,17 @@ static char sh_edmode[2];
  * obviously includes those commented out here.
  */
 static struct paramdef partab[] = {
-    PARAMDEF(".sh.command", PM_NAMEREF|PM_READONLY, "ZSH_DEBUG_CMD", &constant_gsu),
-    PARAMDEF(".sh.edchar", PM_SCALAR|PM_SPECIAL, &sh_edchar, &sh_edchar_gsu),
-    PARAMDEF(".sh.edcol", PM_NAMEREF|PM_READONLY, "CURSOR", &constant_gsu),
-    PARAMDEF(".sh.edmode", PM_SCALAR|PM_READONLY|PM_SPECIAL, &sh_edmode, &sh_edmode_gsu),
-    PARAMDEF(".sh.edtext", PM_NAMEREF|PM_READONLY, "BUFFER", &constant_gsu),
+    PARAMDEF(".sh.edchar", PM_SCALAR|PM_SPECIAL,
+	     &sh_edchar, &sh_edchar_gsu),
+    PARAMDEF(".sh.edmode", PM_SCALAR|PM_READONLY|PM_SPECIAL,
+	     &sh_edmode, &sh_edmode_gsu),
     PARAMDEF(".sh.file", PM_NAMEREF|PM_READONLY, "ZSH_SCRIPT", &constant_gsu),
-    /* PARAMDEF(".sh.fun", PM_SCALAR|PM_UNSET, NULL, &constant_gsu), */
-    /* PARAMDEF(".sh.level", PM_INTEGER|PM_UNSET, NULL, &constant_gsu), */
     PARAMDEF(".sh.lineno", PM_NAMEREF|PM_READONLY, "LINENO", &constant_gsu),
     PARAMDEF(".sh.match", PM_ARRAY|PM_READONLY, NULL, &sh_match_gsu),
-    PARAMDEF(".sh.name", PM_SCALAR|PM_READONLY|PM_SPECIAL, &sh_name, &sh_name_gsu),
-    PARAMDEF(".sh.subscript", PM_SCALAR|PM_READONLY|PM_SPECIAL, &sh_subscript, &sh_subscript_gsu),
+    PARAMDEF(".sh.name", PM_SCALAR|PM_READONLY|PM_SPECIAL,
+	     &sh_name, &sh_name_gsu),
+    PARAMDEF(".sh.subscript", PM_SCALAR|PM_READONLY|PM_SPECIAL,
+	     &sh_subscript, &sh_subscript_gsu),
     PARAMDEF(".sh.subshell", PM_NAMEREF|PM_READONLY, "ZSH_SUBSHELL", &constant_gsu),
     /* SPECIALPMDEF(".sh.value", 0, NULL, NULL, NULL), */
     PARAMDEF(".sh.version", PM_NAMEREF|PM_READONLY, "ZSH_PATCHLEVEL", &constant_gsu)
@@ -156,15 +155,35 @@ ksh93_wrapper(Eprog prog, FuncWrap w, char *name)
 
     queue_signals();
     ++locallevel;		/* Make these local */
-    if ((pm = createparam(".sh.level", PM_LOCAL|PM_UNSET))) {
+#define LOCAL_NAMEREF (PM_LOCAL|PM_UNSET|PM_NAMEREF)
+    if ((pm = createparam(".sh.command", LOCAL_NAMEREF))) {
 	pm->level = locallevel;	/* Why is this necessary? */
-	setiparam(".sh.level", num);
+	/* Force scoping by assignent hack */
+	setloopvar(".sh.command", "ZSH_DEBUG_CMD");
+	pm->node.flags |= PM_READONLY;
     }
+    /* .sh.edchar is in partab and below */
+    if (zleactive && (pm = createparam(".sh.edcol", LOCAL_NAMEREF))) {
+	pm->level = locallevel;
+	setloopvar(".sh.edcol", "CURSOR");
+	pm->node.flags |= (PM_NAMEREF|PM_READONLY);
+    }
+    /* .sh.edmode is in partab and below */
+    if (zleactive && (pm = createparam(".sh.edtext", LOCAL_NAMEREF))) {
+	pm->level = locallevel;
+	setloopvar(".sh.edtext", "BUFFER");
+	pm->node.flags |= PM_READONLY;
+    }
+
     if ((pm = createparam(".sh.fun", PM_LOCAL|PM_UNSET))) {
 	pm->level = locallevel;
 	setsparam(".sh.fun", ztrdup(name));
 	pm->node.flags |= PM_READONLY;
     }
+    if ((pm = createparam(".sh.level", PM_LOCAL|PM_UNSET))) {
+	pm->level = locallevel;
+	setiparam(".sh.level", num);
+    }
     if (zleactive) {
 	extern mod_import_variable char *curkeymapname;	/* XXX */
 	extern mod_import_variable char *varedarg;	/* XXX */
@@ -186,9 +205,10 @@ ksh93_wrapper(Eprog prog, FuncWrap w, char *name)
 		*--ie = '\0';
 	    } else
 		sh_subscript = NULL;
-	    if ((pm = createparam(".sh.value", PM_LOCAL|PM_NAMEREF|PM_UNSET))) {
+	    if ((pm = createparam(".sh.value", LOCAL_NAMEREF))) {
 		pm->level = locallevel;
 		setloopvar(".sh.value", "BUFFER");	/* Hack */
+		pm->node.flags |= PM_READONLY;
 	    }
 	} else
 	    sh_name = sh_subscript = NULL;