This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add avhvswitch op
authorFather Chrysostomos <sprout@cpan.org>
Tue, 17 May 2016 01:15:42 +0000 (18:15 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 21 May 2016 05:13:42 +0000 (22:13 -0700)
&CORE::keys() et al. will use this to switch between keys and akeys
depending on the argument type.

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

index 1522c4c..2c5e2a2 100644 (file)
@@ -338,7 +338,7 @@ invert_opset function.
 
     warn die lineseq nextstate scope enter leave
 
-    rv2cv anoncode prototype coreargs anonconst
+    rv2cv anoncode prototype coreargs avhvswitch anonconst
 
     entersub leavesub leavesublv return method method_named
     method_super method_redir method_redir_super
index 79a7e9e..c4916ef 100644 (file)
@@ -245,6 +245,7 @@ $bits{anonconst}{0} = $bf[0];
 @{$bits{atan2}}{3,2,1,0} = ($bf[3], $bf[3], $bf[3], $bf[3]);
 $bits{av2arylen}{0} = $bf[0];
 $bits{avalues}{0} = $bf[0];
+$bits{avhvswitch}{0} = $bf[0];
 $bits{backtick}{0} = $bf[0];
 @{$bits{bind}}{3,2,1,0} = ($bf[3], $bf[3], $bf[3], $bf[3]);
 @{$bits{binmode}}{3,2,1,0} = ($bf[3], $bf[3], $bf[3], $bf[3]);
index 965abe2..0a37dfc 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -528,6 +528,7 @@ EXTCONST char* const PL_op_name[] = {
        "once",
        "custom",
        "coreargs",
+       "avhvswitch",
        "runcv",
        "fc",
        "padcv",
@@ -929,6 +930,7 @@ EXTCONST char* const PL_op_desc[] = {
        "once",
        "unknown custom operator",
        "CORE:: subroutine",
+       "Array/hash switch",
        "__SUB__",
        "fc",
        "private subroutine",
@@ -1344,6 +1346,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        Perl_pp_once,
        Perl_pp_custom, /* implemented by Perl_unimplemented_op */
        Perl_pp_coreargs,
+       Perl_pp_avhvswitch,
        Perl_pp_runcv,
        Perl_pp_fc,
        Perl_pp_padcv,
@@ -1755,6 +1758,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        Perl_ck_null,           /* once */
        Perl_ck_null,           /* custom */
        Perl_ck_null,           /* coreargs */
+       Perl_ck_null,           /* avhvswitch */
        Perl_ck_null,           /* runcv */
        Perl_ck_fun,            /* fc */
        Perl_ck_null,           /* padcv */
@@ -2160,6 +2164,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00000300,     /* once */
        0x00000000,     /* custom */
        0x00000600,     /* coreargs */
+       0x00000108,     /* avhvswitch */
        0x00000004,     /* runcv */
        0x00009b8e,     /* fc */
        0x00000040,     /* padcv */
@@ -2797,6 +2802,7 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
        0, /* once */
       -1, /* custom */
      181, /* coreargs */
+       0, /* avhvswitch */
        3, /* runcv */
        0, /* fc */
       -1, /* padcv */
@@ -2826,7 +2832,7 @@ EXTCONST I16  PL_op_private_bitdef_ix[] = {
  */
 
 EXTCONST U16  PL_op_private_bitdefs[] = {
-    0x0003, /* scalar, prototype, refgen, srefgen, ref, readline, regcmaybe, regcreset, regcomp, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, complement, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, values, pop, shift, grepstart, grepwhile, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst */
+    0x0003, /* scalar, prototype, refgen, srefgen, ref, readline, regcmaybe, regcreset, regcomp, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, complement, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, values, pop, shift, grepstart, grepwhile, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, avhvswitch, fc, anonconst */
     0x2b5c, 0x3d59, /* pushmark */
     0x00bd, /* wantarray, runcv */
     0x03b8, 0x17f0, 0x3e0c, 0x38c8, 0x2f25, /* const */
@@ -3278,6 +3284,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* ONCE       */ (OPpARG1_MASK),
     /* CUSTOM     */ (0xff),
     /* COREARGS   */ (OPpCOREARGS_DEREF1|OPpCOREARGS_DEREF2|OPpCOREARGS_SCALARMOD|OPpCOREARGS_PUSHMARK),
+    /* AVHVSWITCH */ (OPpARG1_MASK),
     /* RUNCV      */ (OPpOFFBYONE),
     /* FC         */ (OPpARG1_MASK),
     /* PADCV      */ (0),
index 65ccab6..99b19d0 100644 (file)
--- a/opnames.h
+++ b/opnames.h
@@ -396,21 +396,22 @@ typedef enum opcode {
        OP_ONCE          = 379,
        OP_CUSTOM        = 380,
        OP_COREARGS      = 381,
-       OP_RUNCV         = 382,
-       OP_FC            = 383,
-       OP_PADCV         = 384,
-       OP_INTROCV       = 385,
-       OP_CLONECV       = 386,
-       OP_PADRANGE      = 387,
-       OP_REFASSIGN     = 388,
-       OP_LVREF         = 389,
-       OP_LVREFSLICE    = 390,
-       OP_LVAVREF       = 391,
-       OP_ANONCONST     = 392,
+       OP_AVHVSWITCH    = 382,
+       OP_RUNCV         = 383,
+       OP_FC            = 384,
+       OP_PADCV         = 385,
+       OP_INTROCV       = 386,
+       OP_CLONECV       = 387,
+       OP_PADRANGE      = 388,
+       OP_REFASSIGN     = 389,
+       OP_LVREF         = 390,
+       OP_LVREFSLICE    = 391,
+       OP_LVAVREF       = 392,
+       OP_ANONCONST     = 393,
        OP_max          
 } opcode;
 
-#define MAXO 393
+#define MAXO 394
 #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 1db39be..36f7a4f 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -6380,6 +6380,12 @@ PP(pp_coreargs)
     RETURN;
 }
 
+PP(pp_avhvswitch)
+{
+    dSP;
+    RETURN;
+}
+
 PP(pp_runcv)
 {
     dSP;
index 17241d3..fd54df8 100644 (file)
@@ -22,6 +22,7 @@ PERL_CALLCONV OP *Perl_pp_anonlist(pTHX);
 PERL_CALLCONV OP *Perl_pp_aslice(pTHX);
 PERL_CALLCONV OP *Perl_pp_atan2(pTHX);
 PERL_CALLCONV OP *Perl_pp_av2arylen(pTHX);
+PERL_CALLCONV OP *Perl_pp_avhvswitch(pTHX);
 PERL_CALLCONV OP *Perl_pp_backtick(pTHX);
 PERL_CALLCONV OP *Perl_pp_bind(pTHX);
 PERL_CALLCONV OP *Perl_pp_binmode(pTHX);
index fe72fe3..893deb0 100644 (file)
@@ -556,6 +556,7 @@ custom              unknown custom operator         ck_null         0
 
 # For CORE:: subs
 coreargs       CORE:: subroutine       ck_null         $       
+avhvswitch     Array/hash switch       ck_null         t1
 
 runcv          __SUB__                 ck_null         s0