From: Jim Cromie Date: Sat, 9 Feb 2008 07:56:59 +0000 (-0700) Subject: [patch] optimize OP_IS_(FILETEST|SOCKET) macros X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e71197e2883063656534954aa6b56632e3c510c6;p=p5sagit%2Fp5-mst-13.2.git [patch] optimize OP_IS_(FILETEST|SOCKET) macros Message-ID: <47ADBF3B.2050108@gmail.com> Date: Sat, 09 Feb 2008 07:56:59 -0700 p4raw-id: //depot/perl@33267 --- diff --git a/opcode.h b/opcode.h index 5c779c4..82bca2d 100644 --- a/opcode.h +++ b/opcode.h @@ -261,8 +261,6 @@ EXTCONST char* const PL_op_name[] = { "sysseek", "sysread", "syswrite", - "send", - "recv", "eof", "tell", "seek", @@ -270,6 +268,8 @@ EXTCONST char* const PL_op_name[] = { "fcntl", "ioctl", "flock", + "send", + "recv", "socket", "sockpair", "bind", @@ -632,8 +632,6 @@ EXTCONST char* const PL_op_desc[] = { "sysseek", "sysread", "syswrite", - "send", - "recv", "eof", "tell", "seek", @@ -641,6 +639,8 @@ EXTCONST char* const PL_op_desc[] = { "fcntl", "ioctl", "flock", + "send", + "recv", "socket", "socketpair", "bind", @@ -1017,8 +1017,6 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ MEMBER_TO_FPTR(Perl_pp_sysseek), MEMBER_TO_FPTR(Perl_pp_sysread), MEMBER_TO_FPTR(Perl_pp_send), /* Perl_pp_syswrite */ - MEMBER_TO_FPTR(Perl_pp_send), - MEMBER_TO_FPTR(Perl_pp_sysread), /* Perl_pp_recv */ MEMBER_TO_FPTR(Perl_pp_eof), MEMBER_TO_FPTR(Perl_pp_tell), MEMBER_TO_FPTR(Perl_pp_sysseek), /* Perl_pp_seek */ @@ -1026,6 +1024,8 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ MEMBER_TO_FPTR(Perl_pp_ioctl), /* Perl_pp_fcntl */ MEMBER_TO_FPTR(Perl_pp_ioctl), MEMBER_TO_FPTR(Perl_pp_flock), + MEMBER_TO_FPTR(Perl_pp_send), + MEMBER_TO_FPTR(Perl_pp_sysread), /* Perl_pp_recv */ MEMBER_TO_FPTR(Perl_pp_socket), MEMBER_TO_FPTR(Perl_pp_sockpair), MEMBER_TO_FPTR(Perl_pp_bind), @@ -1399,8 +1399,6 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ MEMBER_TO_FPTR(Perl_ck_fun), /* sysseek */ MEMBER_TO_FPTR(Perl_ck_fun), /* sysread */ MEMBER_TO_FPTR(Perl_ck_fun), /* syswrite */ - MEMBER_TO_FPTR(Perl_ck_fun), /* send */ - MEMBER_TO_FPTR(Perl_ck_fun), /* recv */ MEMBER_TO_FPTR(Perl_ck_eof), /* eof */ MEMBER_TO_FPTR(Perl_ck_fun), /* tell */ MEMBER_TO_FPTR(Perl_ck_fun), /* seek */ @@ -1408,6 +1406,8 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ MEMBER_TO_FPTR(Perl_ck_fun), /* fcntl */ MEMBER_TO_FPTR(Perl_ck_fun), /* ioctl */ MEMBER_TO_FPTR(Perl_ck_fun), /* flock */ + MEMBER_TO_FPTR(Perl_ck_fun), /* send */ + MEMBER_TO_FPTR(Perl_ck_fun), /* recv */ MEMBER_TO_FPTR(Perl_ck_fun), /* socket */ MEMBER_TO_FPTR(Perl_ck_fun), /* sockpair */ MEMBER_TO_FPTR(Perl_ck_fun), /* bind */ @@ -1775,8 +1775,6 @@ EXTCONST U32 PL_opargs[] = { 0x0022c804, /* sysseek */ 0x122ec81d, /* sysread */ 0x1322c81d, /* syswrite */ - 0x1222c81d, /* send */ - 0x022ec81d, /* recv */ 0x0001d614, /* eof */ 0x0001d60c, /* tell */ 0x0022c804, /* seek */ @@ -1784,6 +1782,8 @@ EXTCONST U32 PL_opargs[] = { 0x0022c80c, /* fcntl */ 0x0022c80c, /* ioctl */ 0x0002c91c, /* flock */ + 0x1222c81d, /* send */ + 0x022ec81d, /* recv */ 0x0222c814, /* socket */ 0x222cc814, /* sockpair */ 0x0002c814, /* bind */ diff --git a/opcode.pl b/opcode.pl index 8a372df..bcbcbb0 100755 --- a/opcode.pl +++ b/opcode.pl @@ -17,7 +17,7 @@ select OC; # Read data. my %seen; -my (@ops, %desc, %check, %ckname, %flags, %args); +my (@ops, %desc, %check, %ckname, %flags, %args, %opnum); while () { chop; @@ -32,6 +32,7 @@ while () { $seen{$key} = qq[opcode "$key"]; push(@ops, $key); + $opnum{$key} = $#ops; $desc{$key} = $desc; $check{$key} = $check; $ckname{$check}++; @@ -149,7 +150,8 @@ END my $i = 0; for (@ops) { - print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n"; + # print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n"; + print ON "\t", &tab(3,"OP_\U$_"), " = ", $i++, ",\n"; } print ON "\t", &tab(3,"OP_max"), "\n"; print ON "} opcode;\n"; @@ -361,8 +363,9 @@ for my $op (@ops) { my $argshift = $OASHIFT; for my $arg (split(' ',$args{$op})) { if ($arg =~ /^F/) { - $OP_IS_SOCKET{$op} = 1 if $arg =~ s/s//; - $OP_IS_FILETEST{$op} = 1 if $arg =~ s/-//; + # record opnums of these opnames + $OP_IS_SOCKET{$op} = $opnum{$op} if $arg =~ s/s//; + $OP_IS_FILETEST{$op} = $opnum{$op} if $arg =~ s/-//; } my $argnum = ($arg =~ s/\?//) ? 8 : 0; die "op = $op, arg = $arg\n" @@ -388,18 +391,46 @@ END_EXTERN_C END -if (keys %OP_IS_SOCKET) { - print ON "\n#define OP_IS_SOCKET(op) \\\n\t("; - print ON join(" || \\\n\t ", - map { "(op) == OP_" . uc() } sort keys %OP_IS_SOCKET); - print ON ")\n\n"; -} - -if (keys %OP_IS_FILETEST) { - print ON "\n#define OP_IS_FILETEST(op) \\\n\t("; - print ON join(" || \\\n\t ", - map { "(op) == OP_" . uc() } sort keys %OP_IS_FILETEST); - print ON ")\n\n"; +# Emit OP_IS_* macros + +print ON < table. opcode.pl verifies the range contiguity. */ + +EO_OP_IS_COMMENT + +gen_op_is_macro( \%OP_IS_SOCKET, 'OP_IS_SOCKET'); +gen_op_is_macro( \%OP_IS_FILETEST, 'OP_IS_FILETEST'); + +sub gen_op_is_macro { + my ($op_is, $macname) = @_; + if (keys %$op_is) { + + # get opnames whose numbers are lowest and highest + my ($first, @rest) = sort { + $op_is->{$a} <=> $op_is->{$b} + } keys %$op_is; + + my $last = pop @rest; # @rest slurped, get its last + + # verify that op-ct matches 1st..last range (and fencepost) + # (we know there are no dups) + if ( $op_is->{$last} - $op_is->{$first} == scalar @rest + 1) { + + # contiguous ops -> optimized version + print ON "#define $macname(op) \\\n\t("; + print ON "(op) >= OP_" . uc($first) . " && (op) <= OP_" . uc($last); + print ON ")\n\n"; + } + else { + print ON "\n#define $macname(op) \\\n\t("; + print ON join(" || \\\n\t ", + map { "(op) == OP_" . uc() } sort keys %OP_IS_SOCKET); + print ON ")\n\n"; + } + } } print OC "/* ex: set ro: */\n"; @@ -883,9 +914,6 @@ sysseek sysseek ck_fun s@ F S S sysread sysread ck_fun imst@ F R S S? syswrite syswrite ck_fun imst@ F S S? S? -send send ck_fun imst@ Fs S S S? -recv recv ck_fun imst@ Fs R S S - eof eof ck_eof is% F? tell tell ck_fun st% F? seek seek ck_fun s@ F S S @@ -896,7 +924,10 @@ fcntl fcntl ck_fun st@ F S S ioctl ioctl ck_fun st@ F S S flock flock ck_fun isT@ F S -# Sockets. +# Sockets. OP_IS_SOCKET wants them consecutive (so moved 1st 2) + +send send ck_fun imst@ Fs S S S? +recv recv ck_fun imst@ Fs R S S socket socket ck_fun is@ Fs S S S sockpair socketpair ck_fun is@ Fs Fs S S S @@ -913,7 +944,7 @@ ssockopt setsockopt ck_fun is@ Fs S S S getsockname getsockname ck_fun is% Fs getpeername getpeername ck_fun is% Fs -# Stat calls. +# Stat calls. OP_IS_FILETEST wants them consecutive. lstat lstat ck_ftst u- F stat stat ck_ftst u- F diff --git a/opnames.h b/opnames.h index 4f73f1e..e4393ee 100644 --- a/opnames.h +++ b/opnames.h @@ -15,370 +15,370 @@ */ typedef enum opcode { - OP_NULL, /* 0 */ - OP_STUB, /* 1 */ - OP_SCALAR, /* 2 */ - OP_PUSHMARK, /* 3 */ - OP_WANTARRAY, /* 4 */ - OP_CONST, /* 5 */ - OP_GVSV, /* 6 */ - OP_GV, /* 7 */ - OP_GELEM, /* 8 */ - OP_PADSV, /* 9 */ - OP_PADAV, /* 10 */ - OP_PADHV, /* 11 */ - OP_PADANY, /* 12 */ - OP_PUSHRE, /* 13 */ - OP_RV2GV, /* 14 */ - OP_RV2SV, /* 15 */ - OP_AV2ARYLEN, /* 16 */ - OP_RV2CV, /* 17 */ - OP_ANONCODE, /* 18 */ - OP_PROTOTYPE, /* 19 */ - OP_REFGEN, /* 20 */ - OP_SREFGEN, /* 21 */ - OP_REF, /* 22 */ - OP_BLESS, /* 23 */ - OP_BACKTICK, /* 24 */ - OP_GLOB, /* 25 */ - OP_READLINE, /* 26 */ - OP_RCATLINE, /* 27 */ - OP_REGCMAYBE, /* 28 */ - OP_REGCRESET, /* 29 */ - OP_REGCOMP, /* 30 */ - OP_MATCH, /* 31 */ - OP_QR, /* 32 */ - OP_SUBST, /* 33 */ - OP_SUBSTCONT, /* 34 */ - OP_TRANS, /* 35 */ - OP_SASSIGN, /* 36 */ - OP_AASSIGN, /* 37 */ - OP_CHOP, /* 38 */ - OP_SCHOP, /* 39 */ - OP_CHOMP, /* 40 */ - OP_SCHOMP, /* 41 */ - OP_DEFINED, /* 42 */ - OP_UNDEF, /* 43 */ - OP_STUDY, /* 44 */ - OP_POS, /* 45 */ - OP_PREINC, /* 46 */ - OP_I_PREINC, /* 47 */ - OP_PREDEC, /* 48 */ - OP_I_PREDEC, /* 49 */ - OP_POSTINC, /* 50 */ - OP_I_POSTINC, /* 51 */ - OP_POSTDEC, /* 52 */ - OP_I_POSTDEC, /* 53 */ - OP_POW, /* 54 */ - OP_MULTIPLY, /* 55 */ - OP_I_MULTIPLY, /* 56 */ - OP_DIVIDE, /* 57 */ - OP_I_DIVIDE, /* 58 */ - OP_MODULO, /* 59 */ - OP_I_MODULO, /* 60 */ - OP_REPEAT, /* 61 */ - OP_ADD, /* 62 */ - OP_I_ADD, /* 63 */ - OP_SUBTRACT, /* 64 */ - OP_I_SUBTRACT, /* 65 */ - OP_CONCAT, /* 66 */ - OP_STRINGIFY, /* 67 */ - OP_LEFT_SHIFT, /* 68 */ - OP_RIGHT_SHIFT, /* 69 */ - OP_LT, /* 70 */ - OP_I_LT, /* 71 */ - OP_GT, /* 72 */ - OP_I_GT, /* 73 */ - OP_LE, /* 74 */ - OP_I_LE, /* 75 */ - OP_GE, /* 76 */ - OP_I_GE, /* 77 */ - OP_EQ, /* 78 */ - OP_I_EQ, /* 79 */ - OP_NE, /* 80 */ - OP_I_NE, /* 81 */ - OP_NCMP, /* 82 */ - OP_I_NCMP, /* 83 */ - OP_SLT, /* 84 */ - OP_SGT, /* 85 */ - OP_SLE, /* 86 */ - OP_SGE, /* 87 */ - OP_SEQ, /* 88 */ - OP_SNE, /* 89 */ - OP_SCMP, /* 90 */ - OP_BIT_AND, /* 91 */ - OP_BIT_XOR, /* 92 */ - OP_BIT_OR, /* 93 */ - OP_NEGATE, /* 94 */ - OP_I_NEGATE, /* 95 */ - OP_NOT, /* 96 */ - OP_COMPLEMENT, /* 97 */ - 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_AEACH, /* 130 */ - OP_AKEYS, /* 131 */ - OP_AVALUES, /* 132 */ - OP_EACH, /* 133 */ - OP_VALUES, /* 134 */ - OP_KEYS, /* 135 */ - OP_DELETE, /* 136 */ - OP_EXISTS, /* 137 */ - OP_RV2HV, /* 138 */ - OP_HELEM, /* 139 */ - OP_HSLICE, /* 140 */ - OP_UNPACK, /* 141 */ - OP_PACK, /* 142 */ - OP_SPLIT, /* 143 */ - OP_JOIN, /* 144 */ - OP_LIST, /* 145 */ - OP_LSLICE, /* 146 */ - OP_ANONLIST, /* 147 */ - OP_ANONHASH, /* 148 */ - OP_SPLICE, /* 149 */ - OP_PUSH, /* 150 */ - OP_POP, /* 151 */ - OP_SHIFT, /* 152 */ - OP_UNSHIFT, /* 153 */ - OP_SORT, /* 154 */ - OP_REVERSE, /* 155 */ - OP_GREPSTART, /* 156 */ - OP_GREPWHILE, /* 157 */ - OP_MAPSTART, /* 158 */ - OP_MAPWHILE, /* 159 */ - OP_RANGE, /* 160 */ - OP_FLIP, /* 161 */ - OP_FLOP, /* 162 */ - OP_AND, /* 163 */ - OP_OR, /* 164 */ - OP_XOR, /* 165 */ - OP_DOR, /* 166 */ - OP_COND_EXPR, /* 167 */ - OP_ANDASSIGN, /* 168 */ - OP_ORASSIGN, /* 169 */ - OP_DORASSIGN, /* 170 */ - OP_METHOD, /* 171 */ - OP_ENTERSUB, /* 172 */ - OP_LEAVESUB, /* 173 */ - OP_LEAVESUBLV, /* 174 */ - OP_CALLER, /* 175 */ - OP_WARN, /* 176 */ - OP_DIE, /* 177 */ - OP_RESET, /* 178 */ - OP_LINESEQ, /* 179 */ - OP_NEXTSTATE, /* 180 */ - OP_DBSTATE, /* 181 */ - OP_UNSTACK, /* 182 */ - OP_ENTER, /* 183 */ - OP_LEAVE, /* 184 */ - OP_SCOPE, /* 185 */ - OP_ENTERITER, /* 186 */ - OP_ITER, /* 187 */ - OP_ENTERLOOP, /* 188 */ - OP_LEAVELOOP, /* 189 */ - OP_RETURN, /* 190 */ - OP_LAST, /* 191 */ - OP_NEXT, /* 192 */ - OP_REDO, /* 193 */ - OP_DUMP, /* 194 */ - OP_GOTO, /* 195 */ - OP_EXIT, /* 196 */ - OP_METHOD_NAMED,/* 197 */ - OP_ENTERGIVEN, /* 198 */ - OP_LEAVEGIVEN, /* 199 */ - OP_ENTERWHEN, /* 200 */ - OP_LEAVEWHEN, /* 201 */ - OP_BREAK, /* 202 */ - OP_CONTINUE, /* 203 */ - OP_OPEN, /* 204 */ - OP_CLOSE, /* 205 */ - OP_PIPE_OP, /* 206 */ - OP_FILENO, /* 207 */ - OP_UMASK, /* 208 */ - OP_BINMODE, /* 209 */ - OP_TIE, /* 210 */ - OP_UNTIE, /* 211 */ - OP_TIED, /* 212 */ - OP_DBMOPEN, /* 213 */ - OP_DBMCLOSE, /* 214 */ - OP_SSELECT, /* 215 */ - OP_SELECT, /* 216 */ - OP_GETC, /* 217 */ - OP_READ, /* 218 */ - OP_ENTERWRITE, /* 219 */ - OP_LEAVEWRITE, /* 220 */ - OP_PRTF, /* 221 */ - OP_PRINT, /* 222 */ - OP_SAY, /* 223 */ - OP_SYSOPEN, /* 224 */ - OP_SYSSEEK, /* 225 */ - OP_SYSREAD, /* 226 */ - OP_SYSWRITE, /* 227 */ - OP_SEND, /* 228 */ - OP_RECV, /* 229 */ - OP_EOF, /* 230 */ - OP_TELL, /* 231 */ - OP_SEEK, /* 232 */ - OP_TRUNCATE, /* 233 */ - OP_FCNTL, /* 234 */ - OP_IOCTL, /* 235 */ - OP_FLOCK, /* 236 */ - OP_SOCKET, /* 237 */ - OP_SOCKPAIR, /* 238 */ - OP_BIND, /* 239 */ - OP_CONNECT, /* 240 */ - OP_LISTEN, /* 241 */ - OP_ACCEPT, /* 242 */ - OP_SHUTDOWN, /* 243 */ - OP_GSOCKOPT, /* 244 */ - OP_SSOCKOPT, /* 245 */ - OP_GETSOCKNAME, /* 246 */ - OP_GETPEERNAME, /* 247 */ - OP_LSTAT, /* 248 */ - OP_STAT, /* 249 */ - OP_FTRREAD, /* 250 */ - OP_FTRWRITE, /* 251 */ - OP_FTREXEC, /* 252 */ - OP_FTEREAD, /* 253 */ - OP_FTEWRITE, /* 254 */ - OP_FTEEXEC, /* 255 */ - OP_FTIS, /* 256 */ - OP_FTSIZE, /* 257 */ - OP_FTMTIME, /* 258 */ - OP_FTATIME, /* 259 */ - OP_FTCTIME, /* 260 */ - OP_FTROWNED, /* 261 */ - OP_FTEOWNED, /* 262 */ - OP_FTZERO, /* 263 */ - OP_FTSOCK, /* 264 */ - OP_FTCHR, /* 265 */ - OP_FTBLK, /* 266 */ - OP_FTFILE, /* 267 */ - OP_FTDIR, /* 268 */ - OP_FTPIPE, /* 269 */ - OP_FTSUID, /* 270 */ - OP_FTSGID, /* 271 */ - OP_FTSVTX, /* 272 */ - OP_FTLINK, /* 273 */ - OP_FTTTY, /* 274 */ - OP_FTTEXT, /* 275 */ - OP_FTBINARY, /* 276 */ - OP_CHDIR, /* 277 */ - OP_CHOWN, /* 278 */ - OP_CHROOT, /* 279 */ - OP_UNLINK, /* 280 */ - OP_CHMOD, /* 281 */ - OP_UTIME, /* 282 */ - OP_RENAME, /* 283 */ - OP_LINK, /* 284 */ - OP_SYMLINK, /* 285 */ - OP_READLINK, /* 286 */ - OP_MKDIR, /* 287 */ - OP_RMDIR, /* 288 */ - OP_OPEN_DIR, /* 289 */ - OP_READDIR, /* 290 */ - OP_TELLDIR, /* 291 */ - OP_SEEKDIR, /* 292 */ - OP_REWINDDIR, /* 293 */ - OP_CLOSEDIR, /* 294 */ - OP_FORK, /* 295 */ - OP_WAIT, /* 296 */ - OP_WAITPID, /* 297 */ - OP_SYSTEM, /* 298 */ - OP_EXEC, /* 299 */ - OP_KILL, /* 300 */ - OP_GETPPID, /* 301 */ - OP_GETPGRP, /* 302 */ - OP_SETPGRP, /* 303 */ - OP_GETPRIORITY, /* 304 */ - OP_SETPRIORITY, /* 305 */ - OP_TIME, /* 306 */ - OP_TMS, /* 307 */ - OP_LOCALTIME, /* 308 */ - OP_GMTIME, /* 309 */ - OP_ALARM, /* 310 */ - OP_SLEEP, /* 311 */ - OP_SHMGET, /* 312 */ - OP_SHMCTL, /* 313 */ - OP_SHMREAD, /* 314 */ - OP_SHMWRITE, /* 315 */ - OP_MSGGET, /* 316 */ - OP_MSGCTL, /* 317 */ - OP_MSGSND, /* 318 */ - OP_MSGRCV, /* 319 */ - OP_SEMOP, /* 320 */ - OP_SEMGET, /* 321 */ - OP_SEMCTL, /* 322 */ - OP_REQUIRE, /* 323 */ - OP_DOFILE, /* 324 */ - OP_ENTEREVAL, /* 325 */ - OP_LEAVEEVAL, /* 326 */ - OP_ENTERTRY, /* 327 */ - OP_LEAVETRY, /* 328 */ - OP_GHBYNAME, /* 329 */ - OP_GHBYADDR, /* 330 */ - OP_GHOSTENT, /* 331 */ - OP_GNBYNAME, /* 332 */ - OP_GNBYADDR, /* 333 */ - OP_GNETENT, /* 334 */ - OP_GPBYNAME, /* 335 */ - OP_GPBYNUMBER, /* 336 */ - OP_GPROTOENT, /* 337 */ - OP_GSBYNAME, /* 338 */ - OP_GSBYPORT, /* 339 */ - OP_GSERVENT, /* 340 */ - OP_SHOSTENT, /* 341 */ - OP_SNETENT, /* 342 */ - OP_SPROTOENT, /* 343 */ - OP_SSERVENT, /* 344 */ - OP_EHOSTENT, /* 345 */ - OP_ENETENT, /* 346 */ - OP_EPROTOENT, /* 347 */ - OP_ESERVENT, /* 348 */ - OP_GPWNAM, /* 349 */ - OP_GPWUID, /* 350 */ - OP_GPWENT, /* 351 */ - OP_SPWENT, /* 352 */ - OP_EPWENT, /* 353 */ - OP_GGRNAM, /* 354 */ - OP_GGRGID, /* 355 */ - OP_GGRENT, /* 356 */ - OP_SGRENT, /* 357 */ - OP_EGRENT, /* 358 */ - OP_GETLOGIN, /* 359 */ - OP_SYSCALL, /* 360 */ - OP_LOCK, /* 361 */ - OP_ONCE, /* 362 */ - OP_CUSTOM, /* 363 */ + OP_NULL = 0, + OP_STUB = 1, + OP_SCALAR = 2, + OP_PUSHMARK = 3, + OP_WANTARRAY = 4, + OP_CONST = 5, + OP_GVSV = 6, + OP_GV = 7, + OP_GELEM = 8, + OP_PADSV = 9, + OP_PADAV = 10, + OP_PADHV = 11, + OP_PADANY = 12, + OP_PUSHRE = 13, + OP_RV2GV = 14, + OP_RV2SV = 15, + OP_AV2ARYLEN = 16, + OP_RV2CV = 17, + OP_ANONCODE = 18, + OP_PROTOTYPE = 19, + OP_REFGEN = 20, + OP_SREFGEN = 21, + OP_REF = 22, + OP_BLESS = 23, + OP_BACKTICK = 24, + OP_GLOB = 25, + OP_READLINE = 26, + OP_RCATLINE = 27, + OP_REGCMAYBE = 28, + OP_REGCRESET = 29, + OP_REGCOMP = 30, + OP_MATCH = 31, + OP_QR = 32, + OP_SUBST = 33, + OP_SUBSTCONT = 34, + OP_TRANS = 35, + OP_SASSIGN = 36, + OP_AASSIGN = 37, + OP_CHOP = 38, + OP_SCHOP = 39, + OP_CHOMP = 40, + OP_SCHOMP = 41, + OP_DEFINED = 42, + OP_UNDEF = 43, + OP_STUDY = 44, + OP_POS = 45, + OP_PREINC = 46, + OP_I_PREINC = 47, + OP_PREDEC = 48, + OP_I_PREDEC = 49, + OP_POSTINC = 50, + OP_I_POSTINC = 51, + OP_POSTDEC = 52, + OP_I_POSTDEC = 53, + OP_POW = 54, + OP_MULTIPLY = 55, + OP_I_MULTIPLY = 56, + OP_DIVIDE = 57, + OP_I_DIVIDE = 58, + OP_MODULO = 59, + OP_I_MODULO = 60, + OP_REPEAT = 61, + OP_ADD = 62, + OP_I_ADD = 63, + OP_SUBTRACT = 64, + OP_I_SUBTRACT = 65, + OP_CONCAT = 66, + OP_STRINGIFY = 67, + OP_LEFT_SHIFT = 68, + OP_RIGHT_SHIFT = 69, + OP_LT = 70, + OP_I_LT = 71, + OP_GT = 72, + OP_I_GT = 73, + OP_LE = 74, + OP_I_LE = 75, + OP_GE = 76, + OP_I_GE = 77, + OP_EQ = 78, + OP_I_EQ = 79, + OP_NE = 80, + OP_I_NE = 81, + OP_NCMP = 82, + OP_I_NCMP = 83, + OP_SLT = 84, + OP_SGT = 85, + OP_SLE = 86, + OP_SGE = 87, + OP_SEQ = 88, + OP_SNE = 89, + OP_SCMP = 90, + OP_BIT_AND = 91, + OP_BIT_XOR = 92, + OP_BIT_OR = 93, + OP_NEGATE = 94, + OP_I_NEGATE = 95, + OP_NOT = 96, + OP_COMPLEMENT = 97, + 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_AEACH = 130, + OP_AKEYS = 131, + OP_AVALUES = 132, + OP_EACH = 133, + OP_VALUES = 134, + OP_KEYS = 135, + OP_DELETE = 136, + OP_EXISTS = 137, + OP_RV2HV = 138, + OP_HELEM = 139, + OP_HSLICE = 140, + OP_UNPACK = 141, + OP_PACK = 142, + OP_SPLIT = 143, + OP_JOIN = 144, + OP_LIST = 145, + OP_LSLICE = 146, + OP_ANONLIST = 147, + OP_ANONHASH = 148, + OP_SPLICE = 149, + OP_PUSH = 150, + OP_POP = 151, + OP_SHIFT = 152, + OP_UNSHIFT = 153, + OP_SORT = 154, + OP_REVERSE = 155, + OP_GREPSTART = 156, + OP_GREPWHILE = 157, + OP_MAPSTART = 158, + OP_MAPWHILE = 159, + OP_RANGE = 160, + OP_FLIP = 161, + OP_FLOP = 162, + OP_AND = 163, + OP_OR = 164, + OP_XOR = 165, + OP_DOR = 166, + OP_COND_EXPR = 167, + OP_ANDASSIGN = 168, + OP_ORASSIGN = 169, + OP_DORASSIGN = 170, + OP_METHOD = 171, + OP_ENTERSUB = 172, + OP_LEAVESUB = 173, + OP_LEAVESUBLV = 174, + OP_CALLER = 175, + OP_WARN = 176, + OP_DIE = 177, + OP_RESET = 178, + OP_LINESEQ = 179, + OP_NEXTSTATE = 180, + OP_DBSTATE = 181, + OP_UNSTACK = 182, + OP_ENTER = 183, + OP_LEAVE = 184, + OP_SCOPE = 185, + OP_ENTERITER = 186, + OP_ITER = 187, + OP_ENTERLOOP = 188, + OP_LEAVELOOP = 189, + OP_RETURN = 190, + OP_LAST = 191, + OP_NEXT = 192, + OP_REDO = 193, + OP_DUMP = 194, + OP_GOTO = 195, + OP_EXIT = 196, + OP_METHOD_NAMED = 197, + OP_ENTERGIVEN = 198, + OP_LEAVEGIVEN = 199, + OP_ENTERWHEN = 200, + OP_LEAVEWHEN = 201, + OP_BREAK = 202, + OP_CONTINUE = 203, + OP_OPEN = 204, + OP_CLOSE = 205, + OP_PIPE_OP = 206, + OP_FILENO = 207, + OP_UMASK = 208, + OP_BINMODE = 209, + OP_TIE = 210, + OP_UNTIE = 211, + OP_TIED = 212, + OP_DBMOPEN = 213, + OP_DBMCLOSE = 214, + OP_SSELECT = 215, + OP_SELECT = 216, + OP_GETC = 217, + OP_READ = 218, + OP_ENTERWRITE = 219, + OP_LEAVEWRITE = 220, + OP_PRTF = 221, + OP_PRINT = 222, + OP_SAY = 223, + OP_SYSOPEN = 224, + OP_SYSSEEK = 225, + OP_SYSREAD = 226, + OP_SYSWRITE = 227, + OP_EOF = 228, + OP_TELL = 229, + OP_SEEK = 230, + OP_TRUNCATE = 231, + OP_FCNTL = 232, + OP_IOCTL = 233, + OP_FLOCK = 234, + OP_SEND = 235, + OP_RECV = 236, + OP_SOCKET = 237, + OP_SOCKPAIR = 238, + OP_BIND = 239, + OP_CONNECT = 240, + OP_LISTEN = 241, + OP_ACCEPT = 242, + OP_SHUTDOWN = 243, + OP_GSOCKOPT = 244, + OP_SSOCKOPT = 245, + OP_GETSOCKNAME = 246, + OP_GETPEERNAME = 247, + OP_LSTAT = 248, + OP_STAT = 249, + OP_FTRREAD = 250, + OP_FTRWRITE = 251, + OP_FTREXEC = 252, + OP_FTEREAD = 253, + OP_FTEWRITE = 254, + OP_FTEEXEC = 255, + OP_FTIS = 256, + OP_FTSIZE = 257, + OP_FTMTIME = 258, + OP_FTATIME = 259, + OP_FTCTIME = 260, + OP_FTROWNED = 261, + OP_FTEOWNED = 262, + OP_FTZERO = 263, + OP_FTSOCK = 264, + OP_FTCHR = 265, + OP_FTBLK = 266, + OP_FTFILE = 267, + OP_FTDIR = 268, + OP_FTPIPE = 269, + OP_FTSUID = 270, + OP_FTSGID = 271, + OP_FTSVTX = 272, + OP_FTLINK = 273, + OP_FTTTY = 274, + OP_FTTEXT = 275, + OP_FTBINARY = 276, + OP_CHDIR = 277, + OP_CHOWN = 278, + OP_CHROOT = 279, + OP_UNLINK = 280, + OP_CHMOD = 281, + OP_UTIME = 282, + OP_RENAME = 283, + OP_LINK = 284, + OP_SYMLINK = 285, + OP_READLINK = 286, + OP_MKDIR = 287, + OP_RMDIR = 288, + OP_OPEN_DIR = 289, + OP_READDIR = 290, + OP_TELLDIR = 291, + OP_SEEKDIR = 292, + OP_REWINDDIR = 293, + OP_CLOSEDIR = 294, + OP_FORK = 295, + OP_WAIT = 296, + OP_WAITPID = 297, + OP_SYSTEM = 298, + OP_EXEC = 299, + OP_KILL = 300, + OP_GETPPID = 301, + OP_GETPGRP = 302, + OP_SETPGRP = 303, + OP_GETPRIORITY = 304, + OP_SETPRIORITY = 305, + OP_TIME = 306, + OP_TMS = 307, + OP_LOCALTIME = 308, + OP_GMTIME = 309, + OP_ALARM = 310, + OP_SLEEP = 311, + OP_SHMGET = 312, + OP_SHMCTL = 313, + OP_SHMREAD = 314, + OP_SHMWRITE = 315, + OP_MSGGET = 316, + OP_MSGCTL = 317, + OP_MSGSND = 318, + OP_MSGRCV = 319, + OP_SEMOP = 320, + OP_SEMGET = 321, + OP_SEMCTL = 322, + OP_REQUIRE = 323, + OP_DOFILE = 324, + OP_ENTEREVAL = 325, + OP_LEAVEEVAL = 326, + OP_ENTERTRY = 327, + OP_LEAVETRY = 328, + OP_GHBYNAME = 329, + OP_GHBYADDR = 330, + OP_GHOSTENT = 331, + OP_GNBYNAME = 332, + OP_GNBYADDR = 333, + OP_GNETENT = 334, + OP_GPBYNAME = 335, + OP_GPBYNUMBER = 336, + OP_GPROTOENT = 337, + OP_GSBYNAME = 338, + OP_GSBYPORT = 339, + OP_GSERVENT = 340, + OP_SHOSTENT = 341, + OP_SNETENT = 342, + OP_SPROTOENT = 343, + OP_SSERVENT = 344, + OP_EHOSTENT = 345, + OP_ENETENT = 346, + OP_EPROTOENT = 347, + OP_ESERVENT = 348, + OP_GPWNAM = 349, + OP_GPWUID = 350, + OP_GPWENT = 351, + OP_SPWENT = 352, + OP_EPWENT = 353, + OP_GGRNAM = 354, + OP_GGRGID = 355, + OP_GGRENT = 356, + OP_SGRENT = 357, + OP_EGRENT = 358, + OP_GETLOGIN = 359, + OP_SYSCALL = 360, + OP_LOCK = 361, + OP_ONCE = 362, + OP_CUSTOM = 363, OP_max } opcode; @@ -387,49 +387,14 @@ typedef enum opcode { #define OP_phoney_OUTPUT_ONLY -2 -#define OP_IS_SOCKET(op) \ - ((op) == OP_ACCEPT || \ - (op) == OP_BIND || \ - (op) == OP_CONNECT || \ - (op) == OP_GETPEERNAME || \ - (op) == OP_GETSOCKNAME || \ - (op) == OP_GSOCKOPT || \ - (op) == OP_LISTEN || \ - (op) == OP_RECV || \ - (op) == OP_SEND || \ - (op) == OP_SHUTDOWN || \ - (op) == OP_SOCKET || \ - (op) == OP_SOCKPAIR || \ - (op) == OP_SSOCKOPT) +/* the OP_IS_(SOCKET|FILETEST) macros are optimized to a simple range + check because all the member OPs are contiguous in opcode.pl + table. opcode.pl verifies the range contiguity. */ +#define OP_IS_SOCKET(op) \ + ((op) >= OP_SEND && (op) <= OP_GETPEERNAME) #define OP_IS_FILETEST(op) \ - ((op) == OP_FTATIME || \ - (op) == OP_FTBINARY || \ - (op) == OP_FTBLK || \ - (op) == OP_FTCHR || \ - (op) == OP_FTCTIME || \ - (op) == OP_FTDIR || \ - (op) == OP_FTEEXEC || \ - (op) == OP_FTEOWNED || \ - (op) == OP_FTEREAD || \ - (op) == OP_FTEWRITE || \ - (op) == OP_FTFILE || \ - (op) == OP_FTIS || \ - (op) == OP_FTLINK || \ - (op) == OP_FTMTIME || \ - (op) == OP_FTPIPE || \ - (op) == OP_FTREXEC || \ - (op) == OP_FTROWNED || \ - (op) == OP_FTRREAD || \ - (op) == OP_FTRWRITE || \ - (op) == OP_FTSGID || \ - (op) == OP_FTSIZE || \ - (op) == OP_FTSOCK || \ - (op) == OP_FTSUID || \ - (op) == OP_FTSVTX || \ - (op) == OP_FTTEXT || \ - (op) == OP_FTTTY || \ - (op) == OP_FTZERO) + ((op) >= OP_FTRREAD && (op) <= OP_FTBINARY) /* ex: set ro: */ diff --git a/pp.sym b/pp.sym index d6c28f4..c3159c5 100644 --- a/pp.sym +++ b/pp.sym @@ -273,8 +273,6 @@ Perl_pp_sysopen Perl_pp_sysseek Perl_pp_sysread Perl_pp_syswrite -Perl_pp_send -Perl_pp_recv Perl_pp_eof Perl_pp_tell Perl_pp_seek @@ -282,6 +280,8 @@ Perl_pp_truncate Perl_pp_fcntl Perl_pp_ioctl Perl_pp_flock +Perl_pp_send +Perl_pp_recv Perl_pp_socket Perl_pp_sockpair Perl_pp_bind diff --git a/pp_proto.h b/pp_proto.h index 13cb3cc..6a43521 100644 --- a/pp_proto.h +++ b/pp_proto.h @@ -274,8 +274,6 @@ PERL_PPDEF(Perl_pp_sysopen) PERL_PPDEF(Perl_pp_sysseek) PERL_PPDEF(Perl_pp_sysread) PERL_PPDEF(Perl_pp_syswrite) -PERL_PPDEF(Perl_pp_send) -PERL_PPDEF(Perl_pp_recv) PERL_PPDEF(Perl_pp_eof) PERL_PPDEF(Perl_pp_tell) PERL_PPDEF(Perl_pp_seek) @@ -283,6 +281,8 @@ PERL_PPDEF(Perl_pp_truncate) PERL_PPDEF(Perl_pp_fcntl) PERL_PPDEF(Perl_pp_ioctl) PERL_PPDEF(Perl_pp_flock) +PERL_PPDEF(Perl_pp_send) +PERL_PPDEF(Perl_pp_recv) PERL_PPDEF(Perl_pp_socket) PERL_PPDEF(Perl_pp_sockpair) PERL_PPDEF(Perl_pp_bind)