A logical rearrangement of ops, to get the post 5.005 ops to their
Nicholas Clark [Fri, 30 Mar 2007 11:48:54 +0000 (11:48 +0000)]
logical groups.

p4raw-id: //depot/perl@30784

ext/B/t/b.t
opcode.h
opcode.pl
opnames.h
pp.sym
pp_proto.h

index 95a5059..b750f12 100755 (executable)
@@ -164,7 +164,7 @@ is(B::cstring("wibble"), '"wibble"', "Testing B::cstring()");
 is(B::perlstring("wibble"), '"wibble"', "Testing B::perlstring()");
 is(B::class(bless {}, "Wibble::Bibble"), "Bibble", "Testing B::class()");
 is(B::cast_I32(3.14), 3, "Testing B::cast_I32()");
-is(B::opnumber("localtime"), 294, "Testing opnumber with opname (localtime)");
+is(B::opnumber("chop"), 38, "Testing opnumber with opname (chop)");
 
 {
     no warnings 'once';
index 42b6e56..6ca4d5e 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -131,6 +131,7 @@ EXTCONST char* const PL_op_name[] = {
        "i_negate",
        "not",
        "complement",
+       "smartmatch",
        "atan2",
        "sin",
        "cos",
@@ -195,9 +196,11 @@ EXTCONST char* const PL_op_name[] = {
        "and",
        "or",
        "xor",
+       "dor",
        "cond_expr",
        "andassign",
        "orassign",
+       "dorassign",
        "method",
        "entersub",
        "leavesub",
@@ -224,6 +227,14 @@ EXTCONST char* const PL_op_name[] = {
        "dump",
        "goto",
        "exit",
+       "setstate",
+       "method_named",
+       "entergiven",
+       "leavegiven",
+       "enterwhen",
+       "leavewhen",
+       "break",
+       "continue",
        "open",
        "close",
        "pipe_op",
@@ -243,6 +254,7 @@ EXTCONST char* const PL_op_name[] = {
        "leavewrite",
        "prtf",
        "print",
+       "say",
        "sysopen",
        "sysseek",
        "sysread",
@@ -381,18 +393,6 @@ EXTCONST char* const PL_op_name[] = {
        "getlogin",
        "syscall",
        "lock",
-       "setstate",
-       "method_named",
-       "dor",
-       "dorassign",
-       "entergiven",
-       "leavegiven",
-       "enterwhen",
-       "leavewhen",
-       "break",
-       "continue",
-       "smartmatch",
-       "say",
        "custom",
 };
 #endif
@@ -499,6 +499,7 @@ EXTCONST char* const PL_op_desc[] = {
        "integer negation (-)",
        "not",
        "1's complement (~)",
+       "smart match",
        "atan2",
        "sin",
        "cos",
@@ -563,9 +564,11 @@ EXTCONST char* const PL_op_desc[] = {
        "logical and (&&)",
        "logical or (||)",
        "logical xor",
+       "defined or (//)",
        "conditional expression",
        "logical and assignment (&&=)",
        "logical or assignment (||=)",
+       "defined or assignment (//=)",
        "method lookup",
        "subroutine entry",
        "subroutine exit",
@@ -592,6 +595,14 @@ EXTCONST char* const PL_op_desc[] = {
        "dump",
        "goto",
        "exit",
+       "set statement info",
+       "method with known name",
+       "given()",
+       "leave given block",
+       "when()",
+       "leave when block",
+       "break",
+       "continue",
        "open",
        "close",
        "pipe",
@@ -611,6 +622,7 @@ EXTCONST char* const PL_op_desc[] = {
        "write exit",
        "printf",
        "print",
+       "say",
        "sysopen",
        "sysseek",
        "sysread",
@@ -749,18 +761,6 @@ EXTCONST char* const PL_op_desc[] = {
        "getlogin",
        "syscall",
        "lock",
-       "set statement info",
-       "method with known name",
-       "defined or (//)",
-       "defined or assignment (//=)",
-       "given()",
-       "leave given block",
-       "when()",
-       "leave when block",
-       "break",
-       "continue",
-       "smart match",
-       "say",
        "unknown custom operator",
 };
 #endif
@@ -881,6 +881,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_pp_i_negate),
        MEMBER_TO_FPTR(Perl_pp_not),
        MEMBER_TO_FPTR(Perl_pp_complement),
+       MEMBER_TO_FPTR(Perl_pp_smartmatch),
        MEMBER_TO_FPTR(Perl_pp_atan2),
        MEMBER_TO_FPTR(Perl_pp_sin),
        MEMBER_TO_FPTR(Perl_pp_sin),    /* Perl_pp_cos */
@@ -945,9 +946,11 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_pp_and),
        MEMBER_TO_FPTR(Perl_pp_or),
        MEMBER_TO_FPTR(Perl_pp_xor),
+       MEMBER_TO_FPTR(Perl_pp_defined),        /* Perl_pp_dor */
        MEMBER_TO_FPTR(Perl_pp_cond_expr),
        MEMBER_TO_FPTR(Perl_pp_and),    /* Perl_pp_andassign */
        MEMBER_TO_FPTR(Perl_pp_or),     /* Perl_pp_orassign */
+       MEMBER_TO_FPTR(Perl_pp_defined),        /* Perl_pp_dorassign */
        MEMBER_TO_FPTR(Perl_pp_method),
        MEMBER_TO_FPTR(Perl_pp_entersub),
        MEMBER_TO_FPTR(Perl_pp_leavesub),
@@ -974,6 +977,14 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_pp_goto),   /* Perl_pp_dump */
        MEMBER_TO_FPTR(Perl_pp_goto),
        MEMBER_TO_FPTR(Perl_pp_exit),
+       MEMBER_TO_FPTR(Perl_pp_setstate),
+       MEMBER_TO_FPTR(Perl_pp_method_named),
+       MEMBER_TO_FPTR(Perl_pp_entergiven),
+       MEMBER_TO_FPTR(Perl_pp_leavegiven),
+       MEMBER_TO_FPTR(Perl_pp_enterwhen),
+       MEMBER_TO_FPTR(Perl_pp_leavewhen),
+       MEMBER_TO_FPTR(Perl_pp_break),
+       MEMBER_TO_FPTR(Perl_pp_continue),
        MEMBER_TO_FPTR(Perl_pp_open),
        MEMBER_TO_FPTR(Perl_pp_close),
        MEMBER_TO_FPTR(Perl_pp_pipe_op),
@@ -993,6 +1004,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_pp_leavewrite),
        MEMBER_TO_FPTR(Perl_pp_prtf),
        MEMBER_TO_FPTR(Perl_pp_print),
+       MEMBER_TO_FPTR(Perl_pp_print),  /* Perl_pp_say */
        MEMBER_TO_FPTR(Perl_pp_sysopen),
        MEMBER_TO_FPTR(Perl_pp_sysseek),
        MEMBER_TO_FPTR(Perl_pp_sysread),
@@ -1131,18 +1143,6 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_pp_getlogin),
        MEMBER_TO_FPTR(Perl_pp_syscall),
        MEMBER_TO_FPTR(Perl_pp_lock),
-       MEMBER_TO_FPTR(Perl_pp_setstate),
-       MEMBER_TO_FPTR(Perl_pp_method_named),
-       MEMBER_TO_FPTR(Perl_pp_defined),        /* Perl_pp_dor */
-       MEMBER_TO_FPTR(Perl_pp_defined),        /* Perl_pp_dorassign */
-       MEMBER_TO_FPTR(Perl_pp_entergiven),
-       MEMBER_TO_FPTR(Perl_pp_leavegiven),
-       MEMBER_TO_FPTR(Perl_pp_enterwhen),
-       MEMBER_TO_FPTR(Perl_pp_leavewhen),
-       MEMBER_TO_FPTR(Perl_pp_break),
-       MEMBER_TO_FPTR(Perl_pp_continue),
-       MEMBER_TO_FPTR(Perl_pp_smartmatch),
-       MEMBER_TO_FPTR(Perl_pp_print),  /* Perl_pp_say */
        MEMBER_TO_FPTR(Perl_unimplemented_op),  /* Perl_pp_custom */
 }
 #endif
@@ -1260,6 +1260,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_ck_null),   /* i_negate */
        MEMBER_TO_FPTR(Perl_ck_null),   /* not */
        MEMBER_TO_FPTR(Perl_ck_bitop),  /* complement */
+       MEMBER_TO_FPTR(Perl_ck_smartmatch),     /* smartmatch */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* atan2 */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* sin */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* cos */
@@ -1324,9 +1325,11 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_ck_null),   /* and */
        MEMBER_TO_FPTR(Perl_ck_null),   /* or */
        MEMBER_TO_FPTR(Perl_ck_null),   /* xor */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* dor */
        MEMBER_TO_FPTR(Perl_ck_null),   /* cond_expr */
        MEMBER_TO_FPTR(Perl_ck_null),   /* andassign */
        MEMBER_TO_FPTR(Perl_ck_null),   /* orassign */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* dorassign */
        MEMBER_TO_FPTR(Perl_ck_method), /* method */
        MEMBER_TO_FPTR(Perl_ck_subr),   /* entersub */
        MEMBER_TO_FPTR(Perl_ck_null),   /* leavesub */
@@ -1353,6 +1356,14 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_ck_null),   /* dump */
        MEMBER_TO_FPTR(Perl_ck_null),   /* goto */
        MEMBER_TO_FPTR(Perl_ck_exit),   /* exit */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* setstate */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* method_named */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* entergiven */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* leavegiven */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* enterwhen */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* leavewhen */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* break */
