This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Get basic $cond ? \$a : \$b = ... working
authorFather Chrysostomos <sprout@cpan.org>
Tue, 30 Sep 2014 17:27:34 +0000 (10:27 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 11 Oct 2014 07:10:13 +0000 (00:10 -0700)
When I started working on lvalue references, I envisioned having all
scalar assignments pass through pp_refassign.  A refassign op repre-
sents the initial backslash on the lhs *and* the equals sign.  For
cases like this, there is no single refgen on the lhs.  It turns out
that the approach I am using for list assignments (where the lhs
becomes an lvref op that returns a magic scalar that does the aliasing
when assigned to) is the easiest way to get this working, too.

All this commit has to do is allow ‘sassign’ lvalue context to apply
to srefgen and fix the completely broken to-do tests.  (I have a ten-
dency to write broken to-do tests, as I have no way of testing them at
the time.)

op.c
t/op/lvref.t

diff --git a/op.c b/op.c
index dfe09dc..2e16360 100644 (file)
--- a/op.c
+++ b/op.c
@@ -2630,7 +2630,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        goto nomod;
 
     case OP_SREFGEN:
-       if (type != OP_AASSIGN) goto nomod;
+       if (type != OP_AASSIGN && type != OP_SASSIGN) goto nomod;
        kid = cUNOPx(cUNOPo->op_first)->op_first;
        assert (!OP_HAS_SIBLING(kid));
        goto kid_2lvref;
index 0e4a25d..604b951 100644 (file)
@@ -239,20 +239,20 @@ package HashTest {
 (\$tahi, $rua) = \(1,2);
 is join(' ', $tahi, $$rua), '1 2',
   'mixed scalar ref and scalar list assignment';
-on;
 
 # Conditional expressions
 
 $_ = 3;
 eval '$_ == 3 ? \$tahi : $rua = \3';
 is $tahi, 3, 'cond assignment resolving to scalar ref';
-eval '$_ == 3 ? \$toru : $wha = \3';
+eval '$_ == 0 ? \$toru : $wha = \3';
 is $$wha, 3, 'cond assignment resolving to scalar';
 eval '$_ == 3 ? \$rima : \$ono = \5';
-is $$rima, 5, 'cond assignment with refgens on both branches';
+is $rima, 5, 'cond assignment with refgens on both branches';
 
 # Foreach
 
+on;
 eval '
   for \my $a(\$for1, \$for2) {
     push @for, \$a;