Re: infinite loop in git-send-email with alias files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 23, 2009 at 02:30:55PM +0200, Johannes Sixt wrote:

> Jeff King schrieb:
> > +my %EXPANDED_ALIASES;
> > +sub expand_one_alias {
> > +	my $alias = shift;
> > +	if ($EXPANDED_ALIASES{$alias}) {
> > +		die "fatal: alias '$alias' expands to itself\n";
> > +	}
> > +	local $EXPANDED_ALIASES{$alias} = 1;
> > +	return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias;
> 
> What does 'local' make local here? Only the assignment of the slot
> $EXPANDED_ALIASES{$alias}? Or the whole %EXPANDED_ALIASES? If the latter,
> does this copy the existing %EXPANDED_ALIASES before the assignment is
> made; otherwise, how can this work if only ever a single slot of
> %EXPANDED_ALIASES is filled in?

It localizes just that slot. But remember that 'local' is about
_dynamic_ scoping, not _lexical_ scoping. So that slot is now set for
the duration of the expand_one_alias call, and is visible to its
subroutines (i.e., the recursive calls). So each level of recursion sets
one more field in $EXPANDED_ALIASES, and when we leave the function,
perl automatically restores it to its previous value.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]