develooper Front page | perl.perl5.porters | Postings from April 2001

[PATCH B::Deparse] C<$x = /(.)/> ne C<($x) = /(.)/>

Thread Next
From:
Robin Houston
Date:
April 26, 2001 13:08
Subject:
[PATCH B::Deparse] C<$x = /(.)/> ne C<($x) = /(.)/>
Message ID:
20010426210832.A28419@puffinry.freeserve.co.uk
Well, it's a more general problem with assignments. You need the
parens in order to force list context.

 .robin.


--- ext/B/B/Deparse.pm.sent2	Thu Apr 26 20:53:30 2001
+++ ext/B/B/Deparse.pm	Thu Apr 26 20:59:15 2001
@@ -1581,6 +1581,7 @@
 
 sub SWAP_CHILDREN () { 1 }
 sub ASSIGN () { 2 } # has OP= variant
+sub LIST_CONTEXT () { 4 } # Assignment is in list context
 
 my(%left, %right);
 
@@ -1683,6 +1684,7 @@
 	($left, $right) = ($right, $left);
     }
     $left = $self->deparse_binop_left($op, $left, $prec);
+    $left = "($left)" if $flags & LIST_CONTEXT && $left =~ /^\$/;
     $right = $self->deparse_binop_right($op, $right, $prec);
     return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
 }
@@ -1729,7 +1731,7 @@
 sub pp_scmp { binop(@_, "cmp", 14) }
 
 sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) }
-sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN) }
+sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) }
 
 # `.' is special because concats-of-concats are optimized to save copying
 # by making all but the first concat stacked. The effect is as if the

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About