Implement \my $x = ...
authorFather Chrysostomos <sprout@cpan.org>
Mon, 22 Sep 2014 06:11:32 +0000 (23:11 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 11 Oct 2014 04:54:11 +0000 (21:54 -0700)
lib/B/Op_private.pm
op.c
opcode.h
pp.c
regen/op_private
t/op/lvref.t

index 9353221..d1270d9 100644 (file)
@@ -128,7 +128,7 @@ $bits{$_}{5} = 'OPpHUSH_VMSISH' for qw(dbstate nextstate);
 $bits{$_}{2} = 'OPpITER_REVERSED' for qw(enteriter iter);
 $bits{$_}{7} = 'OPpLVALUE' for qw(leave leaveloop);
 $bits{$_}{4} = 'OPpLVAL_DEFER' for qw(aelem helem);
-$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list padav padhv padrange padsv pushmark rv2av rv2gv rv2hv rv2sv);
+$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv);
 $bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem aslice av2arylen helem hslice keys kvaslice kvhslice padav padhv pos rkeys rv2av rv2gv rv2hv substr vec);
 $bits{$_}{6} = 'OPpMAYBE_TRUEBOOL' for qw(padhv rv2hv);
 $bits{$_}{7} = 'OPpOFFBYONE' for qw(caller runcv wantarray);
diff --git a/op.c b/op.c
index dac6054..70e1df7 100644 (file)
--- a/op.c
+++ b/op.c
@@ -9875,8 +9875,7 @@ Perl_ck_refassign(pTHX_ OP *o)
 
     switch (varop->op_type) {
     case OP_PADSV:
-       if (varop->op_private & OPpLVAL_INTRO)
-           goto bad; /* XXX temporary */
+       o->op_private = varop->op_private & OPpLVAL_INTRO;
        o->op_targ = varop->op_targ;
        varop->op_targ = 0;
        break;
index 6121653..ff65502 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -3074,7 +3074,7 @@ EXTCONST U16  PL_op_private_bitdefs[] = {
     /* runcv         */ 0x00bd,
     /* fc            */ 0x0003,
     /* padrange      */ 0x25bc, 0x019b,
-    /* refassign     */ 0x0067,
+    /* refassign     */ 0x25bc, 0x0067,
 
 };
 
@@ -3462,7 +3462,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* INTROCV    */ (0),
     /* CLONECV    */ (0),
     /* PADRANGE   */ (OPpPADRANGE_COUNTMASK|OPpLVAL_INTRO),
-    /* REFASSIGN  */ (OPpARG2_MASK),
+    /* REFASSIGN  */ (OPpARG2_MASK|OPpLVAL_INTRO),
 
 };
 
diff --git a/pp.c b/pp.c
index a134f3c..87db5bb 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -6175,6 +6175,8 @@ PP(pp_refassign)
        SV * const old = PAD_SV(ARGTARG);
        PAD_SETSV(ARGTARG, SvREFCNT_inc_NN(SvRV(sv)));
        SvREFCNT_dec(old);
+       if (PL_op->op_private & OPpLVAL_INTRO)
+           SAVECLEARSV(PAD_SVl(ARGTARG));
        break;
     }
     case SVt_PVGV:
index 7e690d5..df0e8aa 100644 (file)
@@ -301,7 +301,7 @@ for (qw(nextstate dbstate)) {
 addbits($_, 7 => qw(OPpLVAL_INTRO LVINTRO))
     for qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice
            hslice delete padsv padav padhv enteriter entersub padrange
-           pushmark cond_expr),
+           pushmark cond_expr refassign),
            'list', # this gets set in my_attrs() for some reason
            ;
 
index 5fb6303..d5018a0 100644 (file)
@@ -33,9 +33,9 @@ is \$x, \$y, '\$pkg_scalar = ...';
 my $m;
 \$m = \$y;
 is \$m, \$y, '\$lexical = ...';
-on;
-eval '\my $n = \$y';
+\my $n = \$y;
 is \$n, \$y, '\my $lexical = ...';
+on;
 @_ = \$_;
 eval '\($x) = @_';
 is \$x, \$_, '\($pkgvar) = ... gives list context';