summaryrefslogtreecommitdiff
path: root/opnames.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2017-08-08 18:42:14 +0100
committerDavid Mitchell <davem@iabyn.com>2017-10-31 15:31:26 +0000
commite839e6ed99c6b25aee589f56bb58de2f8fa00f41 (patch)
tree30bab03fdd8e73c4cb6e5b2d33ab1f428693a3a8 /opnames.h
parentc0acf911f65b2badbd72efa28edb2d197639a51b (diff)
downloadperl-e839e6ed99c6b25aee589f56bb58de2f8fa00f41.tar.gz
Add OP_MULTICONCAT op
Allow multiple OP_CONCAT, OP_CONST ops, plus optionally an OP_SASSIGN or OP_STRINGIFY, to be combined into a single OP_MULTICONCAT op, which can make things a *lot* faster: 4x or more. In more detail: it will optimise into a single OP_MULTICONCAT, most expressions of the form LHS RHS where LHS is one of (empty) my $lexical = $lexical = $lexical .= expression = expression .= and RHS is one of (A . B . C . ...) where A,B,C etc are expressions and/or string constants "aAbBc..." where a,A,b,B etc are expressions and/or string constants sprintf "..%s..%s..", A,B,.. where the format is a constant string containing only '%s' and '%%' elements, and A,B, etc are scalar expressions (so only a fixed, compile-time-known number of args: no arrays or list context function calls etc) It doesn't optimise other forms, such as ($a . $b) . ($c. $d) ((($a .= $b) .= $c) .= $d); (although sub-parts of those expressions might be converted to an OP_MULTICONCAT). This is partly because it would be hard to maintain the correct ordering of tie or overload calls. The compiler uses heuristics to determine when to convert: in general, expressions involving a single OP_CONCAT aren't converted, unless some other saving can be made, for example if an OP_CONST can be eliminated, or in the presence of 'my $x = .. ' which OP_MULTICONCAT can apply OPpTARGET_MY to, but OP_CONST can't. The multiconcat op is of type UNOP_AUX, with the op_aux structure directly holding a pointer to a single constant char* string plus a list of segment lengths. So for "a=$a b=$b\n"; the constant string is "a= b=\n", and the segment lengths are (2,3,1). If the constant string has different non-utf8 and utf8 representations (such as "\x80") then both variants are pre-computed and stored in the aux struct, along with two sets of segment lengths. For all the above LHS types, any SASSIGN op is optimised away. For a LHS of '$lex=', '$lex.=' or 'my $lex=', the PADSV is optimised away too. For example where $a and $b are lexical vars, this statement: my $c = "a=$a, b=$b\n"; formerly compiled to const[PV "a="] s padsv[$a:1,3] s concat[t4] sK/2 const[PV ", b="] s concat[t5] sKS/2 padsv[$b:1,3] s concat[t6] sKS/2 const[PV "\n"] s concat[t7] sKS/2 padsv[$c:2,3] sRM*/LVINTRO sassign vKS/2 and now compiles to: padsv[$a:1,3] s padsv[$b:1,3] s multiconcat("a=, b=\n",2,4,1)[$c:2,3] vK/LVINTRO,TARGMY,STRINGIFY In terms of how much faster it is, this code: my $a = "the quick brown fox jumps over the lazy dog"; my $b = "to be, or not to be; sorry, what was the question again?"; for my $i (1..10_000_000) { my $c = "a=$a, b=$b\n"; } runs 2.7 times faster, and if you throw utf8 mixtures in it gets even better. This loop runs 4 times faster: my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"; for my $i (1..10_000_000) { $s = "\x{100}wxyz"; $s .= "foo=$a bar=$b baz=$c"; } The main ways in which OP_MULTICONCAT gains its speed are: * any OP_CONSTs are eliminated, and the constant bits (already in the right encoding) are copied directly from the constant string attached to the op's aux structure. * It optimises away any SASSIGN op, and possibly a PADSV op on the LHS, in all cases; OP_CONCAT only did this in very limited circumstances. * Because it has a holistic view of the entire concatenation expression, it can do the whole thing in one efficient go, rather than creating and copying intermediate results. pp_multiconcat() goes to considerable efforts to avoid inefficiencies. For example it will only SvGROW() the target once, and to the exact size needed, no matter what mix of utf8 and non-utf8 appear on the LHS and RHS. It never allocates any temporary SVs except possibly in the case of tie or overloading. * It does all its own appending and utf8 handling rather than calling out to functions like sv_catsv(). * It's very good at handling the LHS appearing on the RHS; for example in $x = "abcd"; $x = "-$x-$x-"; It will do roughly the equivalent of the following (where targ is $x); SvPV_force(targ); SvGROW(targ, 11); p = SvPVX(targ); Move(p, p+1, 4, char); Copy("-", p, 1, char); Copy("-", p+5, 1, char); Copy(p+1, p+6, 4, char); Copy("-", p+10, 1, char); SvCUR(targ) = 11; p[11] = '\0'; Formerly, pp_concat would have used multiple PADTMPs or temporary SVs to handle situations like that. The code is quite big; both S_maybe_multiconcat() and pp_multiconcat() (the main compile-time and runtime parts of the implementation) are over 700 lines each. It turns out that when you combine multiple ops, the number of edge cases grows exponentially ;-)
Diffstat (limited to 'opnames.h')
-rw-r--r--opnames.h661
1 files changed, 331 insertions, 330 deletions
diff --git a/opnames.h b/opnames.h
index 55b6b4266b..d87ba88f01 100644
--- a/opnames.h
+++ b/opnames.h
@@ -81,339 +81,340 @@ typedef enum opcode {
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_NBIT_AND = 94,
- OP_NBIT_XOR = 95,
- OP_NBIT_OR = 96,
- OP_SBIT_AND = 97,
- OP_SBIT_XOR = 98,
- OP_SBIT_OR = 99,
- OP_NEGATE = 100,
- OP_I_NEGATE = 101,
- OP_NOT = 102,
- OP_COMPLEMENT = 103,
- OP_NCOMPLEMENT = 104,
- OP_SCOMPLEMENT = 105,
- OP_SMARTMATCH = 106,
- OP_ATAN2 = 107,
- OP_SIN = 108,
- OP_COS = 109,
- OP_RAND = 110,
- OP_SRAND = 111,
- OP_EXP = 112,
- OP_LOG = 113,
- OP_SQRT = 114,
- OP_INT = 115,
- OP_HEX = 116,
- OP_OCT = 117,
- OP_ABS = 118,
- OP_LENGTH = 119,
- OP_SUBSTR = 120,
- OP_VEC = 121,
- OP_INDEX = 122,
- OP_RINDEX = 123,
- OP_SPRINTF = 124,
- OP_FORMLINE = 125,
- OP_ORD = 126,
- OP_CHR = 127,
- OP_CRYPT = 128,
- OP_UCFIRST = 129,
- OP_LCFIRST = 130,
- OP_UC = 131,
- OP_LC = 132,
- OP_QUOTEMETA = 133,
- OP_RV2AV = 134,
- OP_AELEMFAST = 135,
- OP_AELEMFAST_LEX = 136,
- OP_AELEM = 137,
- OP_ASLICE = 138,
- OP_KVASLICE = 139,
- OP_AEACH = 140,
- OP_AVALUES = 141,
- OP_AKEYS = 142,
- OP_EACH = 143,
- OP_VALUES = 144,
- OP_KEYS = 145,
- OP_DELETE = 146,
- OP_EXISTS = 147,
- OP_RV2HV = 148,
- OP_HELEM = 149,
- OP_HSLICE = 150,
- OP_KVHSLICE = 151,
- OP_MULTIDEREF = 152,
- OP_UNPACK = 153,
- OP_PACK = 154,
- OP_SPLIT = 155,
- OP_JOIN = 156,
- OP_LIST = 157,
- OP_LSLICE = 158,
- OP_ANONLIST = 159,
- OP_ANONHASH = 160,
- OP_SPLICE = 161,
- OP_PUSH = 162,
- OP_POP = 163,
- OP_SHIFT = 164,
- OP_UNSHIFT = 165,
- OP_SORT = 166,
- OP_REVERSE = 167,
- OP_GREPSTART = 168,
- OP_GREPWHILE = 169,
- OP_MAPSTART = 170,
- OP_MAPWHILE = 171,
- OP_RANGE = 172,
- OP_FLIP = 173,
- OP_FLOP = 174,
- OP_AND = 175,
- OP_OR = 176,
- OP_XOR = 177,
- OP_DOR = 178,
- OP_COND_EXPR = 179,
- OP_ANDASSIGN = 180,
- OP_ORASSIGN = 181,
- OP_DORASSIGN = 182,
- OP_ENTERSUB = 183,
- OP_LEAVESUB = 184,
- OP_LEAVESUBLV = 185,
- OP_ARGCHECK = 186,
- OP_ARGELEM = 187,
- OP_ARGDEFELEM = 188,
- OP_CALLER = 189,
- OP_WARN = 190,
- OP_DIE = 191,
- OP_RESET = 192,
- OP_LINESEQ = 193,
- OP_NEXTSTATE = 194,
- OP_DBSTATE = 195,
- OP_UNSTACK = 196,
- OP_ENTER = 197,
- OP_LEAVE = 198,
- OP_SCOPE = 199,
- OP_ENTERITER = 200,
- OP_ITER = 201,
- OP_ENTERLOOP = 202,
- OP_LEAVELOOP = 203,
- OP_RETURN = 204,
- OP_LAST = 205,
- OP_NEXT = 206,
- OP_REDO = 207,
- OP_DUMP = 208,
- OP_GOTO = 209,
- OP_EXIT = 210,
- OP_METHOD = 211,
- OP_METHOD_NAMED = 212,
- OP_METHOD_SUPER = 213,
- OP_METHOD_REDIR = 214,
- OP_METHOD_REDIR_SUPER = 215,
- OP_ENTERGIVEN = 216,
- OP_LEAVEGIVEN = 217,
- OP_ENTERWHEN = 218,
- OP_LEAVEWHEN = 219,
- OP_BREAK = 220,
- OP_CONTINUE = 221,
- OP_OPEN = 222,
- OP_CLOSE = 223,
- OP_PIPE_OP = 224,
- OP_FILENO = 225,
- OP_UMASK = 226,
- OP_BINMODE = 227,
- OP_TIE = 228,
- OP_UNTIE = 229,
- OP_TIED = 230,
- OP_DBMOPEN = 231,
- OP_DBMCLOSE = 232,
- OP_SSELECT = 233,
- OP_SELECT = 234,
- OP_GETC = 235,
- OP_READ = 236,
- OP_ENTERWRITE = 237,
- OP_LEAVEWRITE = 238,
- OP_PRTF = 239,
- OP_PRINT = 240,
- OP_SAY = 241,
- OP_SYSOPEN = 242,
- OP_SYSSEEK = 243,
- OP_SYSREAD = 244,
- OP_SYSWRITE = 245,
- OP_EOF = 246,
- OP_TELL = 247,
- OP_SEEK = 248,
- OP_TRUNCATE = 249,
- OP_FCNTL = 250,
- OP_IOCTL = 251,
- OP_FLOCK = 252,
- OP_SEND = 253,
- OP_RECV = 254,
- OP_SOCKET = 255,
- OP_SOCKPAIR = 256,
- OP_BIND = 257,
- OP_CONNECT = 258,
- OP_LISTEN = 259,
- OP_ACCEPT = 260,
- OP_SHUTDOWN = 261,
- OP_GSOCKOPT = 262,
- OP_SSOCKOPT = 263,
- OP_GETSOCKNAME = 264,
- OP_GETPEERNAME = 265,
- OP_LSTAT = 266,
- OP_STAT = 267,
- OP_FTRREAD = 268,
- OP_FTRWRITE = 269,
- OP_FTREXEC = 270,
- OP_FTEREAD = 271,
- OP_FTEWRITE = 272,
- OP_FTEEXEC = 273,
- OP_FTIS = 274,
- OP_FTSIZE = 275,
- OP_FTMTIME = 276,
- OP_FTATIME = 277,
- OP_FTCTIME = 278,
- OP_FTROWNED = 279,
- OP_FTEOWNED = 280,
- OP_FTZERO = 281,
- OP_FTSOCK = 282,
- OP_FTCHR = 283,
- OP_FTBLK = 284,
- OP_FTFILE = 285,
- OP_FTDIR = 286,
- OP_FTPIPE = 287,
- OP_FTSUID = 288,
- OP_FTSGID = 289,
- OP_FTSVTX = 290,
- OP_FTLINK = 291,
- OP_FTTTY = 292,
- OP_FTTEXT = 293,
- OP_FTBINARY = 294,
- OP_CHDIR = 295,
- OP_CHOWN = 296,
- OP_CHROOT = 297,
- OP_UNLINK = 298,
- OP_CHMOD = 299,
- OP_UTIME = 300,
- OP_RENAME = 301,
- OP_LINK = 302,
- OP_SYMLINK = 303,
- OP_READLINK = 304,
- OP_MKDIR = 305,
- OP_RMDIR = 306,
- OP_OPEN_DIR = 307,
- OP_READDIR = 308,
- OP_TELLDIR = 309,
- OP_SEEKDIR = 310,
- OP_REWINDDIR = 311,
- OP_CLOSEDIR = 312,
- OP_FORK = 313,
- OP_WAIT = 314,
- OP_WAITPID = 315,
- OP_SYSTEM = 316,
- OP_EXEC = 317,
- OP_KILL = 318,
- OP_GETPPID = 319,
- OP_GETPGRP = 320,
- OP_SETPGRP = 321,
- OP_GETPRIORITY = 322,
- OP_SETPRIORITY = 323,
- OP_TIME = 324,
- OP_TMS = 325,
- OP_LOCALTIME = 326,
- OP_GMTIME = 327,
- OP_ALARM = 328,
- OP_SLEEP = 329,
- OP_SHMGET = 330,
- OP_SHMCTL = 331,
- OP_SHMREAD = 332,
- OP_SHMWRITE = 333,
- OP_MSGGET = 334,
- OP_MSGCTL = 335,
- OP_MSGSND = 336,
- OP_MSGRCV = 337,
- OP_SEMOP = 338,
- OP_SEMGET = 339,
- OP_SEMCTL = 340,
- OP_REQUIRE = 341,
- OP_DOFILE = 342,
- OP_HINTSEVAL = 343,
- OP_ENTEREVAL = 344,
- OP_LEAVEEVAL = 345,
- OP_ENTERTRY = 346,
- OP_LEAVETRY = 347,
- OP_GHBYNAME = 348,
- OP_GHBYADDR = 349,
- OP_GHOSTENT = 350,
- OP_GNBYNAME = 351,
- OP_GNBYADDR = 352,
- OP_GNETENT = 353,
- OP_GPBYNAME = 354,
- OP_GPBYNUMBER = 355,
- OP_GPROTOENT = 356,
- OP_GSBYNAME = 357,
- OP_GSBYPORT = 358,
- OP_GSERVENT = 359,
- OP_SHOSTENT = 360,
- OP_SNETENT = 361,
- OP_SPROTOENT = 362,
- OP_SSERVENT = 363,
- OP_EHOSTENT = 364,
- OP_ENETENT = 365,
- OP_EPROTOENT = 366,
- OP_ESERVENT = 367,
- OP_GPWNAM = 368,
- OP_GPWUID = 369,
- OP_GPWENT = 370,
- OP_SPWENT = 371,
- OP_EPWENT = 372,
- OP_GGRNAM = 373,
- OP_GGRGID = 374,
- OP_GGRENT = 375,
- OP_SGRENT = 376,
- OP_EGRENT = 377,
- OP_GETLOGIN = 378,
- OP_SYSCALL = 379,
- OP_LOCK = 380,
- OP_ONCE = 381,
- OP_CUSTOM = 382,
- OP_COREARGS = 383,
- OP_AVHVSWITCH = 384,
- OP_RUNCV = 385,
- OP_FC = 386,
- OP_PADCV = 387,
- OP_INTROCV = 388,
- OP_CLONECV = 389,
- OP_PADRANGE = 390,
- OP_REFASSIGN = 391,
- OP_LVREF = 392,
- OP_LVREFSLICE = 393,
- OP_LVAVREF = 394,
- OP_ANONCONST = 395,
+ OP_MULTICONCAT = 67,
+ OP_STRINGIFY = 68,
+ OP_LEFT_SHIFT = 69,
+ OP_RIGHT_SHIFT = 70,
+ OP_LT = 71,
+ OP_I_LT = 72,
+ OP_GT = 73,
+ OP_I_GT = 74,
+ OP_LE = 75,
+ OP_I_LE = 76,
+ OP_GE = 77,
+ OP_I_GE = 78,
+ OP_EQ = 79,
+ OP_I_EQ = 80,
+ OP_NE = 81,
+ OP_I_NE = 82,
+ OP_NCMP = 83,
+ OP_I_NCMP = 84,
+ OP_SLT = 85,
+ OP_SGT = 86,
+ OP_SLE = 87,
+ OP_SGE = 88,
+ OP_SEQ = 89,
+ OP_SNE = 90,
+ OP_SCMP = 91,
+ OP_BIT_AND = 92,
+ OP_BIT_XOR = 93,
+ OP_BIT_OR = 94,
+ OP_NBIT_AND = 95,
+ OP_NBIT_XOR = 96,
+ OP_NBIT_OR = 97,
+ OP_SBIT_AND = 98,
+ OP_SBIT_XOR = 99,
+ OP_SBIT_OR = 100,
+ OP_NEGATE = 101,
+ OP_I_NEGATE = 102,
+ OP_NOT = 103,
+ OP_COMPLEMENT = 104,
+ OP_NCOMPLEMENT = 105,
+ OP_SCOMPLEMENT = 106,
+ OP_SMARTMATCH = 107,
+ OP_ATAN2 = 108,
+ OP_SIN = 109,
+ OP_COS = 110,
+ OP_RAND = 111,
+ OP_SRAND = 112,
+ OP_EXP = 113,
+ OP_LOG = 114,
+ OP_SQRT = 115,
+ OP_INT = 116,
+ OP_HEX = 117,
+ OP_OCT = 118,
+ OP_ABS = 119,
+ OP_LENGTH = 120,
+ OP_SUBSTR = 121,
+ OP_VEC = 122,
+ OP_INDEX = 123,
+ OP_RINDEX = 124,
+ OP_SPRINTF = 125,
+ OP_FORMLINE = 126,
+ OP_ORD = 127,
+ OP_CHR = 128,
+ OP_CRYPT = 129,
+ OP_UCFIRST = 130,
+ OP_LCFIRST = 131,
+ OP_UC = 132,
+ OP_LC = 133,
+ OP_QUOTEMETA = 134,
+ OP_RV2AV = 135,
+ OP_AELEMFAST = 136,
+ OP_AELEMFAST_LEX = 137,
+ OP_AELEM = 138,
+ OP_ASLICE = 139,
+ OP_KVASLICE = 140,
+ OP_AEACH = 141,
+ OP_AVALUES = 142,
+ OP_AKEYS = 143,
+ OP_EACH = 144,
+ OP_VALUES = 145,
+ OP_KEYS = 146,
+ OP_DELETE = 147,
+ OP_EXISTS = 148,
+ OP_RV2HV = 149,
+ OP_HELEM = 150,
+ OP_HSLICE = 151,
+ OP_KVHSLICE = 152,
+ OP_MULTIDEREF = 153,
+ OP_UNPACK = 154,
+ OP_PACK = 155,
+ OP_SPLIT = 156,
+ OP_JOIN = 157,
+ OP_LIST = 158,
+ OP_LSLICE = 159,
+ OP_ANONLIST = 160,
+ OP_ANONHASH = 161,
+ OP_SPLICE = 162,
+ OP_PUSH = 163,
+ OP_POP = 164,
+ OP_SHIFT = 165,
+ OP_UNSHIFT = 166,
+ OP_SORT = 167,
+ OP_REVERSE = 168,
+ OP_GREPSTART = 169,
+ OP_GREPWHILE = 170,
+ OP_MAPSTART = 171,
+ OP_MAPWHILE = 172,
+ OP_RANGE = 173,
+ OP_FLIP = 174,
+ OP_FLOP = 175,
+ OP_AND = 176,
+ OP_OR = 177,
+ OP_XOR = 178,
+ OP_DOR = 179,
+ OP_COND_EXPR = 180,
+ OP_ANDASSIGN = 181,
+ OP_ORASSIGN = 182,
+ OP_DORASSIGN = 183,
+ OP_ENTERSUB = 184,
+ OP_LEAVESUB = 185,
+ OP_LEAVESUBLV = 186,
+ OP_ARGCHECK = 187,
+ OP_ARGELEM = 188,
+ OP_ARGDEFELEM = 189,
+ OP_CALLER = 190,
+ OP_WARN = 191,
+ OP_DIE = 192,
+ OP_RESET = 193,
+ OP_LINESEQ = 194,
+ OP_NEXTSTATE = 195,
+ OP_DBSTATE = 196,
+ OP_UNSTACK = 197,
+ OP_ENTER = 198,
+ OP_LEAVE = 199,
+ OP_SCOPE = 200,
+ OP_ENTERITER = 201,
+ OP_ITER = 202,
+ OP_ENTERLOOP = 203,
+ OP_LEAVELOOP = 204,
+ OP_RETURN = 205,
+ OP_LAST = 206,
+ OP_NEXT = 207,
+ OP_REDO = 208,
+ OP_DUMP = 209,
+ OP_GOTO = 210,
+ OP_EXIT = 211,
+ OP_METHOD = 212,
+ OP_METHOD_NAMED = 213,
+ OP_METHOD_SUPER = 214,
+ OP_METHOD_REDIR = 215,
+ OP_METHOD_REDIR_SUPER = 216,
+ OP_ENTERGIVEN = 217,
+ OP_LEAVEGIVEN = 218,
+ OP_ENTERWHEN = 219,
+ OP_LEAVEWHEN = 220,
+ OP_BREAK = 221,
+ OP_CONTINUE = 222,
+ OP_OPEN = 223,
+ OP_CLOSE = 224,
+ OP_PIPE_OP = 225,
+ OP_FILENO = 226,
+ OP_UMASK = 227,
+ OP_BINMODE = 228,
+ OP_TIE = 229,
+ OP_UNTIE = 230,
+ OP_TIED = 231,
+ OP_DBMOPEN = 232,
+ OP_DBMCLOSE = 233,
+ OP_SSELECT = 234,
+ OP_SELECT = 235,
+ OP_GETC = 236,
+ OP_READ = 237,
+ OP_ENTERWRITE = 238,
+ OP_LEAVEWRITE = 239,
+ OP_PRTF = 240,
+ OP_PRINT = 241,
+ OP_SAY = 242,
+ OP_SYSOPEN = 243,
+ OP_SYSSEEK = 244,
+ OP_SYSREAD = 245,
+ OP_SYSWRITE = 246,
+ OP_EOF = 247,
+ OP_TELL = 248,
+ OP_SEEK = 249,
+ OP_TRUNCATE = 250,
+ OP_FCNTL = 251,
+ OP_IOCTL = 252,
+ OP_FLOCK = 253,
+ OP_SEND = 254,
+ OP_RECV = 255,
+ OP_SOCKET = 256,
+ OP_SOCKPAIR = 257,
+ OP_BIND = 258,
+ OP_CONNECT = 259,
+ OP_LISTEN = 260,
+ OP_ACCEPT = 261,
+ OP_SHUTDOWN = 262,
+ OP_GSOCKOPT = 263,
+ OP_SSOCKOPT = 264,
+ OP_GETSOCKNAME = 265,
+ OP_GETPEERNAME = 266,
+ OP_LSTAT = 267,
+ OP_STAT = 268,
+ OP_FTRREAD = 269,
+ OP_FTRWRITE = 270,
+ OP_FTREXEC = 271,
+ OP_FTEREAD = 272,
+ OP_FTEWRITE = 273,
+ OP_FTEEXEC = 274,
+ OP_FTIS = 275,
+ OP_FTSIZE = 276,
+ OP_FTMTIME = 277,
+ OP_FTATIME = 278,
+ OP_FTCTIME = 279,
+ OP_FTROWNED = 280,
+ OP_FTEOWNED = 281,
+ OP_FTZERO = 282,
+ OP_FTSOCK = 283,
+ OP_FTCHR = 284,
+ OP_FTBLK = 285,
+ OP_FTFILE = 286,
+ OP_FTDIR = 287,
+ OP_FTPIPE = 288,
+ OP_FTSUID = 289,
+ OP_FTSGID = 290,
+ OP_FTSVTX = 291,
+ OP_FTLINK = 292,
+ OP_FTTTY = 293,
+ OP_FTTEXT = 294,
+ OP_FTBINARY = 295,
+ OP_CHDIR = 296,
+ OP_CHOWN = 297,
+ OP_CHROOT = 298,
+ OP_UNLINK = 299,
+ OP_CHMOD = 300,
+ OP_UTIME = 301,
+ OP_RENAME = 302,
+ OP_LINK = 303,
+ OP_SYMLINK = 304,
+ OP_READLINK = 305,
+ OP_MKDIR = 306,
+ OP_RMDIR = 307,
+ OP_OPEN_DIR = 308,
+ OP_READDIR = 309,
+ OP_TELLDIR = 310,
+ OP_SEEKDIR = 311,
+ OP_REWINDDIR = 312,
+ OP_CLOSEDIR = 313,
+ OP_FORK = 314,
+ OP_WAIT = 315,
+ OP_WAITPID = 316,
+ OP_SYSTEM = 317,
+ OP_EXEC = 318,
+ OP_KILL = 319,
+ OP_GETPPID = 320,
+ OP_GETPGRP = 321,
+ OP_SETPGRP = 322,
+ OP_GETPRIORITY = 323,
+ OP_SETPRIORITY = 324,
+ OP_TIME = 325,
+ OP_TMS = 326,
+ OP_LOCALTIME = 327,
+ OP_GMTIME = 328,
+ OP_ALARM = 329,
+ OP_SLEEP = 330,
+ OP_SHMGET = 331,
+ OP_SHMCTL = 332,
+ OP_SHMREAD = 333,
+ OP_SHMWRITE = 334,
+ OP_MSGGET = 335,
+ OP_MSGCTL = 336,
+ OP_MSGSND = 337,
+ OP_MSGRCV = 338,
+ OP_SEMOP = 339,
+ OP_SEMGET = 340,
+ OP_SEMCTL = 341,
+ OP_REQUIRE = 342,
+ OP_DOFILE = 343,
+ OP_HINTSEVAL = 344,
+ OP_ENTEREVAL = 345,
+ OP_LEAVEEVAL = 346,
+ OP_ENTERTRY = 347,
+ OP_LEAVETRY = 348,
+ OP_GHBYNAME = 349,
+ OP_GHBYADDR = 350,
+ OP_GHOSTENT = 351,
+ OP_GNBYNAME = 352,
+ OP_GNBYADDR = 353,
+ OP_GNETENT = 354,
+ OP_GPBYNAME = 355,
+ OP_GPBYNUMBER = 356,
+ OP_GPROTOENT = 357,
+ OP_GSBYNAME = 358,
+ OP_GSBYPORT = 359,
+ OP_GSERVENT = 360,
+ OP_SHOSTENT = 361,
+ OP_SNETENT = 362,
+ OP_SPROTOENT = 363,
+ OP_SSERVENT = 364,
+ OP_EHOSTENT = 365,
+ OP_ENETENT = 366,
+ OP_EPROTOENT = 367,
+ OP_ESERVENT = 368,
+ OP_GPWNAM = 369,
+ OP_GPWUID = 370,
+ OP_GPWENT = 371,
+ OP_SPWENT = 372,
+ OP_EPWENT = 373,
+ OP_GGRNAM = 374,
+ OP_GGRGID = 375,
+ OP_GGRENT = 376,
+ OP_SGRENT = 377,
+ OP_EGRENT = 378,
+ OP_GETLOGIN = 379,
+ OP_SYSCALL = 380,
+ OP_LOCK = 381,
+ OP_ONCE = 382,
+ OP_CUSTOM = 383,
+ OP_COREARGS = 384,
+ OP_AVHVSWITCH = 385,
+ OP_RUNCV = 386,
+ OP_FC = 387,
+ OP_PADCV = 388,
+ OP_INTROCV = 389,
+ OP_CLONECV = 390,
+ OP_PADRANGE = 391,
+ OP_REFASSIGN = 392,
+ OP_LVREF = 393,
+ OP_LVREFSLICE = 394,
+ OP_LVAVREF = 395,
+ OP_ANONCONST = 396,
OP_max
} opcode;
-#define MAXO 396
+#define MAXO 397
#define OP_FREED MAXO
/* the OP_IS_* macros are optimized to a simple range check because