On Wed, May 20, 2009 at 07:23:32PM -0500, Craig A. Berry wrote:
> 
> On May 19, 2009, at 8:31 AM, Nicholas Clark wrote:

> >That code rings a bell. The only thing I can find that I did near it  
> >was:
> >
> >http://perl5.git.perl.org/perl.git/commit/35f998ddd1e1665f7d0899ae3e50f9262c59d848
> >
> >However I had a suspicion that I also did something that restricted  
> >the upgrade
> >to the minimal case.
> 
> Maybe you were thinking of this:
> 
> http://www.nntp.perl.org/group/perl.perl5.changes/2008/09/msg22279.html

Yes, it was exactly that one. Thanks.

> >If this is the cause, I'm not sure whether the correct fix is to make
> >mg_localize generally upgrade the new scalar to the type of the  
> >existing
> >scalar, or special case it for $?.
> 
> 
> Thanks for the analysis.  I don't really know the implications of the  
> alternatives you propose.  I assume a general change is more risky and  
> potentially adds unnecessary processing to hot code.  To me the least  
> risky thing would be to add the following by analogy with what's  
> already going on in gv.c:
> 
> --- mg.c;-0     2009-04-27 02:42:10 -0500
> +++ mg.c        2009-05-20 19:11:11 -0500
> @@ -974,6 +974,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
>         {
>             sv_setiv(sv, (IV)STATUS_CURRENT);
>  #ifdef COMPLEX_STATUS
> +           SvUPGRADE(sv, SVt_PVLV);
>             LvTARGOFF(sv) = PL_statusvalue;
>             LvTARGLEN(sv) = PL_statusvalue_vms;
>  #endif
> [end]
> 
> Does that make sense?
> 
> This does fix the memory error that started this thread.  I'm now  
> starting a complete test run to make sure nothing else goes pear-shaped.

Presumably an upgrade check is also needed at any point that tries to read
the complex status, as right now it could be using LvTARGOFF() or LvTARGLEN()
on a localised $? that is only PVMG, not PVLV.

Nicholas Clark

Reply via email to