This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
bad things happened with for $x (...) { *x = *y }
authorDavid Mitchell <davem@iabyn.com>
Wed, 8 Sep 2010 15:53:10 +0000 (16:53 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 8 Sep 2010 15:53:10 +0000 (16:53 +0100)
commitf83b46a0147ba6f476add85d17f61a7e7fb00f21
tree0dcc25c8bf4f78496319fc13634d851282f3a960
parentaafca5257dfefe4cf2a531c79cadea21a566f9c3
bad things happened with for $x (...) { *x = *y }

fix for [perl #21469]:
since the GP may be pulled from under us and freed, coredumps and strange
things can happen.

Fix this by storing a pointer to the GV in the loop block, rather than a
pointer to the GvSV slot. The ITHREADS variant already stores GV rather
than than &GvSV; extend this to non-threaded builds too.

Also, for both threaded and non-threaded, it used to push &GvSV on the
save stack. Fix this by introducing a new save type, SAVEt_GVSV.
This behaves similarly to SAVEt_SV, but without magic get/set.

This means that

    for $package_var (...)

is now close in behaviour to

    local $package_var = ...

(except for the magic bit).
cop.h
pp_ctl.c
scope.c
scope.h
t/op/loopctl.t