+       MEMBER_TO_FPTR(Perl_ck_null),   /* continue */
        MEMBER_TO_FPTR(Perl_ck_open),   /* open */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* close */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* pipe_op */
@@ -1372,6 +1383,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_ck_null),   /* leavewrite */
        MEMBER_TO_FPTR(Perl_ck_listiob),        /* prtf */
        MEMBER_TO_FPTR(Perl_ck_listiob),        /* print */
+       MEMBER_TO_FPTR(Perl_ck_listiob),        /* say */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* sysopen */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* sysseek */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* sysread */
@@ -1510,18 +1522,6 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */
        MEMBER_TO_FPTR(Perl_ck_null),   /* getlogin */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* syscall */
        MEMBER_TO_FPTR(Perl_ck_rfun),   /* lock */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* setstate */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* method_named */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* dor */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* dorassign */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* entergiven */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* leavegiven */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* enterwhen */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* leavewhen */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* break */
-       MEMBER_TO_FPTR(Perl_ck_null),   /* continue */
-       MEMBER_TO_FPTR(Perl_ck_smartmatch),     /* smartmatch */
-       MEMBER_TO_FPTR(Perl_ck_listiob),        /* say */
        MEMBER_TO_FPTR(Perl_ck_null),   /* custom */
 }
 #endif
