diff options
author | David Mitchell <davem@iabyn.com> | 2017-08-08 18:42:14 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2017-10-31 15:31:26 +0000 |
commit | e839e6ed99c6b25aee589f56bb58de2f8fa00f41 (patch) | |
tree | 30bab03fdd8e73c4cb6e5b2d33ab1f428693a3a8 /opnames.h | |
parent | c0acf911f65b2badbd72efa28edb2d197639a51b (diff) | |
download | perl-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.h | 661 |
1 files changed, 331 insertions, 330 deletions
@@ -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 |