Subject: Re: ZSH_SCRIPT
From: Greg Klanderman <[email-masked]>
To: [email-masked]
Date: Thu, 03 Mar 2016 14:36:52 -0500
List-Id: Zsh Workers List <zsh-workers.zsh.org>

>>>>> On March 3, 2016 Peter Stephenson <[email-masked]> wrote:

> I think it needs the second, because what you pass to a parameter needs
> to be uniquely managed by that parameter, so it can't point to memory
> that can be referenced another way.  I doubt it needs the first as well.

> Actually, I don't see why you need a glboal for zsh_script at all.  It's
> just there to pass runscript on so it can be set later.  That's better
> done by passing arguments rather than globals.

OK how do you like this?

Greg

diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
index ae859ce..d23c459 100644
--- a/Doc/Zsh/params.yo
+++ b/Doc/Zsh/params.yo
@@ -933,6 +933,13 @@ tt(zsh/zutil) module.
 )
 enditem()
 )
+vindex(ZSH_ARGZERO)
+item(tt(ZSH_ARGZERO))(
+If zsh was invoked to run a script, this is the name of the script.
+Otherwise, it is the name used to invoke the current shell.  This is
+the same as the value of tt($0) when the tt(POSIX_ARGZERO) option is
+set, but is always available.
+)
 vindex(ZSH_EXECUTION_STRING)
 item(tt(ZSH_EXECUTION_STRING))(
 If the shell was started with the option tt(-c), this contains
@@ -951,17 +958,15 @@ track of versions of the shell during development between releases;
 hence most users should not use it and should instead rely on
 tt($ZSH_VERSION).
 )
-vindex(ZSH_SCRIPT)
-item(tt(ZSH_SCRIPT))(
-If zsh was invoked to run a script, this is the name of the script.
-Otherwise, it is the name used to invoke the current shell.  This is
-the same as the value of tt($0) when the tt(POSIX_ARGZERO) option is
-set, but is always available.
-)
 item(tt(zsh_scheduled_events))(
 See ifzman(the section `The zsh/sched Module' in zmanref(zshmodules))\
 ifnzman(noderef(The zsh/sched Module)).
 )
+vindex(ZSH_SCRIPT)
+item(tt(ZSH_SCRIPT))(
+If zsh was invoked to run a script, this is the name of the script,
+otherwise it is unset.
+)
 vindex(ZSH_SUBSHELL <S>)
 item(tt(ZSH_SUBSHELL))(
 Readonly integer.  Initially zero, incremented each time the shell forks
diff --git a/Src/init.c b/Src/init.c
index 4097327..87e7430 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -802,7 +802,7 @@ init_term(void)
 
 /**/
 void
-setupvals(char *cmd)
+setupvals(char *cmd, char *runscript)
 {
 #ifdef USE_GETPWUID
     struct passwd *pswd;
@@ -1042,7 +1042,7 @@ setupvals(char *cmd)
     createshfunctable();    /* create hash table for shell functions   */
     createbuiltintable();   /* create hash table for builtin commands  */
     createnameddirtable();  /* create hash table for named directories */
-    createparamtable();     /* create parameter hash table             */
+    createparamtable(runscript);     /* create parameter hash table    */
 
     condtab = NULL;
     wrappers = NULL;
@@ -1660,7 +1660,7 @@ zsh_main(UNUSED(int argc), char **argv)
 
     SHTTY = -1;
     init_io(cmd);
-    setupvals(cmd);
+    setupvals(cmd, runscript);
 
     init_signals();
     init_bltinmods();
diff --git a/Src/params.c b/Src/params.c
index 8bd8a8e..ecd5bfb 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -667,7 +667,7 @@ split_env_string(char *env, char **name, char **value)
 
 /**/
 void
-createparamtable(void)
+createparamtable(char *runscript)
 {
     Param ip, pm;
 #if !defined(HAVE_PUTENV) && !defined(USE_SET_UNSET_ENV)
@@ -812,8 +812,10 @@ createparamtable(void)
     setsparam("OSTYPE", ztrdup_metafy(OSTYPE));
     setsparam("TTY", ztrdup_metafy(ttystrname));
     setsparam("VENDOR", ztrdup_metafy(VENDOR));
-    setsparam("ZSH_NAME", ztrdup_metafy(zsh_name));
-    setsparam("ZSH_SCRIPT", ztrdup(posixzero));
+    setsparam("ZSH_NAME", ztrdup(zsh_name)); /* NOTE: command line arguments are metafied early in zsh_main() */
+    setsparam("ZSH_ARGZERO", ztrdup(posixzero));
+    if (runscript)
+        setsparam("ZSH_SCRIPT", ztrdup(runscript));
     setsparam("ZSH_VERSION", ztrdup_metafy(ZSH_VERSION));
     setsparam("ZSH_PATCHLEVEL", ztrdup_metafy(ZSH_PATCHLEVEL));
     setaparam("signals", sigptr = zalloc((SIGCOUNT+4) * sizeof(char *)));