@@ -1633,6 +1633,7 @@ EXTCONST U32 PL_opargs[] = {
        0x0000231e,     /* i_negate */
        0x00002216,     /* not */
        0x0000220e,     /* complement */
+       0x00000404,     /* smartmatch */
        0x0002290e,     /* atan2 */
        0x0001378e,     /* sin */
        0x0001378e,     /* cos */
@@ -1697,9 +1698,11 @@ EXTCONST U32 PL_opargs[] = {
        0x00000600,     /* and */
        0x00000600,     /* or */
        0x00022406,     /* xor */
+       0x00000600,     /* dor */
        0x00000640,     /* cond_expr */
        0x00000604,     /* andassign */
        0x00000604,     /* orassign */
+       0x00000604,     /* dorassign */
        0x00000240,     /* method */
        0x00004249,     /* entersub */
        0x00000200,     /* leavesub */
@@ -1726,6 +1729,14 @@ EXTCONST U32 PL_opargs[] = {
        0x00001a44,     /* dump */
        0x00001a44,     /* goto */
        0x00013644,     /* exit */
+       0x00001404,     /* setstate */
+       0x00000c40,     /* method_named */
+       0x00000640,     /* entergiven */
+       0x00000200,     /* leavegiven */
+       0x00000640,     /* enterwhen */
+       0x00000200,     /* leavewhen */
+       0x00000000,     /* break */
+       0x00000000,     /* continue */
        0x0052c81d,     /* open */
        0x0001d614,     /* close */
        0x000cc814,     /* pipe_op */
@@ -1745,6 +1756,7 @@ EXTCONST U32 PL_opargs[] = {
        0x00000200,     /* leavewrite */
        0x0005c815,     /* prtf */
        0x0005c815,     /* print */
+       0x0005c815,     /* say */
        0x1222c804,     /* sysopen */
        0x0022c804,     /* sysseek */
        0x122ec81d,     /* sysread */
@@ -1883,18 +1895,6 @@ EXTCONST U32 PL_opargs[] = {
        0x0000000c,     /* getlogin */
        0x0004281d,     /* syscall */
        0x0000f604,     /* lock */
-       0x00001404,     /* setstate */
-       0x00000c40,     /* method_named */
-       0x00000600,     /* dor */
-       0x00000604,     /* dorassign */
-       0x00000640,     /* entergiven */
-       0x00000200,     /* leavegiven */
-       0x00000640,     /* enterwhen */
-       0x00000200,     /* leavewhen */
-       0x00000000,     /* break */
-       0x00000000,     /* continue */
-       0x00000404,     /* smartmatch */
-       0x0005c815,     /* say */
        0x00000000,     /* custom */
 };
 #endif
index ab8f31e..f90a6c9 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -689,6 +689,8 @@ i_negate    integer negation (-)    ck_null         ifsT1   S
 not            not                     ck_null         ifs1    S
 complement     1's complement (~)      ck_bitop        fst1    S
 
+smartmatch     smart match             ck_smartmatch   s2
+
 # High falutin' math.
 
 atan2          atan2                   ck_fun          fsT@    S S
@@ -784,9 +786,11 @@ flop               range (or flop)         ck_null         1
 and            logical and (&&)                ck_null         |       
 or             logical or (||)                 ck_null         |       
 xor            logical xor                     ck_null         fs2     S S     
+dor            defined or (//)                 ck_null         |
 cond_expr      conditional expression          ck_null         d|      
 andassign      logical and assignment (&&=)    ck_null         s|      
 orassign       logical or assignment (||=)     ck_null         s|      
+dorassign      defined or assignment (//=)     ck_null         s|
 
 method         method lookup           ck_method       d1
 entersub       subroutine entry        ck_subr         dmt1    L
@@ -815,7 +819,15 @@ redo               redo                    ck_null         ds}
 dump           dump                    ck_null         ds}     
 goto           goto                    ck_null         ds}     
 exit           exit                    ck_exit         ds%     S?
-# continued below
+setstate       set statement info      ck_null         s;
+method_named   method with known name  ck_null         d$
+
+entergiven     given()                 ck_null         d|
+leavegiven     leave given block       ck_null         1
+enterwhen      when()                  ck_null         d|
+leavewhen      leave when block        ck_null         1
+break          break                   ck_null         0
+continue       continue                ck_null         0
 
 #nswitch       numeric switch          ck_null         d       
 #cswitch       character switch        ck_null         d       
@@ -846,6 +858,7 @@ leavewrite  write exit              ck_null         1
 
 prtf           printf                  ck_listiob      ims@    F? L
 print          print                   ck_listiob      ims@    F? L
+say            say                     ck_listiob      ims@    F? L
 
 sysopen                sysopen                 ck_fun          s@      F S S S?
 sysseek                sysseek                 ck_fun          s@      F S S
@@ -1037,21 +1050,4 @@ syscall          syscall                 ck_fun          imst@   S L
 # For multi-threading
 lock           lock                    ck_rfun         s%      R
 
-# Control (contd.)
-setstate       set statement info      ck_null         s;
-method_named   method with known name  ck_null         d$
-
-dor            defined or (//)                 ck_null         |
-dorassign      defined or assignment (//=)     ck_null         s|
-
-entergiven     given()                 ck_null         d|
-leavegiven     leave given block       ck_null         1
-enterwhen      when()                  ck_null         d|
-leavewhen      leave when block        ck_null         1
-break          break                   ck_null         0
-continue       continue                ck_null         0
-smartmatch     smart match             ck_smartmatch   s2
-
-say            say                     ck_listiob      ims@    F? L
-
 custom         unknown custom operator         ck_null         0
index d40140d..e09cb08 100644 (file)
--- a/opnames.h
+++ b/opnames.h
@@ -113,268 +113,268 @@ typedef enum opcode {
        OP_I_NEGATE,    /* 95 */
        OP_NOT,         /* 96 */
        OP_COMPLEMENT,  /* 97 */
-       OP_ATAN2,       /* 98 */
-       OP_SIN,         /* 99 */
-       OP_COS,         /* 100 */
-       OP_RAND,        /* 101 */
-       OP_SRAND,       /* 102 */
-       OP_EXP,         /* 103 */
-       OP_LOG,         /* 104 */
-       OP_SQRT,        /* 105 */
-       OP_INT,         /* 106 */
-       OP_HEX,         /* 107 */
-       OP_OCT,         /* 108 */
-       OP_ABS,         /* 109 */
-       OP_LENGTH,      /* 110 */
-       OP_SUBSTR,      /* 111 */
-       OP_VEC,         /* 112 */
-       OP_INDEX,       /* 113 */
-       OP_RINDEX,      /* 114 */
-       OP_SPRINTF,     /* 115 */
-       OP_FORMLINE,    /* 116 */
-       OP_ORD,         /* 117 */
-       OP_CHR,         /* 118 */
-       OP_CRYPT,       /* 119 */
-       OP_UCFIRST,     /* 120 */
-       OP_LCFIRST,     /* 121 */
-       OP_UC,          /* 122 */
-       OP_LC,          /* 123 */
-       OP_QUOTEMETA,   /* 124 */
-       OP_RV2AV,       /* 125 */
-       OP_AELEMFAST,   /* 126 */
-       OP_AELEM,       /* 127 */
-       OP_ASLICE,      /* 128 */
-       OP_EACH,        /* 129 */
-       OP_VALUES,      /* 130 */
-       OP_KEYS,        /* 131 */
-       OP_DELETE,      /* 132 */
-       OP_EXISTS,      /* 133 */
-       OP_RV2HV,       /* 134 */
-       OP_HELEM,       /* 135 */
-       OP_HSLICE,      /* 136 */
-       OP_UNPACK,      /* 137 */
-       OP_PACK,        /* 138 */
-       OP_SPLIT,       /* 139 */
-       OP_JOIN,        /* 140 */
-       OP_LIST,        /* 141 */
-       OP_LSLICE,      /* 142 */
-       OP_ANONLIST,    /* 143 */
-       OP_ANONHASH,    /* 144 */
-       OP_SPLICE,      /* 145 */
-       OP_PUSH,        /* 146 */
-       OP_POP,         /* 147 */
-       OP_SHIFT,       /* 148 */
-       OP_UNSHIFT,     /* 149 */
-       OP_SORT,        /* 150 */
-       OP_REVERSE,     /* 151 */
-       OP_GREPSTART,   /* 152 */
-       OP_GREPWHILE,   /* 153 */
-       OP_MAPSTART,    /* 154 */
-       OP_MAPWHILE,    /* 155 */
-       OP_RANGE,       /* 156 */
-       OP_FLIP,        /* 157 */
-       OP_FLOP,        /* 158 */
-       OP_AND,         /* 159 */
-       OP_OR,          /* 160 */
-       OP_XOR,         /* 161 */
-       OP_COND_EXPR,   /* 162 */
-       OP_ANDASSIGN,   /* 163 */
-       OP_ORASSIGN,    /* 164 */
-       OP_METHOD,      /* 165 */
-       OP_ENTERSUB,    /* 166 */
-       OP_LEAVESUB,    /* 167 */
-       OP_LEAVESUBLV,  /* 168 */
-       OP_CALLER,      /* 169 */
-       OP_WARN,        /* 170 */
-       OP_DIE,         /* 171 */
-       OP_RESET,       /* 172 */
-       OP_LINESEQ,     /* 173 */
-       OP_NEXTSTATE,   /* 174 */
-       OP_DBSTATE,     /* 175 */
-       OP_UNSTACK,     /* 176 */
-       OP_ENTER,       /* 177 */
-       OP_LEAVE,       /* 178 */
-       OP_SCOPE,       /* 179 */
-       OP_ENTERITER,   /* 180 */
-       OP_ITER,        /* 181 */
-       OP_ENTERLOOP,   /* 182 */
-       OP_LEAVELOOP,   /* 183 */
-       OP_RETURN,      /* 184 */
-       OP_LAST,        /* 185 */
-       OP_NEXT,        /* 186 */
-       OP_REDO,        /* 187 */
-       OP_DUMP,        /* 188 */
-       OP_GOTO,        /* 189 */
-       OP_EXIT,        /* 190 */
-       OP_OPEN,        /* 191 */
-       OP_CLOSE,       /* 192 */
-       OP_PIPE_OP,     /* 193 */
-       OP_FILENO,      /* 194 */
-       OP_UMASK,       /* 195 */
-       OP_BINMODE,     /* 196 */
-       OP_TIE,         /* 197 */
-       OP_UNTIE,       /* 198 */
-       OP_TIED,        /* 199 */
-       OP_DBMOPEN,     /* 200 */
-       OP_DBMCLOSE,    /* 201 */
-       OP_SSELECT,     /* 202 */
-       OP_SELECT,      /* 203 */
-       OP_GETC,        /* 204 */
-       OP_READ,        /* 205 */
-       OP_ENTERWRITE,  /* 206 */
-       OP_LEAVEWRITE,  /* 207 */
-       OP_PRTF,        /* 208 */
-       OP_PRINT,       /* 209 */
-       OP_SYSOPEN,     /* 210 */
-       OP_SYSSEEK,     /* 211 */
-       OP_SYSREAD,     /* 212 */
-       OP_SYSWRITE,    /* 213 */
-       OP_SEND,        /* 214 */
-       OP_RECV,        /* 215 */
-       OP_EOF,         /* 216 */
-       OP_TELL,        /* 217 */
-       OP_SEEK,        /* 218 */
-       OP_TRUNCATE,    /* 219 */
-       OP_FCNTL,       /* 220 */
-       OP_IOCTL,       /* 221 */
-       OP_FLOCK,       /* 222 */
-       OP_SOCKET,      /* 223 */
-       OP_SOCKPAIR,    /* 224 */
-       OP_BIND,        /* 225 */
-       OP_CONNECT,     /* 226 */
-       OP_LISTEN,      /* 227 */
-       OP_ACCEPT,      /* 228 */
-       OP_SHUTDOWN,    /* 229 */
-       OP_GSOCKOPT,    /* 230 */
-       OP_SSOCKOPT,    /* 231 */
-       OP_GETSOCKNAME, /* 232 */
-       OP_GETPEERNAME, /* 233 */
-       OP_LSTAT,       /* 234 */
-       OP_STAT,        /* 235 */
-       OP_FTRREAD,     /* 236 */
-       OP_FTRWRITE,    /* 237 */
-       OP_FTREXEC,     /* 238 */
-       OP_FTEREAD,     /* 239 */
-       OP_FTEWRITE,    /* 240 */
-       OP_FTEEXEC,     /* 241 */
-       OP_FTIS,        /* 242 */
-       OP_FTSIZE,      /* 243 */
-       OP_FTMTIME,     /* 244 */
-       OP_FTATIME,     /* 245 */
-       OP_FTCTIME,     /* 246 */
-       OP_FTROWNED,    /* 247 */
-       OP_FTEOWNED,    /* 248 */
-       OP_FTZERO,      /* 249 */
-       OP_FTSOCK,      /* 250 */
-       OP_FTCHR,       /* 251 */
-       OP_FTBLK,       /* 252 */
-       OP_FTFILE,      /* 253 */
-       OP_FTDIR,       /* 254 */
-       OP_FTPIPE,      /* 255 */
-       OP_FTSUID,      /* 256 */
-       OP_FTSGID,      /* 257 */
-       OP_FTSVTX,      /* 258 */
-       OP_FTLINK,      /* 259 */
-       OP_FTTTY,       /* 260 */
-       OP_FTTEXT,      /* 261 */
-       OP_FTBINARY,    /* 262 */
-       OP_CHDIR,       /* 263 */
-       OP_CHOWN,       /* 264 */
-       OP_CHROOT,      /* 265 */
-       OP_UNLINK,      /* 266 */
-       OP_CHMOD,       /* 267 */
-       OP_UTIME,       /* 268 */
-       OP_RENAME,      /* 269 */
-       OP_LINK,        /* 270 */
-       OP_SYMLINK,     /* 271 */
-       OP_READLINK,    /* 272 */
-       OP_MKDIR,       /* 273 */
-       OP_RMDIR,       /* 274 */
-       OP_OPEN_DIR,    /* 275 */
-       OP_READDIR,     /* 276 */
-       OP_TELLDIR,     /* 277 */
-       OP_SEEKDIR,     /* 278 */
-       OP_REWINDDIR,   /* 279 */
-       OP_CLOSEDIR,    /* 280 */
-       OP_FORK,        /* 281 */
-       OP_WAIT,        /* 282 */
-       OP_WAITPID,     /* 283 */
-       OP_SYSTEM,      /* 284 */
-       OP_EXEC,        /* 285 */
-       OP_KILL,        /* 286 */
-       OP_GETPPID,     /* 287 */
-       OP_GETPGRP,     /* 288 */
-       OP_SETPGRP,     /* 289 */
-       OP_GETPRIORITY, /* 290 */
-       OP_SETPRIORITY, /* 291 */
-       OP_TIME,        /* 292 */
-       OP_TMS,         /* 293 */
-       OP_LOCALTIME,   /* 294 */
-       OP_GMTIME,      /* 295 */
-       OP_ALARM,       /* 296 */
-       OP_SLEEP,       /* 297 */
-       OP_SHMGET,      /* 298 */
-       OP_SHMCTL,      /* 299 */
-       OP_SHMREAD,     /* 300 */
-       OP_SHMWRITE,    /* 301 */
-       OP_MSGGET,      /* 302 */
-       OP_MSGCTL,      /* 303 */
-       OP_MSGSND,      /* 304 */
-       OP_MSGRCV,      /* 305 */
-       OP_SEMOP,       /* 306 */
-       OP_SEMGET,      /* 307 */
-       OP_SEMCTL,      /* 308 */
-       OP_REQUIRE,     /* 309 */
-       OP_DOFILE,      /* 310 */
-       OP_ENTEREVAL,   /* 311 */
-       OP_LEAVEEVAL,   /* 312 */
-       OP_ENTERTRY,    /* 313 */
-       OP_LEAVETRY,    /* 314 */
-       OP_GHBYNAME,    /* 315 */
-       OP_GHBYADDR,    /* 316 */
-       OP_GHOSTENT,    /* 317 */
-       OP_GNBYNAME,    /* 318 */
-       OP_GNBYADDR,    /* 319 */
-       OP_GNETENT,     /* 320 */
-       OP_GPBYNAME,    /* 321 */
-       OP_GPBYNUMBER,  /* 322 */
-       OP_GPROTOENT,   /* 323 */
-       OP_GSBYNAME,    /* 324 */
-       OP_GSBYPORT,    /* 325 */
-       OP_GSERVENT,    /* 326 */
-       OP_SHOSTENT,    /* 327 */
-       OP_SNETENT,     /* 328 */
-       OP_SPROTOENT,   /* 329 */
-       OP_SSERVENT,    /* 330 */
-       OP_EHOSTENT,    /* 331 */
-       OP_ENETENT,     /* 332 */
-       OP_EPROTOENT,   /* 333 */
-       OP_ESERVENT,    /* 334 */
-       OP_GPWNAM,      /* 335 */
-       OP_GPWUID,      /* 336 */
-       OP_GPWENT,      /* 337 */
-       OP_SPWENT,      /* 338 */
-       OP_EPWENT,      /* 339 */
-       OP_GGRNAM,      /* 340 */
-       OP_GGRGID,      /* 341 */
-       OP_GGRENT,      /* 342 */
-       OP_SGRENT,      /* 343 */
-       OP_EGRENT,      /* 344 */
-       OP_GETLOGIN,    /* 345 */
-       OP_SYSCALL,     /* 346 */
-       OP_LOCK,        /* 347 */
-       OP_SETSTATE,    /* 348 */
-       OP_METHOD_NAMED,/* 349 */
-       OP_DOR,         /* 350 */
-       OP_DORASSIGN,   /* 351 */
-       OP_ENTERGIVEN,  /* 352 */
-       OP_LEAVEGIVEN,  /* 353 */
-       OP_ENTERWHEN,   /* 354 */
-       OP_LEAVEWHEN,   /* 355 */
-       OP_BREAK,       /* 356 */
-       OP_CONTINUE,    /* 357 */
-       OP_SMARTMATCH,  /* 358 */
-       OP_SAY,         /* 359 */
+       OP_SMARTMATCH,  /* 98 */
+       OP_ATAN2,       /* 99 */
+       OP_SIN,         /* 100 */
+       OP_COS,         /* 101 */
+       OP_RAND,        /* 102 */
+       OP_SRAND,       /* 103 */
+       OP_EXP,         /* 104 */
+       OP_LOG,         /* 105 */
+       OP_SQRT,        /* 106 */
+       OP_INT,         /* 107 */
+       OP_HEX,         /* 108 */
+       OP_OCT,         /* 109 */
+       OP_ABS,         /* 110 */
+       OP_LENGTH,      /* 111 */
+       OP_SUBSTR,      /* 112 */
+       OP_VEC,         /* 113 */
+       OP_INDEX,       /* 114 */
+       OP_RINDEX,      /* 115 */
+       OP_SPRINTF,     /* 116 */
+       OP_FORMLINE,    /* 117 */
+       OP_ORD,         /* 118 */
+       OP_CHR,         /* 119 */
+       OP_CRYPT,       /* 120 */
+       OP_UCFIRST,     /* 121 */
+       OP_LCFIRST,     /* 122 */
+       OP_UC,          /* 123 */
+       OP_LC,          /* 124 */
+       OP_QUOTEMETA,   /* 125 */
+       OP_RV2AV,       /* 126 */
+       OP_AELEMFAST,   /* 127 */
+       OP_AELEM,       /* 128 */
+       OP_ASLICE,      /* 129 */
+       OP_EACH,        /* 130 */
+       OP_VALUES,      /* 131 */
+       OP_KEYS,        /* 132 */
+       OP_DELETE,      /* 133 */
+       OP_EXISTS,      /* 134 */
+       OP_RV2HV,       /* 135 */
+       OP_HELEM,       /* 136 */
+       OP_HSLICE,      /* 137 */
+       OP_UNPACK,      /* 138 */
+       OP_PACK,        /* 139 */
+       OP_SPLIT,       /* 140 */
+       OP_JOIN,        /* 141 */
+       OP_LIST,        /* 142 */
+       OP_LSLICE,      /* 143 */
+       OP_ANONLIST,    /* 144 */
+       OP_ANONHASH,    /* 145 */
+       OP_SPLICE,      /* 146 */
+       OP_PUSH,        /* 147 */
+       OP_POP,         /* 148 */
+       OP_SHIFT,       /* 149 */
+       OP_UNSHIFT,     /* 150 */
+       OP_SORT,        /* 151 */
+       OP_REVERSE,     /* 152 */
+       OP_GREPSTART,   /* 153 */
+       OP_GREPWHILE,   /* 154 */
+       OP_MAPSTART,    /* 155 */
+       OP_MAPWHILE,    /* 156 */
+       OP_RANGE,       /* 157 */
+       OP_FLIP,        /* 158 */
+       OP_FLOP,        /* 159 */
+       OP_AND,         /* 160 */
+       OP_OR,          /* 161 */
+       OP_XOR,         /* 162 */
+       OP_DOR,         /* 163 */
+       OP_COND_EXPR,   /* 164 */
+       OP_ANDASSIGN,   /* 165 */
+       OP_ORASSIGN,    /* 166 */
+       OP_DORASSIGN,   /* 167 */
+       OP_METHOD,      /* 168 */
+       OP_ENTERSUB,    /* 169 */
+       OP_LEAVESUB,    /* 170 */
+       OP_LEAVESUBLV,  /* 171 */
+       OP_CALLER,      /* 172 */
+       OP_WARN,        /* 173 */
+       OP_DIE,         /* 174 */
+       OP_RESET,       /* 175 */
+       OP_LINESEQ,     /* 176 */
+       OP_NEXTSTATE,   /* 177 */
+       OP_DBSTATE,     /* 178 */
+       OP_UNSTACK,     /* 179 */
+       OP_ENTER,       /* 180 */
+       OP_LEAVE,       /* 181 */
+       OP_SCOPE,       /* 182 */
+       OP_ENTERITER,   /* 183 */
+       OP_ITER,        /* 184 */
+       OP_ENTERLOOP,   /* 185 */
+       OP_LEAVELOOP,   /* 186 */
+       OP_RETURN,      /* 187 */
+       OP_LAST,        /* 188 */
+       OP_NEXT,        /* 189 */
+       OP_REDO,        /* 190 */
+       OP_DUMP,        /* 191 */
+       OP_GOTO,        /* 192 */
+       OP_EXIT,        /* 193 */
+       OP_SETSTATE,    /* 194 */
+       OP_METHOD_NAMED,/* 195 */
+       OP_ENTERGIVEN,  /* 196 */
+       OP_LEAVEGIVEN,  /* 197 */
+       OP_ENTERWHEN,   /* 198 */
+       OP_LEAVEWHEN,   /* 199 */
+       OP_BREAK,       /* 200 */
+       OP_CONTINUE,    /* 201 */
+       OP_OPEN,        /* 202 */
+       OP_CLOSE,       /* 203 */
+       OP_PIPE_OP,     /* 204 */
+       OP_FILENO,      /* 205 */
+       OP_UMASK,       /* 206 */
+       OP_BINMODE,     /* 207 */
+       OP_TIE,         /* 208 */
+       OP_UNTIE,       /* 209 */
+       OP_TIED,        /* 210 */
+       OP_DBMOPEN,     /* 211 */
+       OP_DBMCLOSE,    /* 212 */
+       OP_SSELECT,     /* 213 */
+       OP_SELECT,      /* 214 */
+       OP_GETC,        /* 215 */
+       OP_READ,        /* 216 */
+       OP_ENTERWRITE,  /* 217 */
+       OP_LEAVEWRITE,  /* 218 */
+       OP_PRTF,        /* 219 */
+       OP_PRINT,       /* 220 */
+       OP_SAY,         /* 221 */
+       OP_SYSOPEN,     /* 222 */
+       OP_SYSSEEK,     /* 223 */
+       OP_SYSREAD,     /* 224 */
+       OP_SYSWRITE,    /* 225 */
+       OP_SEND,        /* 226 */
+       OP_RECV,        /* 227 */
+       OP_EOF,         /* 228 */
+       OP_TELL,        /* 229 */
+       OP_SEEK,        /* 230 */
+       OP_TRUNCATE,    /* 231 */
+       OP_FCNTL,       /* 232 */
+       OP_IOCTL,       /* 233 */
+       OP_FLOCK,       /* 234 */
+       OP_SOCKET,      /* 235 */
+       OP_SOCKPAIR,    /* 236 */
+       OP_BIND,        /* 237 */
+       OP_CONNECT,     /* 238 */
+       OP_LISTEN,      /* 239 */
+       OP_ACCEPT,      /* 240 */
+       OP_SHUTDOWN,    /* 241 */
+       OP_GSOCKOPT,    /* 242 */
+       OP_SSOCKOPT,    /* 243 */
+       OP_GETSOCKNAME, /* 244 */
+       OP_GETPEERNAME, /* 245 */
+       OP_LSTAT,       /* 246 */
+       OP_STAT,        /* 247 */
+       OP_FTRREAD,     /* 248 */
+       OP_FTRWRITE,    /* 249 */
+       OP_FTREXEC,     /* 250 */
+       OP_FTEREAD,     /* 251 */
+       OP_FTEWRITE,    /* 252 */
+       OP_FTEEXEC,     /* 253 */
+       OP_FTIS,        /* 254 */
+       OP_FTSIZE,      /* 255 */
+       OP_FTMTIME,     /* 256 */
+       OP_FTATIME,     /* 257 */
+       OP_FTCTIME,     /* 258 */
+       OP_FTROWNED,    /* 259 */
+       OP_FTEOWNED,    /* 260 */
+       OP_FTZERO,      /* 261 */
+       OP_FTSOCK,      /* 262 */
+       OP_FTCHR,       /* 263 */
+       OP_FTBLK,       /* 264 */
+       OP_FTFILE,      /* 265 */
+       OP_FTDIR,       /* 266 */
+       OP_FTPIPE,      /* 267 */
+       OP_FTSUID,      /* 268 */
+       OP_FTSGID,      /* 269 */
+       OP_FTSVTX,      /* 270 */
+       OP_FTLINK,      /* 271 */
+       OP_FTTTY,       /* 272 */
+       OP_FTTEXT,      /* 273 */
+       OP_FTBINARY,    /* 274 */
+       OP_CHDIR,       /* 275 */
+       OP_CHOWN,       /* 276 */
+       OP_CHROOT,      /* 277 */
+       OP_UNLINK,      /* 278 */
+       OP_CHMOD,       /* 279 */
+       OP_UTIME,       /* 280 */
+       OP_RENAME,      /* 281 */
+       OP_LINK,        /* 282 */
+       OP_SYMLINK,     /* 283 */
+       OP_READLINK,    /* 284 */
+       OP_MKDIR,       /* 285 */
+       OP_RMDIR,       /* 286 */
+       OP_OPEN_DIR,    /* 287 */
+       OP_READDIR,     /* 288 */
+       OP_TELLDIR,     /* 289 */
+       OP_SEEKDIR,     /* 290 */
+       OP_REWINDDIR,   /* 291 */
+       OP_CLOSEDIR,    /* 292 */
+       OP_FORK,        /* 293 */
+       OP_WAIT,        /* 294 */
+       OP_WAITPID,     /* 295 */
+       OP_SYSTEM,      /* 296 */
+       OP_EXEC,        /* 297 */
+       OP_KILL,        /* 298 */
+       OP_GETPPID,     /* 299 */
+       OP_GETPGRP,     /* 300 */
+       OP_SETPGRP,     /* 301 */
+       OP_GETPRIORITY, /* 302 */
+       OP_SETPRIORITY, /* 303 */
+       OP_TIME,        /* 304 */
+       OP_TMS,         /* 305 */
+       OP_LOCALTIME,   /* 306 */
+       OP_GMTIME,      /* 307 */
+       OP_ALARM,       /* 308 */
+       OP_SLEEP,       /* 309 */
+       OP_SHMGET,      /* 310 */
+       OP_SHMCTL,      /* 311 */
+       OP_SHMREAD,     /* 312 */
+       OP_SHMWRITE,    /* 313 */
+       OP_MSGGET,      /* 314 */
+       OP_MSGCTL,      /* 315 */
+       OP_MSGSND,      /* 316 */
+       OP_MSGRCV,      /* 317 */
+       OP_SEMOP,       /* 318 */
+       OP_SEMGET,      /* 319 */
+       OP_SEMCTL,      /* 320 */
+       OP_REQUIRE,     /* 321 */
+       OP_DOFILE,      /* 322 */
+       OP_ENTEREVAL,   /* 323 */
+       OP_LEAVEEVAL,   /* 324 */
+       OP_ENTERTRY,    /* 325 */
+       OP_LEAVETRY,    /* 326 */
+       OP_GHBYNAME,    /* 327 */
+       OP_GHBYADDR,    /* 328 */
+       OP_GHOSTENT,    /* 329 */
+       OP_GNBYNAME,    /* 330 */
+       OP_GNBYADDR,    /* 331 */
+       OP_GNETENT,     /* 332 */
+       OP_GPBYNAME,    /* 333 */
+       OP_GPBYNUMBER,  /* 334 */
+       OP_GPROTOENT,   /* 335 */
+       OP_GSBYNAME,    /* 336 */
+       OP_GSBYPORT,    /* 337 */
+       OP_GSERVENT,    /* 338 */
+       OP_SHOSTENT,    /* 339 */
+       OP_SNETENT,     /* 340 */
+       OP_SPROTOENT,   /* 341 */
+       OP_SSERVENT,    /* 342 */
+       OP_EHOSTENT,    /* 343 */
+       OP_ENETENT,     /* 344 */
+       OP_EPROTOENT,   /* 345 */
+       OP_ESERVENT,    /* 346 */
+       OP_GPWNAM,      /* 347 */
+       OP_GPWUID,      /* 348 */
+       OP_GPWENT,      /* 349 */
+       OP_SPWENT,      /* 350 */
+       OP_EPWENT,      /* 351 */
+       OP_GGRNAM,      /* 352 */
+       OP_GGRGID,      /* 353 */
+       OP_GGRENT,      /* 354 */
+       OP_SGRENT,      /* 355 */
+       OP_EGRENT,      /* 356 */
+       OP_GETLOGIN,    /* 357 */
+       OP_SYSCALL,     /* 358 */
+       OP_LOCK,        /* 359 */
        OP_CUSTOM,      /* 360 */
        OP_max          
 } opcode;
diff --git a/pp.sym b/pp.sym
index 66df9e1..8e1495f 100644 (file)
--- a/pp.sym
+++ b/pp.sym
@@ -142,6 +142,7 @@ Perl_pp_negate
 Perl_pp_i_negate
 Perl_pp_not
 Perl_pp_complement
+Perl_pp_smartmatch
 Perl_pp_atan2
 Perl_pp_sin
 Perl_pp_cos
@@ -206,9 +207,11 @@ Perl_pp_flop
 Perl_pp_and
 Perl_pp_or
 Perl_pp_xor
+Perl_pp_dor
 Perl_pp_cond_expr
 Perl_pp_andassign
 Perl_pp_orassign
+Perl_pp_dorassign
 Perl_pp_method
 Perl_pp_entersub
 Perl_pp_leavesub
@@ -235,6 +238,14 @@ Perl_pp_redo
 Perl_pp_dump
 Perl_pp_goto
 Perl_pp_exit
+Perl_pp_setstate
+Perl_pp_method_named
+Perl_pp_entergiven
+Perl_pp_leavegiven
+Perl_pp_enterwhen
+Perl_pp_leavewhen
+Perl_pp_break
+Perl_pp_continue
 Perl_pp_open
 Perl_pp_close
 Perl_pp_pipe_op
@@ -254,6 +265,7 @@ Perl_pp_enterwrite
 Perl_pp_leavewrite
 Perl_pp_prtf
 Perl_pp_print
+Perl_pp_say
 Perl_pp_sysopen
 Perl_pp_sysseek
 Perl_pp_sysread
@@ -392,17 +404,5 @@ Perl_pp_egrent
 Perl_pp_getlogin
 Perl_pp_syscall
 Perl_pp_lock
-Perl_pp_setstate
-Perl_pp_method_named
-Perl_pp_dor
-Perl_pp_dorassign
-Perl_pp_entergiven
-Perl_pp_leavegiven
-Perl_pp_enterwhen
-Perl_pp_leavewhen
-Perl_pp_break
-Perl_pp_continue
-Perl_pp_smartmatch
-Perl_pp_say
 
 # ex: set ro:
index e5c87bd..431992c 100644 (file)
@@ -143,6 +143,7 @@ PERL_PPDEF(Perl_pp_negate)
 PERL_PPDEF(Perl_pp_i_negate)
 PERL_PPDEF(Perl_pp_not)
 PERL_PPDEF(Perl_pp_complement)
+PERL_PPDEF(Perl_pp_smartmatch)
 PERL_PPDEF(Perl_pp_atan2)
 PERL_PPDEF(Perl_pp_sin)
 PERL_PPDEF(Perl_pp_cos)
@@ -207,9 +208,11 @@ PERL_PPDEF(Perl_pp_flop)
 PERL_PPDEF(Perl_pp_and)
 PERL_PPDEF(Perl_pp_or)
 PERL_PPDEF(Perl_pp_xor)
+PERL_PPDEF(Perl_pp_dor)
 PERL_PPDEF(Perl_pp_cond_expr)
 PERL_PPDEF(Perl_pp_andassign)
 PERL_PPDEF(Perl_pp_orassign)
+PERL_PPDEF(Perl_pp_dorassign)
 PERL_PPDEF(Perl_pp_method)
 PERL_PPDEF(Perl_pp_entersub)
 PERL_PPDEF(Perl_pp_leavesub)
@@ -236,6 +239,14 @@ PERL_PPDEF(Perl_pp_redo)
 PERL_PPDEF(Perl_pp_dump)
 PERL_PPDEF(Perl_pp_goto)
 PERL_PPDEF(Perl_pp_exit)
+PERL_PPDEF(Perl_pp_setstate)
+PERL_PPDEF(Perl_pp_method_named)
+PERL_PPDEF(Perl_pp_entergiven)
+PERL_PPDEF(Perl_pp_leavegiven)
+PERL_PPDEF(Perl_pp_enterwhen)
+PERL_PPDEF(Perl_pp_leavewhen)
+PERL_PPDEF(Perl_pp_break)
+PERL_PPDEF(Perl_pp_continue)
 PERL_PPDEF(Perl_pp_open)
 PERL_PPDEF(Perl_pp_close)
 PERL_PPDEF(Perl_pp_pipe_op)
@@ -255,6 +266,7 @@ PERL_PPDEF(Perl_pp_enterwrite)
 PERL_PPDEF(Perl_pp_leavewrite)
 PERL_PPDEF(Perl_pp_prtf)
 PERL_PPDEF(Perl_pp_print)
+PERL_PPDEF(Perl_pp_say)
 PERL_PPDEF(Perl_pp_sysopen)
 PERL_PPDEF(Perl_pp_sysseek)
 PERL_PPDEF(Perl_pp_sysread)
@@ -393,17 +405,5 @@ PERL_PPDEF(Perl_pp_egrent)
 PERL_PPDEF(Perl_pp_getlogin)
 PERL_PPDEF(Perl_pp_syscall)
 PERL_PPDEF(Perl_pp_lock)
-PERL_PPDEF(Perl_pp_setstate)
-PERL_PPDEF(Perl_pp_method_named)
-PERL_PPDEF(Perl_pp_dor)
-PERL_PPDEF(Perl_pp_dorassign)
-PERL_PPDEF(Perl_pp_entergiven)
-PERL_PPDEF(Perl_pp_leavegiven)
-PERL_PPDEF(Perl_pp_enterwhen)
-PERL_PPDEF(Perl_pp_leavewhen)
-PERL_PPDEF(Perl_pp_break)
-PERL_PPDEF(Perl_pp_continue)
-PERL_PPDEF(Perl_pp_smartmatch)
-PERL_PPDEF(Perl_pp_say)
 
 /* ex: set ro: */