summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/Opcode/Opcode.pm2
-rw-r--r--lib/B/Op_private.pm1
-rw-r--r--opcode.h8
-rw-r--r--opnames.h3
-rw-r--r--pp.c5
-rw-r--r--pp_proto.h1
-rw-r--r--regen/opcodes1
7 files changed, 19 insertions, 2 deletions
diff --git a/ext/Opcode/Opcode.pm b/ext/Opcode/Opcode.pm
index 6f6987c5ca..7256126227 100644
--- a/ext/Opcode/Opcode.pm
+++ b/ext/Opcode/Opcode.pm
@@ -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)
diff --git a/lib/B/Op_private.pm b/lib/B/Op_private.pm
index 714fc317c0..78a1ab2a1f 100644
--- a/lib/B/Op_private.pm
+++ b/lib/B/Op_private.pm
@@ -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];
diff --git a/opcode.h b/opcode.h
index df5b5bc8e5..72887a8fa9 100644
--- 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),
};
diff --git a/opnames.h b/opnames.h
index 3a9be48220..de230b5a24 100644
--- 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 7960720a0f..04e372ca6d 100644
--- 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
diff --git a/pp_proto.h b/pp_proto.h
index e7b92046f0..9a399645e4 100644
--- a/pp_proto.h
+++ b/pp_proto.h
@@ -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);
diff --git a/regen/opcodes b/regen/opcodes
index 60fceeba86..c60e623276 100644
--- a/regen/opcodes
+++ b/regen/opcodes
@@ -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%