This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
OP_AVHVSWITCH: make op_private bits 0..1 symbolic
authorDavid Mitchell <davem@iabyn.com>
Tue, 27 Sep 2016 10:44:42 +0000 (11:44 +0100)
committerDavid Mitchell <davem@iabyn.com>
Tue, 27 Sep 2016 10:44:42 +0000 (11:44 +0100)
Add OPpAVHVSWITCH_MASK and make Concise etc display the offset as
/offset=2 rather than /2.

lib/B/Op_private.pm
opcode.h
pp.c
regen/op_private

index 0e77dc9..9259c77 100644 (file)
@@ -175,6 +175,8 @@ my @bf = (
         bitmask   => 3,
     },
     {
+        label     => 'offset',
+        mask_def  => 'OPpAVHVSWITCH_MASK',
         bitmin    => 0,
         bitmax    => 1,
         bitmask   => 3,
@@ -594,6 +596,7 @@ our %defines = (
     OPpASSIGN_COMMON_RC1     =>  32,
     OPpASSIGN_COMMON_SCALAR  =>  64,
     OPpASSIGN_CV_TO_GV       => 128,
+    OPpAVHVSWITCH_MASK       =>   3,
     OPpCONST_BARE            =>  64,
     OPpCONST_ENTERED         =>  16,
     OPpCONST_NOVER           =>   2,
index 24f5a67..3189a05 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -2216,6 +2216,7 @@ END_EXTERN_C
 #define OPpSORT_INTEGER         0x02
 #define OPpTRANS_TO_UTF         0x02
 #define OPpARG2_MASK            0x03
+#define OPpAVHVSWITCH_MASK      0x03
 #define OPpARGELEM_HV           0x04
 #define OPpCONST_SHORTCIRCUIT   0x04
 #define OPpDONT_INIT_GV         0x04
@@ -2407,6 +2408,7 @@ EXTCONST char PL_op_private_labels[] = {
     'T','A','R','G','M','Y','\0',
     'U','N','I','\0',
     'U','T','F','\0',
+    'o','f','f','s','e','t','\0',
 
 };
 
@@ -2425,7 +2427,7 @@ EXTCONST char PL_op_private_labels[] = {
 EXTCONST I16 PL_op_private_bitfields[] = {
     0, 8, -1,
     0, 8, -1,
-    0, -1, -1,
+    0, 530, -1,
     0, 8, -1,
     0, 8, -1,
     0, 8, -1,
@@ -3313,7 +3315,7 @@ EXTCONST U8 PL_op_private_valid[] = {
     /* ONCE       */ (OPpARG1_MASK),
     /* CUSTOM     */ (0xff),
     /* COREARGS   */ (OPpCOREARGS_DEREF1|OPpCOREARGS_DEREF2|OPpCOREARGS_SCALARMOD|OPpCOREARGS_PUSHMARK),
-    /* AVHVSWITCH */ (3|OPpMAYBE_LVSUB),
+    /* AVHVSWITCH */ (OPpAVHVSWITCH_MASK|OPpMAYBE_LVSUB),
     /* RUNCV      */ (OPpOFFBYONE),
     /* FC         */ (OPpARG1_MASK),
     /* PADCV      */ (0),
diff --git a/pp.c b/pp.c
index ea49b01..baf48b9 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -6367,7 +6367,7 @@ PP(pp_avhvswitch)
     dVAR; dSP;
     return PL_ppaddr[
                (SvTYPE(TOPs) == SVt_PVAV ? OP_AEACH : OP_EACH)
-                   + (PL_op->op_private & 3)
+                   + (PL_op->op_private & OPpAVHVSWITCH_MASK)
           ](aTHX);
 }
 
index 4781442..b74ff2f 100644 (file)
@@ -760,7 +760,13 @@ addbits('multideref',
 
 
 
-addbits('avhvswitch', '0..1' => { });
+addbits('avhvswitch',
+    '0..1' => {
+                   mask_def  => 'OPpAVHVSWITCH_MASK',
+                   label     => 'offset',
+    }
+);
+
 
 addbits('argelem',
    '1..2' =>  {