This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add lvavref op type
authorFather Chrysostomos <sprout@cpan.org>
Tue, 30 Sep 2014 04:43:53 +0000 (21:43 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 11 Oct 2014 07:10:13 +0000 (00:10 -0700)
This will be used for slurpy array ref assignments.  \(@a) = \(@b)
will make @a share the same elements as @b.

ext/Opcode/Opcode.pm
lib/B/Op_private.pm
opcode.h
opnames.h
pp.c
pp_proto.h
regen/opcodes

index 6f6987c..7256126 100644 (file)
@@ -402,7 +402,7 @@ These are a hotchpotch of opcodes still waiting to be considered
 
     once
 
-    rv2gv refgen srefgen ref refassign lvref lvrefslice
+    rv2gv refgen srefgen ref refassign lvref lvrefslice lvavref
 
     bless -- could be used to change ownership of objects
             (reblessing)
index 714fc31..78a1ab2 100644 (file)
@@ -394,6 +394,7 @@ $bits{log}{0} = $bf[0];
 @{$bits{lslice}}{1,0} = ($bf[1], $bf[1]);
 $bits{lstat}{0} = $bf[0];
 @{$bits{lt}}{1,0} = ($bf[1], $bf[1]);
+$bits{lvavref}{0} = $bf[0];
 @{$bits{lvref}}{6,5,0} = ($bf[7], $bf[7], $bf[0]);
 $bits{mapwhile}{0} = $bf[0];
 $bits{method}{0} = $bf[0];
index df5b5bc..72887a8 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -530,6 +530,7 @@ EXTCONST char* const PL_op_name[] = {
        "refassign",
        "lvref",
        "lvrefslice",
+       "lvavref",
        "freed",
 };
 #endif
@@ -920,6 +921,7 @@ EXTCONST char* const PL_op_desc[] = {
        "lvalue ref assignment",
        "lvalue ref assignment",
        "lvalue ref assignment",
+       "lvalue array reference",
        "freed op",
 };
 #endif
@@ -1324,6 +1326,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_refassign,
        Perl_pp_lvref,
        Perl_pp_lvrefslice,
+       Perl_pp_lvavref,
 }
 #endif
 #ifdef PERL_PPADDR_INITED
@@ -1724,6 +1727,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_refassign,      /* refassign */
        Perl_ck_null,           /* lvref */
        Perl_ck_null,           /* lvrefslice */
+       Perl_ck_null,           /* lvavref */
 }
 #endif
 #ifdef PERL_CHECK_INITED
@@ -2118,6 +2122,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00000240,     /* refassign */
        0x00000b40,     /* lvref */
        0x00000440,     /* lvrefslice */
+       0x00000b40,     /* lvavref */
 };
 #endif
 
@@ -2740,6 +2745,7 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
      632, /* refassign */
      636, /* lvref */
      640, /* lvrefslice */
+     641, /* lvavref */
 
 };
 
@@ -3101,6 +3107,7 @@ EXTCONST U16  PL_op_private_bitdefs[] = {
     /* refassign     */ 0x277c, 0x037a, 0x13e8, 0x0067,
     /* lvref         */ 0x277c, 0x037a, 0x13e8, 0x0003,
     /* lvrefslice    */ 0x277d,
+    /* lvavref       */ 0x0003,
 
 };
 
@@ -3491,6 +3498,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* REFASSIGN  */ (OPpARG2_MASK|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpLVAL_INTRO),
     /* LVREF      */ (OPpARG1_MASK|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpLVAL_INTRO),
     /* LVREFSLICE */ (OPpLVAL_INTRO),
+    /* LVAVREF    */ (OPpARG1_MASK),
 
 };
 
index 3a9be48..de230b5 100644 (file)
--- a/opnames.h
+++ b/opnames.h
@@ -396,10 +396,11 @@ typedef enum opcode {
        OP_REFASSIGN     = 379,
        OP_LVREF         = 380,
        OP_LVREFSLICE    = 381,
+       OP_LVAVREF       = 382,
        OP_max          
 } opcode;
 
-#define MAXO 382
+#define MAXO 383
 #define OP_FREED MAXO
 
 /* the OP_IS_* macros are optimized to a simple range check because
diff --git a/pp.c b/pp.c
index 7960720..04e372c 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -6347,6 +6347,11 @@ PP(pp_lvrefslice)
     RETURN;
 }
 
+PP(pp_lvavref)
+{
+    DIE(aTHX_ "Unimplemented");
+}
+
 /*
  * Local variables:
  * c-indentation-style: bsd
index e7b9204..9a39964 100644 (file)
@@ -145,6 +145,7 @@ PERL_CALLCONV OP *Perl_pp_listen(pTHX);
 PERL_CALLCONV OP *Perl_pp_lock(pTHX);
 PERL_CALLCONV OP *Perl_pp_lslice(pTHX);
 PERL_CALLCONV OP *Perl_pp_lt(pTHX);
+PERL_CALLCONV OP *Perl_pp_lvavref(pTHX);
 PERL_CALLCONV OP *Perl_pp_lvref(pTHX);
 PERL_CALLCONV OP *Perl_pp_lvrefslice(pTHX);
 PERL_CALLCONV OP *Perl_pp_mapwhile(pTHX);
index 60fceeb..c60e623 100644 (file)
@@ -556,3 +556,4 @@ padrange    list of private variables       ck_null         d0
 refassign      lvalue ref assignment   ck_refassign    d2
 lvref          lvalue ref assignment   ck_null         d%
 lvrefslice     lvalue ref assignment   ck_null         d@
+lvavref                lvalue array reference  ck_null         d%