zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: Bart Schaefer <schaefer@brasslantern.com>,
	Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: [PATCH] Fix crash on unset-through-nameref
Date: Tue, 5 Mar 2024 15:16:25 -0800	[thread overview]
Message-ID: <CAH+w=7ZXDHJSLrLa-dmR0egOZkbnp9RKm1FC0oHBPG3Ne5NfKQ@mail.gmail.com> (raw)
In-Reply-To: <20240305193840.vvixetyn6vfnbir2@chazelas.org>

On Tue, Mar 5, 2024 at 11:38 AM Stephane Chazelas <stephane@chazelas.org> wrote:
>
> 2024-03-05 10:42:18 -0800, Bart Schaefer:
> [...]
> > > where namerefs are just plain scalar variables containing the
> > > name of another variable (or other lvalue) and having the target
> > > variable resolved any time the nameref is assigned/referenced
> >
> > That is in fact exactly how it works, with the addition now that -u
> > makes it skip upward one scope before resolving.
>
> Well, not in the:
>
> $ ./Src/zsh -c 'f() { typeset -n ref=var; local var=1; echo $ref; }; var=0; f'
> 0

OK, yes, there is one extra attempt to resolve at the time of
declaration, and it "remembers" the scope where it completed the
resolve and always goes first to that scope again.

> But is IMO somewhat inconsistent with:
>
> $ ./Src/zsh -c 'f() { nameref ref=var; local var=1; echo $ref; }; f'
> 1

Sorry, your example is confusing me.  "nameref" is only available when
the zsh/ksh93 module is loaded.  What's actually happening here, and
why do you never use -fc to prevent dotfiles from being read?

I think you're referring to the difference between
  var=0; f
and simply
  f
In the latter case, "the scope where it completed the resolve" is the
local scope because no parameter in a surrounding scope exists.  If
you assign to such a nameref, it "goes first to that scope", and if it
still finds nothing, climbs up to global scope (because implicitly
"finds nothing" at any local scope means there can't be that name at
global scope).

It's consistent with how $var / var=x would work if you never declared
anything, and consistent with ${(P)ptr} / ${(P)ptr::=x} when ptr is a
plain scalar.  The difference is when the ref has already found
something, which seems like the intended difference if you're using a
reference in the first place.


  reply	other threads:[~2024-03-05 23:16 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-04  5:37 Bart Schaefer
2024-03-04  6:29 ` Stephane Chazelas
2024-03-04  8:39   ` Bart Schaefer
2024-03-04 19:34     ` Stephane Chazelas
2024-03-04 19:36       ` Stephane Chazelas
2024-03-04 23:50         ` Bart Schaefer
2024-03-05  8:36           ` Stephane Chazelas
2024-03-04 23:18       ` Bart Schaefer
2024-03-05  8:18         ` Stephane Chazelas
2024-03-05 18:42           ` Bart Schaefer
2024-03-05 19:38             ` Stephane Chazelas
2024-03-05 23:16               ` Bart Schaefer [this message]
2024-03-06 18:21                 ` Stephane Chazelas
2024-03-06 19:17                   ` Bart Schaefer
2024-03-06 19:37                     ` Bart Schaefer
2024-03-05 19:48             ` unset, POSIX and the export attribute (Was: [PATCH] Fix crash on unset-through-nameref) Stephane Chazelas
2024-03-05 19:51             ` [PATCH] Fix crash on unset-through-nameref Stephane Chazelas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAH+w=7ZXDHJSLrLa-dmR0egOZkbnp9RKm1FC0oHBPG3Ne5NfKQ@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).