diff options
-rw-r--r-- | embed.fnc | 1 | ||||
-rw-r--r-- | embed.h | 1 | ||||
-rw-r--r-- | lib/B/Op_private.pm | 8 | ||||
-rw-r--r-- | op.c | 26 | ||||
-rw-r--r-- | opcode.h | 239 | ||||
-rw-r--r-- | perly.act | 861 | ||||
-rw-r--r-- | perly.h | 11 | ||||
-rw-r--r-- | perly.tab | 67 | ||||
-rw-r--r-- | perly.y | 36 | ||||
-rw-r--r-- | pod/perldelta.pod | 8 | ||||
-rw-r--r-- | pod/perlsub.pod | 18 | ||||
-rw-r--r-- | pp.c | 22 | ||||
-rw-r--r-- | proto.h | 5 | ||||
-rw-r--r-- | regen/op_private | 5 | ||||
-rw-r--r-- | t/op/signatures.t | 12 | ||||
-rw-r--r-- | toke.c | 18 |
16 files changed, 725 insertions, 613 deletions
@@ -1460,6 +1460,7 @@ p |void |my_unexec ApR |OP* |newANONLIST |NULLOK OP* o ApR |OP* |newANONHASH |NULLOK OP* o Ap |OP* |newANONSUB |I32 floor|NULLOK OP* proto|NULLOK OP* block +ApdR |OP* |newARGDEFELEMOP|I32 flags|NN OP* expr|I32 argindex ApdR |OP* |newASSIGNOP |I32 flags|NULLOK OP* left|I32 optype|NULLOK OP* right ApdR |OP* |newCONDOP |I32 flags|NN OP* first|NULLOK OP* trueop|NULLOK OP* falseop Apd |CV* |newCONSTSUB |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv @@ -336,6 +336,7 @@ #define newANONHASH(a) Perl_newANONHASH(aTHX_ a) #define newANONLIST(a) Perl_newANONLIST(aTHX_ a) #define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c) +#define newARGDEFELEMOP(a,b,c) Perl_newARGDEFELEMOP(aTHX_ a,b,c) #define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d) #define newAVREF(a) Perl_newAVREF(aTHX_ a) #define newAVav(a) Perl_newAVav(aTHX_ a) diff --git a/lib/B/Op_private.pm b/lib/B/Op_private.pm index 3f7880d197..28ae8fc649 100644 --- a/lib/B/Op_private.pm +++ b/lib/B/Op_private.pm @@ -263,7 +263,7 @@ $bits{anonconst}{0} = $bf[0]; @{$bits{anonhash}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @{$bits{anonlist}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{argcheck}{0} = $bf[0]; -$bits{argdefelem}{0} = $bf[0]; +@{$bits{argdefelem}}{7,6,0} = ('OPpARG_IF_UNDEF', 'OPpARG_IF_FALSE', $bf[0]); @{$bits{argelem}}{2,1,0} = ($bf[7], $bf[7], $bf[0]); @{$bits{atan2}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{av2arylen}{0} = $bf[0]; @@ -600,6 +600,8 @@ our %defines = ( OPpARGELEM_HV => 4, OPpARGELEM_MASK => 6, OPpARGELEM_SV => 0, + OPpARG_IF_FALSE => 64, + OPpARG_IF_UNDEF => 128, OPpASSIGN_BACKWARDS => 64, OPpASSIGN_COMMON_AGG => 16, OPpASSIGN_COMMON_RC1 => 32, @@ -710,6 +712,8 @@ our %labels = ( OPpARGELEM_AV => 'AV', OPpARGELEM_HV => 'HV', OPpARGELEM_SV => 'SV', + OPpARG_IF_FALSE => 'IF_FALSE', + OPpARG_IF_UNDEF => 'IF_UNDEF', OPpASSIGN_BACKWARDS => 'BKWARD', OPpASSIGN_COMMON_AGG => 'COM_AGG', OPpASSIGN_COMMON_RC1 => 'COM_RC1', @@ -813,6 +817,7 @@ our %labels = ( our %ops_using = ( OPpALLOW_FAKE => [qw(rv2gv)], + OPpARG_IF_FALSE => [qw(argdefelem)], OPpASSIGN_BACKWARDS => [qw(sassign)], OPpASSIGN_COMMON_AGG => [qw(aassign)], OPpCONCAT_NESTED => [qw(concat)], @@ -865,6 +870,7 @@ our %ops_using = ( OPpUSEINT => [qw(bit_and bit_or bit_xor complement left_shift nbit_and nbit_or nbit_xor ncomplement right_shift sbit_and sbit_or sbit_xor)], ); +$ops_using{OPpARG_IF_UNDEF} = $ops_using{OPpARG_IF_FALSE}; $ops_using{OPpASSIGN_COMMON_RC1} = $ops_using{OPpASSIGN_COMMON_AGG}; $ops_using{OPpASSIGN_COMMON_SCALAR} = $ops_using{OPpASSIGN_COMMON_AGG}; $ops_using{OPpASSIGN_CV_TO_GV} = $ops_using{OPpASSIGN_BACKWARDS}; @@ -7975,6 +7975,32 @@ S_newONCEOP(pTHX_ OP *initop, OP *padop) } /* +=for apidoc newARGDEFELEMOP + +Constructs and returns a new C<OP_ARGDEFELEM> op which provides a defaulting +expression given by C<expr> for the signature parameter at the index given +by C<argindex>. The expression optree is consumed by this function and +becomes part of the returned optree. + +=cut +*/ + +OP * +Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP *expr, I32 argindex) +{ + PERL_ARGS_ASSERT_NEWARGDEFELEMOP; + + OP *o = (OP *)alloc_LOGOP(OP_ARGDEFELEM, expr, LINKLIST(expr)); + o->op_flags |= (U8)(flags); + o->op_private = 1 | (U8)(flags >> 8); + + /* re-purpose op_targ to hold @_ index */ + o->op_targ = (PADOFFSET)(argindex); + + return o; +} + +/* =for apidoc newASSIGNOP Constructs, checks, and returns an assignment op. C<left> and C<right> @@ -2343,6 +2343,7 @@ END_EXTERN_C #define OPpLVREF_CV 0x30 #define OPpLVREF_TYPE 0x30 #define OPpALLOW_FAKE 0x40 +#define OPpARG_IF_FALSE 0x40 #define OPpASSIGN_BACKWARDS 0x40 #define OPpASSIGN_COMMON_SCALAR 0x40 #define OPpCONCAT_NESTED 0x40 @@ -2363,6 +2364,7 @@ END_EXTERN_C #define OPpSLICE 0x40 #define OPpTRANS_GROWS 0x40 #define OPpPADRANGE_COUNTMASK 0x7f +#define OPpARG_IF_UNDEF 0x80 #define OPpASSIGN_CV_TO_GV 0x80 #define OPpCOREARGS_PUSHMARK 0x80 #define OPpDEFER_FINALLY 0x80 @@ -2443,6 +2445,8 @@ EXTCONST char PL_op_private_labels[] = { 'H','U','S','H','\0', 'H','V','\0', 'I','D','E','N','T','\0', + 'I','F','_','F','A','L','S','E','\0', + 'I','F','_','U','N','D','E','F','\0', 'I','M','P','L','I','M','\0', 'I','N','A','R','G','S','\0', 'I','N','B','I','N','\0', @@ -2510,14 +2514,14 @@ EXTCONST char PL_op_private_labels[] = { EXTCONST I16 PL_op_private_bitfields[] = { 0, 8, -1, 0, 8, -1, - 0, 613, -1, + 0, 631, -1, 0, 8, -1, 0, 8, -1, - 0, 620, -1, - 0, 609, -1, - 1, -1, 0, 570, 1, 39, 2, 312, -1, + 0, 638, -1, + 0, 627, -1, + 1, -1, 0, 588, 1, 39, 2, 312, -1, 4, -1, 1, 185, 2, 192, 3, 199, -1, - 4, -1, 0, 570, 1, 39, 2, 312, 3, 131, -1, + 4, -1, 0, 588, 1, 39, 2, 312, 3, 131, -1, }; @@ -2718,28 +2722,28 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_LEAVESUBLV] = 188, [OP_ARGCHECK] = 0, [OP_ARGELEM] = 190, - [OP_ARGDEFELEM] = 0, - [OP_CALLER] = 192, + [OP_ARGDEFELEM] = 192, + [OP_CALLER] = 195, [OP_WARN] = 55, [OP_DIE] = 55, [OP_RESET] = 55, [OP_LINESEQ] = -1, - [OP_NEXTSTATE] = 194, - [OP_DBSTATE] = 194, + [OP_NEXTSTATE] = 197, + [OP_DBSTATE] = 197, [OP_UNSTACK] = -1, [OP_ENTER] = -1, - [OP_LEAVE] = 195, + [OP_LEAVE] = 198, [OP_SCOPE] = -1, - [OP_ENTERITER] = 197, - [OP_ITER] = 201, + [OP_ENTERITER] = 200, + [OP_ITER] = 204, [OP_ENTERLOOP] = -1, - [OP_LEAVELOOP] = 202, + [OP_LEAVELOOP] = 205, [OP_RETURN] = -1, - [OP_LAST] = 204, - [OP_NEXT] = 204, - [OP_REDO] = 204, - [OP_DUMP] = 204, - [OP_GOTO] = 204, + [OP_LAST] = 207, + [OP_NEXT] = 207, + [OP_REDO] = 207, + [OP_DUMP] = 207, + [OP_GOTO] = 207, [OP_EXIT] = 55, [OP_METHOD] = 0, [OP_METHOD_NAMED] = 0, @@ -2752,7 +2756,7 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_LEAVEWHEN] = 0, [OP_BREAK] = -1, [OP_CONTINUE] = -1, - [OP_OPEN] = 206, + [OP_OPEN] = 209, [OP_CLOSE] = 55, [OP_PIPE_OP] = 55, [OP_FILENO] = 55, @@ -2798,33 +2802,33 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_GETPEERNAME] = 0, [OP_LSTAT] = 0, [OP_STAT] = 0, - [OP_FTRREAD] = 211, - [OP_FTRWRITE] = 211, - [OP_FTREXEC] = 211, - [OP_FTEREAD] = 211, - [OP_FTEWRITE] = 211, - [OP_FTEEXEC] = 211, - [OP_FTIS] = 216, - [OP_FTSIZE] = 216, - [OP_FTMTIME] = 216, - [OP_FTATIME] = 216, - [OP_FTCTIME] = 216, - [OP_FTROWNED] = 216, - [OP_FTEOWNED] = 216, - [OP_FTZERO] = 216, - [OP_FTSOCK] = 216, - [OP_FTCHR] = 216, - [OP_FTBLK] = 216, - [OP_FTFILE] = 216, - [OP_FTDIR] = 216, - [OP_FTPIPE] = 216, - [OP_FTSUID] = 216, - [OP_FTSGID] = 216, - [OP_FTSVTX] = 216, - [OP_FTLINK] = 216, - [OP_FTTTY] = 216, - [OP_FTTEXT] = 216, - [OP_FTBINARY] = 216, + [OP_FTRREAD] = 214, + [OP_FTRWRITE] = 214, + [OP_FTREXEC] = 214, + [OP_FTEREAD] = 214, + [OP_FTEWRITE] = 214, + [OP_FTEEXEC] = 214, + [OP_FTIS] = 219, + [OP_FTSIZE] = 219, + [OP_FTMTIME] = 219, + [OP_FTATIME] = 219, + [OP_FTCTIME] = 219, + [OP_FTROWNED] = 219, + [OP_FTEOWNED] = 219, + [OP_FTZERO] = 219, + [OP_FTSOCK] = 219, + [OP_FTCHR] = 219, + [OP_FTBLK] = 219, + [OP_FTFILE] = 219, + [OP_FTDIR] = 219, + [OP_FTPIPE] = 219, + [OP_FTSUID] = 219, + [OP_FTSGID] = 219, + [OP_FTSVTX] = 219, + [OP_FTLINK] = 219, + [OP_FTTTY] = 219, + [OP_FTTEXT] = 219, + [OP_FTBINARY] = 219, [OP_CHDIR] = 101, [OP_CHOWN] = 101, [OP_CHROOT] = 78, @@ -2844,17 +2848,17 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_REWINDDIR] = 0, [OP_CLOSEDIR] = 0, [OP_FORK] = -1, - [OP_WAIT] = 220, + [OP_WAIT] = 223, [OP_WAITPID] = 101, [OP_SYSTEM] = 101, [OP_EXEC] = 101, [OP_KILL] = 101, - [OP_GETPPID] = 220, + [OP_GETPPID] = 223, [OP_GETPGRP] = 101, [OP_SETPGRP] = 101, [OP_GETPRIORITY] = 101, [OP_SETPRIORITY] = 101, - [OP_TIME] = 220, + [OP_TIME] = 223, [OP_TMS] = -1, [OP_LOCALTIME] = 0, [OP_GMTIME] = 55, @@ -2874,7 +2878,7 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_REQUIRE] = 0, [OP_DOFILE] = 0, [OP_HINTSEVAL] = -1, - [OP_ENTEREVAL] = 221, + [OP_ENTEREVAL] = 224, [OP_LEAVEEVAL] = 188, [OP_ENTERTRY] = 0, [OP_LEAVETRY] = -1, @@ -2913,17 +2917,17 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_LOCK] = 0, [OP_ONCE] = 0, [OP_CUSTOM] = -1, - [OP_COREARGS] = 227, - [OP_AVHVSWITCH] = 231, + [OP_COREARGS] = 230, + [OP_AVHVSWITCH] = 234, [OP_RUNCV] = 3, [OP_FC] = 0, [OP_PADCV] = -1, [OP_INTROCV] = -1, [OP_CLONECV] = -1, - [OP_PADRANGE] = 233, - [OP_REFASSIGN] = 235, - [OP_LVREF] = 241, - [OP_LVREFSLICE] = 247, + [OP_PADRANGE] = 236, + [OP_REFASSIGN] = 238, + [OP_LVREF] = 244, + [OP_LVREFSLICE] = 250, [OP_LVAVREF] = 16, [OP_ANONCONST] = 0, [OP_ISA] = 12, @@ -2933,7 +2937,7 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { [OP_LEAVETRYCATCH] = -1, [OP_POPTRY] = -1, [OP_CATCH] = 0, - [OP_PUSHDEFER] = 248, + [OP_PUSHDEFER] = 251, [OP_IS_BOOL] = 0, [OP_IS_WEAK] = 0, [OP_WEAKEN] = 0, @@ -2962,80 +2966,81 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { */ EXTCONST U16 PL_op_private_bitdefs[] = { - 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, argdefelem, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, is_bool, is_weak, weaken, unweaken, is_tainted */ - 0x32fc, 0x43f9, /* pushmark */ + 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, is_bool, is_weak, weaken, unweaken, is_tainted */ + 0x353c, 0x4639, /* pushmark */ 0x00bd, /* wantarray, runcv */ - 0x0558, 0x1b70, 0x44ac, 0x4048, 0x3825, /* const */ - 0x32fc, 0x3979, /* gvsv */ + 0x0558, 0x1b70, 0x46ec, 0x4288, 0x3a65, /* const */ + 0x353c, 0x3bb9, /* gvsv */ 0x19d5, /* gv */ 0x0067, /* gelem, lt, i_lt, gt, i_gt, le, i_le, ge, i_ge, eq, i_eq, ne, i_ne, ncmp, i_ncmp, slt, sgt, sle, sge, seq, sne, scmp, smartmatch, lslice, xor, isa */ - 0x32fc, 0x43f8, 0x03d7, /* padsv */ - 0x32fc, 0x43f8, 0x0003, /* padsv_store, lvavref */ - 0x32fc, 0x43f8, 0x06d4, 0x33ec, 0x41c9, /* padav */ - 0x32fc, 0x43f8, 0x06d4, 0x0770, 0x33ec, 0x41c8, 0x2e61, /* padhv */ - 0x32fc, 0x1d58, 0x03d6, 0x33ec, 0x3748, 0x44a4, 0x0003, /* rv2gv */ - 0x32fc, 0x3978, 0x03d6, 0x44a4, 0x0003, /* rv2sv */ - 0x33ec, 0x0003, /* av2arylen, akeys, values, keys */ - 0x36bc, 0x1198, 0x0ef4, 0x014c, 0x47a8, 0x44a4, 0x0003, /* rv2cv */ + 0x353c, 0x4638, 0x03d7, /* padsv */ + 0x353c, 0x4638, 0x0003, /* padsv_store, lvavref */ + 0x353c, 0x4638, 0x06d4, 0x362c, 0x4409, /* padav */ + 0x353c, 0x4638, 0x06d4, 0x0770, 0x362c, 0x4408, 0x30a1, /* padhv */ + 0x353c, 0x1d58, 0x03d6, 0x362c, 0x3988, 0x46e4, 0x0003, /* rv2gv */ + 0x353c, 0x3bb8, 0x03d6, 0x46e4, 0x0003, /* rv2sv */ + 0x362c, 0x0003, /* av2arylen, akeys, values, keys */ + 0x38fc, 0x1198, 0x0ef4, 0x014c, 0x49e8, 0x46e4, 0x0003, /* rv2cv */ 0x06d4, 0x0770, 0x0003, /* ref, blessed */ 0x018f, /* bless, glob, sprintf, formline, unpack, pack, join, anonlist, anonhash, splice, warn, die, reset, exit, close, pipe_op, fileno, umask, binmode, tie, dbmopen, sselect, select, getc, read, enterwrite, sysopen, sysseek, sysread, syswrite, eof, tell, seek, truncate, fcntl, ioctl, send, recv, socket, sockpair, bind, connect, listen, accept, shutdown, gsockopt, ssockopt, open_dir, seekdir, gmtime, shmget, shmctl, shmread, shmwrite, msgget, msgctl, msgsnd, msgrcv, semop, semget, semctl, ghbyaddr, gnbyaddr, gpbynumber, gsbyname, gsbyport, syscall */ - 0x3b5c, 0x3a78, 0x2ab4, 0x29f0, 0x0003, /* backtick */ + 0x3d9c, 0x3cb8, 0x2cf4, 0x2c30, 0x0003, /* backtick */ 0x06d5, /* subst */ - 0x129c, 0x23d8, 0x0ad4, 0x430c, 0x2768, 0x4a84, 0x08e1, /* trans, transr */ + 0x129c, 0x23d8, 0x0ad4, 0x454c, 0x2768, 0x4cc4, 0x08e1, /* trans, transr */ 0x10dc, 0x05f8, 0x0067, /* sassign */ - 0x0d98, 0x0c94, 0x0b90, 0x33ec, 0x06c8, 0x0067, /* aassign */ - 0x4850, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, refaddr, reftype, ceil, floor */ - 0x32fc, 0x43f8, 0x2d74, 0x4850, 0x0003, /* undef */ - 0x06d4, 0x33ec, 0x0003, /* pos */ - 0x4850, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */ + 0x0d98, 0x0c94, 0x0b90, 0x362c, 0x06c8, 0x0067, /* aassign */ + 0x4a90, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, refaddr, reftype, ceil, floor */ + 0x353c, 0x4638, 0x2fb4, 0x4a90, 0x0003, /* undef */ + 0x06d4, 0x362c, 0x0003, /* pos */ + 0x4a90, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */ 0x1658, 0x0067, /* repeat */ - 0x35d8, 0x4850, 0x0067, /* concat */ - 0x32fc, 0x0338, 0x1d54, 0x4850, 0x458c, 0x0003, /* multiconcat */ - 0x4850, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ - 0x4850, 0x49a9, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */ - 0x49a9, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */ - 0x06d4, 0x4850, 0x0003, /* length */ - 0x3db0, 0x33ec, 0x012b, /* substr */ - 0x33ec, 0x0067, /* vec */ - 0x3558, 0x06d4, 0x4850, 0x018f, /* index, rindex */ - 0x32fc, 0x3978, 0x06d4, 0x33ec, 0x41c8, 0x44a4, 0x0003, /* rv2av */ + 0x3818, 0x4a90, 0x0067, /* concat */ + 0x353c, 0x0338, 0x1d54, 0x4a90, 0x47cc, 0x0003, /* multiconcat */ + 0x4a90, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ + 0x4a90, 0x4be9, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */ + 0x4be9, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */ + 0x06d4, 0x4a90, 0x0003, /* length */ + 0x3ff0, 0x362c, 0x012b, /* substr */ + 0x362c, 0x0067, /* vec */ + 0x3798, 0x06d4, 0x4a90, 0x018f, /* index, rindex */ + 0x353c, 0x3bb8, 0x06d4, 0x362c, 0x4408, 0x46e4, 0x0003, /* rv2av */ 0x025f, /* aelemfast, aelemfast_lex, aelemfastlex_store */ - 0x32fc, 0x31f8, 0x03d6, 0x33ec, 0x0067, /* aelem, helem */ - 0x32fc, 0x33ec, 0x41c9, /* aslice, hslice */ - 0x33ed, /* kvaslice, kvhslice */ - 0x32fc, 0x4118, 0x2f14, 0x0003, /* delete */ - 0x46d8, 0x0003, /* exists */ - 0x32fc, 0x3978, 0x06d4, 0x0770, 0x33ec, 0x41c8, 0x44a4, 0x2e61, /* rv2hv */ - 0x32fc, 0x31f8, 0x1314, 0x1c70, 0x33ec, 0x44a4, 0x0003, /* multideref */ - 0x32fc, 0x3978, 0x0410, 0x300c, 0x2829, /* split */ - 0x32fc, 0x2499, /* list */ - 0x32fc, 0x43f8, 0x0214, 0x4850, 0x018f, /* emptyavhv */ - 0x15b0, 0x2b4c, 0x3ea8, 0x2c44, 0x38e1, /* sort */ - 0x2b4c, 0x0003, /* reverse */ + 0x353c, 0x3438, 0x03d6, 0x362c, 0x0067, /* aelem, helem */ + 0x353c, 0x362c, 0x4409, /* aslice, hslice */ + 0x362d, /* kvaslice, kvhslice */ + 0x353c, 0x4358, 0x3154, 0x0003, /* delete */ + 0x4918, 0x0003, /* exists */ + 0x353c, 0x3bb8, 0x06d4, 0x0770, 0x362c, 0x4408, 0x46e4, 0x30a1, /* rv2hv */ + 0x353c, 0x3438, 0x1314, 0x1c70, 0x362c, 0x46e4, 0x0003, /* multideref */ + 0x353c, 0x3bb8, 0x0410, 0x324c, 0x2a69, /* split */ + 0x353c, 0x2499, /* list */ + 0x353c, 0x4638, 0x0214, 0x4a90, 0x018f, /* emptyavhv */ + 0x15b0, 0x2d8c, 0x40e8, 0x2e84, 0x3b21, /* sort */ + 0x2d8c, 0x0003, /* reverse */ 0x06d4, 0x0003, /* grepwhile */ - 0x3098, 0x0003, /* flip, flop */ - 0x32fc, 0x0003, /* cond_expr */ - 0x32fc, 0x1198, 0x03d6, 0x014c, 0x47a8, 0x44a4, 0x2901, /* entersub */ - 0x3c18, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ + 0x32d8, 0x0003, /* flip, flop */ + 0x353c, 0x0003, /* cond_expr */ + 0x353c, 0x1198, 0x03d6, 0x014c, 0x49e8, 0x46e4, 0x2b41, /* entersub */ + 0x3e58, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ 0x02aa, 0x0003, /* argelem */ + 0x295c, 0x2838, 0x0003, /* argdefelem */ 0x00bc, 0x018f, /* caller */ 0x2675, /* nextstate, dbstate */ - 0x319c, 0x3c19, /* leave */ - 0x32fc, 0x3978, 0x120c, 0x3f25, /* enteriter */ - 0x3f25, /* iter */ - 0x319c, 0x0067, /* leaveloop */ - 0x4bbc, 0x0003, /* last, next, redo, dump, goto */ - 0x3b5c, 0x3a78, 0x2ab4, 0x29f0, 0x018f, /* open */ + 0x33dc, 0x3e59, /* leave */ + 0x353c, 0x3bb8, 0x120c, 0x4165, /* enteriter */ + 0x4165, /* iter */ + 0x33dc, 0x0067, /* leaveloop */ + 0x4dfc, 0x0003, /* last, next, redo, dump, goto */ + 0x3d9c, 0x3cb8, 0x2cf4, 0x2c30, 0x018f, /* open */ 0x2010, 0x226c, 0x2128, 0x1ee4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */ 0x2010, 0x226c, 0x2128, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */ - 0x4851, /* wait, getppid, time */ - 0x3cb4, 0x0fb0, 0x082c, 0x4928, 0x2584, 0x0003, /* entereval */ - 0x34bc, 0x0018, 0x14c4, 0x13e1, /* coreargs */ - 0x33ec, 0x00c7, /* avhvswitch */ - 0x32fc, 0x01fb, /* padrange */ - 0x32fc, 0x43f8, 0x04f6, 0x2ccc, 0x1ac8, 0x0067, /* refassign */ - 0x32fc, 0x43f8, 0x04f6, 0x2ccc, 0x1ac8, 0x0003, /* lvref */ - 0x32fd, /* lvrefslice */ + 0x4a91, /* wait, getppid, time */ + 0x3ef4, 0x0fb0, 0x082c, 0x4b68, 0x2584, 0x0003, /* entereval */ + 0x36fc, 0x0018, 0x14c4, 0x13e1, /* coreargs */ + 0x362c, 0x00c7, /* avhvswitch */ + 0x353c, 0x01fb, /* padrange */ + 0x353c, 0x4638, 0x04f6, 0x2f0c, 0x1ac8, 0x0067, /* refassign */ + 0x353c, 0x4638, 0x04f6, 0x2f0c, 0x1ac8, 0x0003, /* lvref */ + 0x353d, /* lvrefslice */ 0x1dfc, 0x0003, /* pushdefer */ }; @@ -3237,7 +3242,7 @@ EXTCONST U8 PL_op_private_valid[] = { [OP_LEAVESUBLV] = (OPpARG1_MASK|OPpREFCOUNTED), [OP_ARGCHECK] = (OPpARG1_MASK), [OP_ARGELEM] = (OPpARG1_MASK|OPpARGELEM_MASK), - [OP_ARGDEFELEM] = (OPpARG1_MASK), + [OP_ARGDEFELEM] = (OPpARG1_MASK|OPpARG_IF_FALSE|OPpARG_IF_UNDEF), [OP_CALLER] = (OPpARG4_MASK|OPpOFFBYONE), [OP_WARN] = (OPpARG4_MASK), [OP_DIE] = (OPpARG4_MASK), @@ -6,7 +6,7 @@ case 2: #line 153 "perly.y" - { + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -15,7 +15,7 @@ case 2: case 3: #line 158 "perly.y" - { + { newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval))); PL_compiling.cop_seq = 0; (yyval.ival) = 0; @@ -25,7 +25,7 @@ case 2: case 4: #line 164 "perly.y" - { + { parser->expect = XTERM; (yyval.ival) = 0; } @@ -34,7 +34,7 @@ case 2: case 5: #line 169 "perly.y" - { + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -43,7 +43,7 @@ case 2: case 6: #line 174 "perly.y" - { + { parser->expect = XBLOCK; (yyval.ival) = 0; } @@ -52,7 +52,7 @@ case 2: case 7: #line 179 "perly.y" - { + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -64,7 +64,7 @@ case 2: case 8: #line 187 "perly.y" - { + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -73,7 +73,7 @@ case 2: case 9: #line 192 "perly.y" - { + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -85,7 +85,7 @@ case 2: case 10: #line 200 "perly.y" - { + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -94,7 +94,7 @@ case 2: case 11: #line 205 "perly.y" - { + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -106,7 +106,7 @@ case 2: case 12: #line 213 "perly.y" - { + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -115,7 +115,7 @@ case 2: case 13: #line 218 "perly.y" - { + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -124,7 +124,7 @@ case 2: case 14: #line 223 "perly.y" - { + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -133,7 +133,7 @@ case 2: case 15: #line 228 "perly.y" - { + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -142,7 +142,7 @@ case 2: case 16: #line 236 "perly.y" - { if (parser->copline > (line_t)(ps[-3].val.ival)) + { if (parser->copline > (line_t)(ps[-3].val.ival)) parser->copline = (line_t)(ps[-3].val.ival); (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); } @@ -151,13 +151,13 @@ case 2: case 17: #line 243 "perly.y" - { (yyval.opval) = NULL; } + { (yyval.opval) = NULL; } break; case 18: #line 248 "perly.y" - { if (parser->copline > (line_t)(ps[-6].val.ival)) + { if (parser->copline > (line_t)(ps[-6].val.ival)) parser->copline = (line_t)(ps[-6].val.ival); (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval)); } @@ -166,14 +166,14 @@ case 2: case 19: #line 255 "perly.y" - { (yyval.ival) = block_start(TRUE); + { (yyval.ival) = block_start(TRUE); parser->parsed_sub = 0; } break; case 20: #line 260 "perly.y" - { if (parser->copline > (line_t)(ps[-3].val.ival)) + { if (parser->copline > (line_t)(ps[-3].val.ival)) parser->copline = (line_t)(ps[-3].val.ival); (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); } @@ -182,32 +182,32 @@ case 2: case 21: #line 267 "perly.y" - { (yyval.ival) = block_start(FALSE); + { (yyval.ival) = block_start(FALSE); parser->parsed_sub = 0; } break; case 23: #line 276 "perly.y" - { parser->in_my = 1; } + { parser->in_my = 1; } break; case 24: #line 278 "perly.y" - { parser->in_my = 0; intro_my(); } + { parser->in_my = 0; intro_my(); } break; case 25: #line 280 "perly.y" - { (yyval.opval) = (ps[-2].val.opval); } + { (yyval.opval) = (ps[-2].val.opval); } break; case 27: #line 287 "perly.y" - { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[-1].val.opval) && (ps[0].val.opval)) PL_hints |= HINT_BLOCK_SCOPE; @@ -217,7 +217,7 @@ case 2: case 29: #line 298 "perly.y" - { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[-1].val.opval) && (ps[0].val.opval)) PL_hints |= HINT_BLOCK_SCOPE; @@ -227,7 +227,7 @@ case 2: case 30: #line 307 "perly.y" - { + { (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL; } @@ -235,13 +235,13 @@ case 2: case 31: #line 311 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { (yyval.opval) = (ps[0].val.opval); } break; case 32: #line 315 "perly.y" - { + { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, savepv(SvPVX_const(label)), (ps[0].val.opval)); @@ -252,7 +252,7 @@ case 2: case 33: #line 322 "perly.y" - { + { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, savepv(SvPVX_const(label)), (ps[0].val.opval)); @@ -263,13 +263,13 @@ case 2: case 34: #line 332 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { (yyval.opval) = (ps[0].val.opval); } break; case 35: #line 334 "perly.y" - { + { CV *fmtcv = PL_compcv; newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval)); (yyval.opval) = NULL; @@ -283,7 +283,7 @@ case 2: case 36: #line 346 "perly.y" - { + { init_named_cv(PL_compcv, (ps[-1].val.opval)); parser->in_my = 0; parser->in_my_stash = NULL; @@ -293,7 +293,7 @@ case 2: case 37: #line 352 "perly.y" - { + { SvREFCNT_inc_simple_void(PL_compcv); (ps[-5].val.opval)->op_type == OP_CONST ? newATTRSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)) @@ -308,7 +308,7 @@ case 2: case 38: #line 367 "perly.y" - { + { init_named_cv(PL_compcv, (ps[-1].val.opval)); parser->in_my = 0; parser->in_my_stash = NULL; @@ -318,7 +318,7 @@ case 2: case 39: #line 373 "perly.y" - { + { SvREFCNT_inc_simple_void(PL_compcv); (ps[-4].val.opval)->op_type == OP_CONST ? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), (ps[0].val.opval)) @@ -333,7 +333,7 @@ case 2: case 40: #line 388 "perly.y" - { + { package((ps[-1].val.opval)); if ((ps[-2].val.opval)) package_version((ps[-2].val.opval)); @@ -344,13 +344,13 @@ case 2: case 41: #line 395 "perly.y" - { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } + { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } break; case 42: #line 399 "perly.y" - { + { SvREFCNT_inc_simple_void(PL_compcv); utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval)); parser->parsed_sub = 1; @@ -361,7 +361,7 @@ case 2: case 43: #line 406 "perly.y" - { + { (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval))); parser->copline = (line_t)(ps[-6].val.ival); @@ -371,7 +371,7 @@ case 2: case 44: #line 412 "perly.y" - { + { (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval)))); parser->copline = (line_t)(ps[-6].val.ival); @@ -381,7 +381,7 @@ case 2: case 45: #line 418 "perly.y" - { + { (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0)); parser->copline = (line_t)(ps[-5].val.ival); } @@ -390,19 +390,19 @@ case 2: case 46: #line 423 "perly.y" - { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } + { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } break; case 47: #line 425 "perly.y" - { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); } + { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); } break; case 48: #line 427 "perly.y" - { + { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); @@ -413,7 +413,7 @@ case 2: case 49: #line 434 "perly.y" - { + { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); @@ -424,19 +424,19 @@ case 2: case 50: #line 441 "perly.y" - { parser->expect = XTERM; } + { parser->expect = XTERM; } break; case 51: #line 443 "perly.y" - { parser->expect = XTERM; } + { parser->expect = XTERM; } break; case 52: #line 446 "perly.y" - { + { OP *initop = (ps[-9].val.opval); OP *forop = newWHILEOP(0, 1, NULL, scalar((ps[-6].val.opval)), (ps[0].val.opval), (ps[-2].val.opval), (ps[-3].val.ival)); @@ -455,7 +455,7 @@ case 2: case 53: #line 461 "perly.y" - { + { (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-8].val.ival); } @@ -464,7 +464,7 @@ case 2: case 54: #line 466 "perly.y" - { + { if ((ps[-6].val.opval)->op_type == OP_PADSV) /* degenerate case of 1 var: for my ($x) .... Flag it so it can be special-cased in newFOROP */ @@ -477,7 +477,7 @@ case 2: case 55: #line 475 "perly.y" - { + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0, op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-7].val.ival); @@ -487,13 +487,13 @@ case 2: case 56: #line 481 "perly.y" - { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } + { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } break; case 57: #line 483 "perly.y" - { + { (yyval.opval) = block_end( (ps[-7].val.ival), newFOROP(0, @@ -510,7 +510,7 @@ case 2: case 58: #line 496 "perly.y" - { + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP( 0, op_lvalue(newUNOP(OP_REFGEN, 0, (ps[-6].val.opval)), @@ -522,7 +522,7 @@ case 2: case 59: #line 504 "perly.y" - { + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0, NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-6].val.ival); @@ -532,7 +532,7 @@ case 2: case 60: #line 510 "perly.y" - { + { if(!(ps[0].val.opval)) { yyerror("catch block requires a (VAR)"); YYERROR; @@ -543,7 +543,7 @@ case 2: case 61: #line 517 "perly.y" - { + { (yyval.opval) = newTRYCATCHOP(0, (ps[-6].val.opval), (ps[-3].val.opval), block_end((ps[-4].val.ival), op_scope((ps[-1].val.opval)))); if((ps[0].val.opval)) @@ -555,7 +555,7 @@ case 2: case 62: #line 525 "perly.y" - { + { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, NULL, NULL, (ps[-1].val.opval), (ps[0].val.opval), 0); @@ -565,7 +565,7 @@ case 2: case 63: #line 531 "perly.y" - { + { package((ps[-2].val.opval)); if ((ps[-3].val.opval)) { package_version((ps[-3].val.opval)); @@ -576,7 +576,7 @@ case 2: case 64: #line 538 "perly.y" - { + { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, NULL, NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0); @@ -588,7 +588,7 @@ case 2: case 65: #line 546 "perly.y" - { + { (yyval.opval) = (ps[-1].val.opval); } @@ -596,7 +596,7 @@ case 2: case 66: #line 550 "perly.y" - { + { (yyval.opval) = newDEFEROP(0, op_scope((ps[0].val.opval))); } @@ -604,7 +604,7 @@ case 2: case 67: #line 554 "perly.y" - { + { /* diag_listed_as: Unimplemented */ (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); @@ -614,7 +614,7 @@ case 2: case 68: #line 560 "perly.y" - { + { (yyval.opval) = NULL; parser->copline = NOLINE; } @@ -623,7 +623,7 @@ case 2: case 69: #line 568 "perly.y" - { OP *list; + { OP *list; if ((ps[0].val.opval)) { OP *term = (ps[0].val.opval); list = op_append_elem(OP_LIST, (ps[-1].val.opval), term); @@ -642,62 +642,62 @@ case 2: case 71: #line 587 "perly.y" - { (yyval.opval) = op_unscope((ps[-1].val.opval)); } + { (yyval.opval) = op_unscope((ps[-1].val.opval)); } break; case 73: #line 595 "perly.y" - { (yyval.opval) = NULL; } + { (yyval.opval) = NULL; } break; case 74: #line 597 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { (yyval.opval) = (ps[0].val.opval); } break; case 75: #line 599 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 76: #line 601 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 77: #line 603 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } break; case 78: #line 605 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 79: #line 607 "perly.y" - { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL); + { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL); parser->copline = (line_t)(ps[-1].val.ival); } break; case 80: #line 610 "perly.y" - { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } + { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } break; case 82: #line 617 "perly.y" - { + { ((ps[0].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = op_scope((ps[0].val.opval)); } @@ -706,7 +706,7 @@ case 2: case 83: #line 622 "perly.y" - { parser->copline = (line_t)(ps[-5].val.ival); + { parser->copline = (line_t)(ps[-5].val.ival); (yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)), op_scope((ps[-1].val.opval)), (ps[0].val.opval)); @@ -717,25 +717,25 @@ case 2: case 85: #line 634 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 86: #line 639 "perly.y" - { (yyval.opval) = NULL; } + { (yyval.opval) = NULL; } break; case 87: #line 641 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 88: #line 646 "perly.y" - { (yyval.ival) = (PL_min_intro_pending && + { (yyval.ival) = (PL_min_intro_pending && PL_max_intro_pending >= PL_min_intro_pending); intro_my(); } @@ -743,7 +743,7 @@ case 2: case 91: #line 658 "perly.y" - { YYSTYPE tmplval; + { YYSTYPE tmplval; (void)scan_num("1", &tmplval); (yyval.opval) = tmplval.opval; } @@ -751,52 +751,52 @@ case 2: case 93: #line 666 "perly.y" - { (yyval.opval) = invert(scalar((ps[0].val.opval))); } + { (yyval.opval) = invert(scalar((ps[0].val.opval))); } break; case 94: #line 671 "perly.y" - { (yyval.opval) = (ps[0].val.opval); intro_my(); } + { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; case 95: #line 675 "perly.y" - { (yyval.opval) = (ps[0].val.opval); intro_my(); } + { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; case 96: #line 678 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { (yyval.opval) = (ps[0].val.opval); } break; case 98: #line 683 "perly.y" - { (yyval.ival) = start_subparse(FALSE, 0); + { (yyval.ival) = start_subparse(FALSE, 0); SAVEFREESV(PL_compcv); } break; case 99: #line 689 "perly.y" - { (yyval.ival) = start_subparse(FALSE, CVf_ANON); + { (yyval.ival) = start_subparse(FALSE, CVf_ANON); SAVEFREESV(PL_compcv); } break; case 100: #line 694 "perly.y" - { (yyval.ival) = start_subparse(TRUE, 0); + { (yyval.ival) = start_subparse(TRUE, 0); SAVEFREESV(PL_compcv); } break; case 106: #line 713 "perly.y" - { + { OP *attrlist = (ps[0].val.opval); if(attrlist && !PL_parser->sig_seen) attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist); @@ -807,58 +807,58 @@ case 2: case 107: #line 720 "perly.y" - { (yyval.opval) = NULL; } + { (yyval.opval) = NULL; } break; case 108: #line 725 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { (yyval.opval) = (ps[0].val.opval); } break; case 109: #line 727 "perly.y" - { (yyval.opval) = NULL; } + { (yyval.opval) = NULL; } break; case 110: #line 738 "perly.y" - { parser->in_my = 0; (yyval.opval) = NULL; } + { parser->in_my = 0; (yyval.opval) = NULL; } break; case 111: #line 740 "perly.y" - { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } + { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } break; case 112: #line 745 "perly.y" - { (yyval.ival) = '@'; } + { (yyval.ival) = '@'; } break; case 113: #line 747 "perly.y" - { (yyval.ival) = '%'; } + { (yyval.ival) = '%'; } break; case 114: #line 751 "perly.y" - { - I32 sigil = (ps[-2].val.ival); - OP *var = (ps[-1].val.opval); - OP *defexpr = (ps[0].val.opval); + { + I32 sigil = (ps[-2].val.ival); + OP *var = (ps[-1].val.opval); + OP *defop = (ps[0].val.opval); if (parser->sig_slurpy) yyerror("Multiple slurpy parameters not allowed"); parser->sig_slurpy = (char)sigil; - if (defexpr) + if (defop) yyerror("A slurpy parameter may not have " "a default value"); @@ -869,30 +869,39 @@ case 2: case 116: #line 772 "perly.y" - { (yyval.opval) = newOP(OP_NULL, 0); } + { (yyval.opval) = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); } break; case 117: #line 774 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + { + I32 flags = 0; + if ((ps[-1].val.ival) == OP_DORASSIGN) + flags |= OPpARG_IF_UNDEF << 8; + if ((ps[-1].val.ival) == OP_ORASSIGN) + flags |= OPpARG_IF_FALSE << 8; + (yyval.opval) = newARGDEFELEMOP(flags, (ps[0].val.opval), parser->sig_elems); + } break; case 118: -#line 780 "perly.y" - { - OP *var = (ps[-1].val.opval); - OP *defexpr = (ps[0].val.opval); +#line 787 "perly.y" + { + OP *var = (ps[-1].val.opval); + OP *defop = (ps[0].val.opval); if (parser->sig_slurpy) yyerror("Slurpy parameter not last"); parser->sig_elems++; - if (defexpr) { + if (defop) { parser->sig_optelems++; + OP *defexpr = cLOGOPx(defop)->op_first; + if ( defexpr->op_type == OP_NULL && !(defexpr->op_flags & OPf_KIDS)) { @@ -900,17 +909,10 @@ case 2: if (var) yyerror("Optional parameter " "lacks default expression"); - op_free(defexpr); + op_free(defop); } else { /* a normal '=default' expression */ - OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM, - defexpr, - LINKLIST(defexpr)); - /* re-purpose op_targ to hold @_ index */ - defop->op_targ = - (PADOFFSET)(parser->sig_elems - 1); - if (var) { var->op_flags |= OPf_STACKED; (void)op_sibling_splice(var, @@ -945,46 +947,46 @@ case 2: break; case 119: -#line 845 "perly.y" - { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } +#line 847 "perly.y" + { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; case 120: -#line 847 "perly.y" - { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } +#line 849 "perly.y" + { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; case 121: -#line 853 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } +#line 855 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; case 122: -#line 855 "perly.y" - { +#line 857 "perly.y" + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 123: -#line 859 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 861 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 128: -#line 876 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } +#line 878 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; case 129: -#line 879 "perly.y" - { +#line 881 "perly.y" + { ENTER; SAVEIV(parser->sig_elems); SAVEIV(parser->sig_optelems); @@ -998,8 +1000,8 @@ case 2: break; case 130: -#line 890 "perly.y" - { +#line 892 "perly.y" + { OP *sigops = (ps[0].val.opval); struct op_argcheck_aux *aux; OP *check; @@ -1055,14 +1057,14 @@ case 2: break; case 132: -#line 947 "perly.y" - { (yyval.opval) = NULL; } +#line 949 "perly.y" + { (yyval.opval) = NULL; } break; case 133: -#line 953 "perly.y" - { +#line 955 "perly.y" + { if (parser->copline > (line_t)(ps[-2].val.ival)) parser->copline = (line_t)(ps[-2].val.ival); (yyval.opval) = block_end((ps[-3].val.ival), (ps[-1].val.opval)); @@ -1071,14 +1073,14 @@ case 2: break; case 135: -#line 965 "perly.y" - { (yyval.opval) = NULL; } +#line 967 "perly.y" + { (yyval.opval) = NULL; } break; case 136: -#line 970 "perly.y" - { +#line 972 "perly.y" + { if (parser->copline > (line_t)(ps[-2].val.ival)) parser->copline = (line_t)(ps[-2].val.ival); (yyval.opval) = block_end((ps[-4].val.ival), @@ -1088,26 +1090,26 @@ case 2: break; case 137: -#line 981 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } +#line 983 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 138: -#line 983 "perly.y" - { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } +#line 985 "perly.y" + { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 140: -#line 989 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } +#line 991 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; case 141: -#line 991 "perly.y" - { +#line 993 "perly.y" + { OP* term = (ps[0].val.opval); (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term); } @@ -1115,24 +1117,24 @@ case 2: break; case 143: -#line 1000 "perly.y" - { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, +#line 1002 "perly.y" + { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) ); } break; case 144: -#line 1004 "perly.y" - { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED, +#line 1006 "perly.y" + { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) ); } break; case 145: -#line 1008 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, +#line 1010 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-3].val.opval)))); @@ -1141,8 +1143,8 @@ case 2: break; case 146: -#line 1014 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, +#line 1016 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar((ps[-2].val.opval)), newMETHOP(OP_METHOD, 0, (ps[0].val.opval)))); } @@ -1150,8 +1152,8 @@ case 2: break; case 147: -#line 1019 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, +#line 1021 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-2].val.opval)))); @@ -1160,8 +1162,8 @@ case 2: break; case 148: -#line 1025 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, +#line 1027 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-4].val.opval)))); @@ -1170,33 +1172,33 @@ case 2: break; case 149: -#line 1031 "perly.y" - { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } +#line 1033 "perly.y" + { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 150: -#line 1033 "perly.y" - { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } +#line 1035 "perly.y" + { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 151: -#line 1035 "perly.y" - { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } +#line 1037 "perly.y" + { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 152: -#line 1037 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); +#line 1039 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); } break; case 153: -#line 1040 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1042 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval))); } @@ -1204,21 +1206,21 @@ case 2: break; case 156: -#line 1055 "perly.y" - { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } +#line 1057 "perly.y" + { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } break; case 157: -#line 1057 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); +#line 1059 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); } break; case 158: -#line 1060 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, +#line 1062 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-4].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); } @@ -1226,8 +1228,8 @@ case 2: break; case 159: -#line 1065 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, +#line 1067 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-3].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); } @@ -1235,31 +1237,31 @@ case 2: break; case 160: -#line 1070 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); +#line 1072 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); } break; case 161: -#line 1073 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, +#line 1075 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-5].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } break; case 162: -#line 1077 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, +#line 1079 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-4].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } break; case 163: -#line 1081 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1083 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-3].val.opval)))); if (parser->expect == XBLOCK) parser->expect = XOPERATOR; @@ -1268,8 +1270,8 @@ case 2: break; case 164: -#line 1087 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1089 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-4].val.opval))))); if (parser->expect == XBLOCK) @@ -1279,8 +1281,8 @@ case 2: break; case 165: -#line 1095 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1097 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-3].val.opval))))); if (parser->expect == XBLOCK) @@ -1290,8 +1292,8 @@ case 2: break; case 166: -#line 1102 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1104 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-2].val.opval)))); if (parser->expect == XBLOCK) parser->expect = XOPERATOR; @@ -1300,38 +1302,38 @@ case 2: break; case 167: -#line 1108 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } +#line 1110 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } break; case 168: -#line 1110 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } +#line 1112 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } break; case 169: -#line 1112 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); } +#line 1114 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); } break; case 170: -#line 1117 "perly.y" - { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } +#line 1119 "perly.y" + { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } break; case 171: -#line 1119 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1121 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 172: -#line 1121 "perly.y" - { if ((ps[-1].val.ival) != OP_REPEAT) +#line 1123 "perly.y" + { if ((ps[-1].val.ival) != OP_REPEAT) scalar((ps[-2].val.opval)); (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval))); } @@ -1339,184 +1341,184 @@ case 2: break; case 173: -#line 1126 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1128 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 174: -#line 1128 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1130 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 175: -#line 1130 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1132 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 176: -#line 1132 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1134 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 177: -#line 1134 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1136 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 178: -#line 1136 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1138 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 179: -#line 1138 "perly.y" - { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1140 "perly.y" + { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 180: -#line 1140 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1142 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 181: -#line 1142 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1144 "perly.y" + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 182: -#line 1144 "perly.y" - { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1146 "perly.y" + { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 183: -#line 1146 "perly.y" - { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1148 "perly.y" + { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 184: -#line 1150 "perly.y" - { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } +#line 1152 "perly.y" + { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; case 185: -#line 1152 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1154 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 186: -#line 1154 "perly.y" - { yyerror("syntax error"); YYERROR; } +#line 1156 "perly.y" + { yyerror("syntax error"); YYERROR; } break; case 187: -#line 1156 "perly.y" - { yyerror("syntax error"); YYERROR; } +#line 1158 "perly.y" + { yyerror("syntax error"); YYERROR; } break; case 188: -#line 1160 "perly.y" - { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1162 "perly.y" + { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 189: -#line 1162 "perly.y" - { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1164 "perly.y" + { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 190: -#line 1166 "perly.y" - { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } +#line 1168 "perly.y" + { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; case 191: -#line 1168 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } +#line 1170 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 192: -#line 1170 "perly.y" - { yyerror("syntax error"); YYERROR; } +#line 1172 "perly.y" + { yyerror("syntax error"); YYERROR; } break; case 193: -#line 1172 "perly.y" - { yyerror("syntax error"); YYERROR; } +#line 1174 "perly.y" + { yyerror("syntax error"); YYERROR; } break; case 194: -#line 1176 "perly.y" - { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1178 "perly.y" + { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 195: -#line 1178 "perly.y" - { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1180 "perly.y" + { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 196: -#line 1183 "perly.y" - { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } +#line 1185 "perly.y" + { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } break; case 197: -#line 1185 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1187 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 198: -#line 1188 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } +#line 1190 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } break; case 199: -#line 1190 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } +#line 1192 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } break; case 200: -#line 1192 "perly.y" - { (yyval.opval) = newUNOP(OP_POSTINC, 0, +#line 1194 "perly.y" + { (yyval.opval) = newUNOP(OP_POSTINC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); } break; case 201: -#line 1195 "perly.y" - { (yyval.opval) = newUNOP(OP_POSTDEC, 0, +#line 1197 "perly.y" + { (yyval.opval) = newUNOP(OP_POSTDEC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));} break; case 202: -#line 1198 "perly.y" - { (yyval.opval) = op_convert_list(OP_JOIN, 0, +#line 1200 "perly.y" + { (yyval.opval) = op_convert_list(OP_JOIN, 0, op_append_elem( OP_LIST, newSVREF(scalar( @@ -1530,138 +1532,138 @@ case 2: break; case 203: -#line 1209 "perly.y" - { (yyval.opval) = newUNOP(OP_PREINC, 0, +#line 1211 "perly.y" + { (yyval.opval) = newUNOP(OP_PREINC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); } break; case 204: -#line 1212 "perly.y" - { (yyval.opval) = newUNOP(OP_PREDEC, 0, +#line 1214 "perly.y" + { (yyval.opval) = newUNOP(OP_PREDEC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); } break; case 205: -#line 1220 "perly.y" - { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } +#line 1222 "perly.y" + { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } break; case 206: -#line 1222 "perly.y" - { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } +#line 1224 "perly.y" + { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } break; case 207: -#line 1224 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); +#line 1226 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); } break; case 208: -#line 1227 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); +#line 1229 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); } break; case 209: -#line 1233 "perly.y" - { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} +#line 1235 "perly.y" + { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} break; case 210: -#line 1235 "perly.y" - { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} +#line 1237 "perly.y" + { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} break; case 215: -#line 1243 "perly.y" - { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } +#line 1245 "perly.y" + { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 216: -#line 1245 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } +#line 1247 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } break; case 217: -#line 1247 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1249 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 218: -#line 1249 "perly.y" - { (yyval.opval) = localize((ps[0].val.opval),0); } +#line 1251 "perly.y" + { (yyval.opval) = localize((ps[0].val.opval),0); } break; case 219: -#line 1251 "perly.y" - { (yyval.opval) = sawparens((ps[-1].val.opval)); } +#line 1253 "perly.y" + { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; case 220: -#line 1253 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1255 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 221: -#line 1255 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); } +#line 1257 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; case 222: -#line 1257 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1259 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 223: -#line 1259 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1261 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 224: -#line 1261 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1263 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 225: -#line 1263 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1265 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 226: -#line 1265 "perly.y" - { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} +#line 1267 "perly.y" + { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} break; case 227: -#line 1267 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1269 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 228: -#line 1269 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_ASLICE, +#line 1271 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, list((ps[-1].val.opval)), @@ -1674,8 +1676,8 @@ case 2: break; case 229: -#line 1279 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_KVASLICE, +#line 1281 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_KVASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVASLICE, 0, list((ps[-1].val.opval)), @@ -1688,8 +1690,8 @@ case 2: break; case 230: -#line 1289 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_HSLICE, +#line 1291 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, list((ps[-2].val.opval)), @@ -1702,8 +1704,8 @@ case 2: break; case 231: -#line 1299 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, +#line 1301 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVHSLICE, 0, list((ps[-2].val.opval)), @@ -1716,27 +1718,27 @@ case 2: break; case 232: -#line 1309 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1311 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 233: -#line 1311 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } +#line 1313 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } break; case 234: -#line 1313 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); +#line 1315 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); } break; case 235: -#line 1316 "perly.y" - { +#line 1318 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval)))); } @@ -1744,153 +1746,153 @@ case 2: break; case 236: -#line 1321 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1323 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } break; case 237: -#line 1325 "perly.y" - { (yyval.opval) = newSVREF((ps[-3].val.opval)); } +#line 1327 "perly.y" + { (yyval.opval) = newSVREF((ps[-3].val.opval)); } break; case 238: -#line 1327 "perly.y" - { (yyval.opval) = newAVREF((ps[-3].val.opval)); } +#line 1329 "perly.y" + { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; case 239: -#line 1329 "perly.y" - { (yyval.opval) = newHVREF((ps[-3].val.opval)); } +#line 1331 "perly.y" + { (yyval.opval) = newHVREF((ps[-3].val.opval)); } break; case 240: -#line 1331 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, +#line 1333 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); } break; case 241: -#line 1334 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } +#line 1336 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } break; case 242: -#line 1336 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); +#line 1338 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); PL_hints |= HINT_BLOCK_SCOPE; } break; case 243: -#line 1339 "perly.y" - { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } +#line 1341 "perly.y" + { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } break; case 244: -#line 1341 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } +#line 1343 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } break; case 245: -#line 1343 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), 0); } +#line 1345 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; case 246: -#line 1345 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } +#line 1347 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 247: -#line 1347 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } +#line 1349 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 248: -#line 1349 "perly.y" - { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } +#line 1351 "perly.y" + { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } break; case 249: -#line 1351 "perly.y" - { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } +#line 1353 "perly.y" + { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } break; case 250: -#line 1353 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } +#line 1355 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; case 251: -#line 1355 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, +#line 1357 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } break; case 252: -#line 1358 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), 0); } +#line 1360 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; case 253: -#line 1360 "perly.y" - { (yyval.opval) = newOP((ps[-2].val.ival), 0);} +#line 1362 "perly.y" + { (yyval.opval) = newOP((ps[-2].val.ival), 0);} break; case 254: -#line 1362 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1364 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 255: -#line 1364 "perly.y" - { (yyval.opval) = (ps[-2].val.opval); } +#line 1366 "perly.y" + { (yyval.opval) = (ps[-2].val.opval); } break; case 256: -#line 1366 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } +#line 1368 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; case 257: -#line 1368 "perly.y" - { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT) +#line 1370 "perly.y" + { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT) ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0))) : newOP((ps[-2].val.ival), OPf_SPECIAL); } break; case 258: -#line 1372 "perly.y" - { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } +#line 1374 "perly.y" + { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 259: -#line 1374 "perly.y" - { +#line 1376 "perly.y" + { if ( (ps[0].val.opval)->op_type != OP_TRANS && (ps[0].val.opval)->op_type != OP_TRANSR && (((PMOP*)(ps[0].val.opval))->op_pmflags & PMf_HAS_CV)) @@ -1904,192 +1906,191 @@ case 2: break; case 260: -#line 1385 "perly.y" - { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } +#line 1387 "perly.y" + { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } break; case 264: -#line 1394 "perly.y" - { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } +#line 1396 "perly.y" + { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } break; case 265: -#line 1396 "perly.y" - { (yyval.opval) = localize((ps[0].val.opval),1); } +#line 1398 "perly.y" + { (yyval.opval) = localize((ps[0].val.opval),1); } break; case 266: -#line 1398 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); } +#line 1400 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); } break; case 267: -#line 1400 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); } +#line 1402 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); } break; case 268: -#line 1405 "perly.y" - { (yyval.opval) = sawparens((ps[-1].val.opval)); } +#line 1407 "perly.y" + { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; case 269: -#line 1407 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); } +#line 1409 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; case 270: -#line 1410 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1412 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 271: -#line 1412 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1414 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 272: -#line 1414 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1416 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 278: -#line 1430 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1432 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; case 279: -#line 1436 "perly.y" - { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } +#line 1438 "perly.y" + { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } break; case 280: -#line 1441 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } +#line 1443 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; case 281: -#line 1443 "perly.y" - { +#line 1445 "perly.y" + { (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 283: -#line 1450 "perly.y" - { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } +#line 1452 "perly.y" + { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } break; case 291: -#line 1467 "perly.y" - { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } +#line 1469 "perly.y" + { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } break; case 292: -#line 1471 "perly.y" - { (yyval.opval) = newSVREF((ps[0].val.opval)); } +#line 1473 "perly.y" + { (yyval.opval) = newSVREF((ps[0].val.opval)); } break; case 293: -#line 1475 "perly.y" - { (yyval.opval) = newAVREF((ps[0].val.opval)); +#line 1477 "perly.y" + { (yyval.opval) = newAVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } break; case 294: -#line 1481 "perly.y" - { (yyval.opval) = newHVREF((ps[0].val.opval)); +#line 1483 "perly.y" + { (yyval.opval) = newHVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } break; case 295: -#line 1487 "perly.y" - { (yyval.opval) = newAVREF((ps[0].val.opval)); } +#line 1489 "perly.y" + { (yyval.opval) = newAVREF((ps[0].val.opval)); } break; case 296: -#line 1489 "perly.y" - { (yyval.opval) = newAVREF((ps[-3].val.opval)); } +#line 1491 "perly.y" + { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; case 297: -#line 1493 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } +#line 1495 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } break; case 299: -#line 1498 "perly.y" - { (yyval.opval) = newAVREF((ps[-2].val.opval)); } +#line 1500 "perly.y" + { (yyval.opval) = newAVREF((ps[-2].val.opval)); } break; case 301: -#line 1503 "perly.y" - { (yyval.opval) = newHVREF((ps[-2].val.opval)); } +#line 1505 "perly.y" + { (yyval.opval) = newHVREF((ps[-2].val.opval)); } break; case 303: -#line 1508 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } +#line 1510 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } break; case 304: -#line 1513 "perly.y" - { (yyval.opval) = scalar((ps[0].val.opval)); } +#line 1515 "perly.y" + { (yyval.opval) = scalar((ps[0].val.opval)); } break; case 305: -#line 1515 "perly.y" - { (yyval.opval) = scalar((ps[0].val.opval)); } +#line 1517 "perly.y" + { (yyval.opval) = scalar((ps[0].val.opval)); } break; case 306: -#line 1517 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } +#line 1519 "perly.y" + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 307: -#line 1520 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } +#line 1522 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - default: break; /* Generated from: - * b4fc8c1d307bdc8f64eba56825513a87509f0ed05acf77fb0e96c7e5a1d41802 perly.y + * d3f87734f869a9179fa48a601c04af8339f2360e854d5e6f2e8107a579d753a1 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl * ex: set ro: */ @@ -4,14 +4,14 @@ Any changes made here will be lost! */ -#define PERL_BISON_VERSION 30005 +#define PERL_BISON_VERSION 30003 #ifdef PERL_CORE -/* A Bison parser, made by GNU Bison 3.5.1. */ +/* A Bison parser, made by GNU Bison 3.3. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -197,6 +197,7 @@ S_is_opval_token(int type) { #endif /* PERL_IN_TOKE_C */ #endif /* PERL_CORE */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + union YYSTYPE { @@ -206,8 +207,8 @@ union YYSTYPE OP *opval; GV *gvval; - }; + typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 @@ -219,6 +220,6 @@ int yyparse (void); /* Generated from: - * b4fc8c1d307bdc8f64eba56825513a87509f0ed05acf77fb0e96c7e5a1d41802 perly.y + * d3f87734f869a9179fa48a601c04af8339f2360e854d5e6f2e8107a579d753a1 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl * ex: set ro: */ @@ -20,15 +20,14 @@ #define YYUNDEFTOK 2 #define YYMAXUTOK 369 - /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ - (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ -static const yytype_int8 yytranslate[] = +static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -71,7 +70,7 @@ static const yytype_int8 yytranslate[] = #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int16 yyrline[] = +static const yytype_uint16 yyrline[] = { 0, 153, 153, 152, 164, 163, 174, 173, 187, 186, 200, 199, 213, 212, 223, 222, 235, 243, 247, 254, @@ -84,26 +83,26 @@ static const yytype_int16 yyrline[] = 609, 615, 616, 621, 632, 633, 638, 640, 645, 652, 653, 657, 661, 665, 670, 674, 678, 679, 682, 688, 693, 699, 700, 705, 706, 711, 712, 719, 724, 726, - 737, 739, 744, 746, 750, 770, 771, 773, 779, 844, - 846, 852, 854, 858, 864, 865, 870, 871, 875, 879, - 879, 946, 947, 952, 964, 965, 969, 980, 982, 984, - 988, 990, 995, 999, 1003, 1007, 1013, 1018, 1024, 1030, - 1032, 1034, 1037, 1036, 1047, 1048, 1052, 1056, 1059, 1064, - 1069, 1072, 1076, 1080, 1086, 1094, 1101, 1107, 1109, 1111, - 1116, 1118, 1120, 1125, 1127, 1129, 1131, 1133, 1135, 1137, - 1139, 1141, 1143, 1145, 1149, 1151, 1153, 1155, 1159, 1161, - 1165, 1167, 1169, 1171, 1175, 1177, 1182, 1184, 1187, 1189, - 1191, 1194, 1197, 1208, 1211, 1219, 1221, 1223, 1226, 1232, - 1234, 1238, 1239, 1240, 1241, 1242, 1244, 1246, 1248, 1250, - 1252, 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1278, - 1288, 1298, 1308, 1310, 1312, 1315, 1320, 1324, 1326, 1328, - 1330, 1333, 1335, 1338, 1340, 1342, 1344, 1346, 1348, 1350, - 1352, 1354, 1357, 1359, 1361, 1363, 1365, 1367, 1371, 1374, - 1373, 1386, 1387, 1388, 1393, 1395, 1397, 1399, 1404, 1406, - 1409, 1411, 1413, 1419, 1420, 1424, 1425, 1429, 1430, 1435, - 1440, 1442, 1446, 1449, 1453, 1454, 1455, 1458, 1459, 1462, - 1463, 1466, 1470, 1474, 1480, 1486, 1488, 1492, 1496, 1497, - 1501, 1502, 1506, 1507, 1512, 1514, 1516, 1519 + 737, 739, 744, 746, 750, 770, 771, 773, 786, 846, + 848, 854, 856, 860, 866, 867, 872, 873, 877, 881, + 881, 948, 949, 954, 966, 967, 971, 982, 984, 986, + 990, 992, 997, 1001, 1005, 1009, 1015, 1020, 1026, 1032, + 1034, 1036, 1039, 1038, 1049, 1050, 1054, 1058, 1061, 1066, + 1071, 1074, 1078, 1082, 1088, 1096, 1103, 1109, 1111, 1113, + 1118, 1120, 1122, 1127, 1129, 1131, 1133, 1135, 1137, 1139, + 1141, 1143, 1145, 1147, 1151, 1153, 1155, 1157, 1161, 1163, + 1167, 1169, 1171, 1173, 1177, 1179, 1184, 1186, 1189, 1191, + 1193, 1196, 1199, 1210, 1213, 1221, 1223, 1225, 1228, 1234, + 1236, 1240, 1241, 1242, 1243, 1244, 1246, 1248, 1250, 1252, + 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1280, + 1290, 1300, 1310, 1312, 1314, 1317, 1322, 1326, 1328, 1330, + 1332, 1335, 1337, 1340, 1342, 1344, 1346, 1348, 1350, 1352, + 1354, 1356, 1359, 1361, 1363, 1365, 1367, 1369, 1373, 1376, + 1375, 1388, 1389, 1390, 1395, 1397, 1399, 1401, 1406, 1408, + 1411, 1413, 1415, 1421, 1422, 1426, 1427, 1431, 1432, 1437, + 1442, 1444, 1448, 1451, 1455, 1456, 1457, 1460, 1461, 1464, + 1465, 1468, 1472, 1476, 1482, 1488, 1490, 1494, 1498, 1499, + 1503, 1504, 1508, 1509, 1514, 1516, 1518, 1521 }; #endif @@ -158,7 +157,7 @@ static const char *const yytname[] = # ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = +static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, @@ -175,15 +174,15 @@ static const yytype_int16 yytoknum[] = }; # endif -#define YYPACT_NINF (-507) +#define YYPACT_NINF -507 -#define yypact_value_is_default(Yyn) \ - ((Yyn) == YYPACT_NINF) +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-507))) -#define YYTABLE_NINF (-303) +#define YYTABLE_NINF -303 -#define yytable_value_is_error(Yyn) \ - ((Yyn) == YYTABLE_NINF) +#define yytable_value_is_error(Yytable_value) \ + (!!((Yytable_value) == (-303))) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ @@ -256,7 +255,7 @@ static const yytype_int16 yypact[] = /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ -static const yytype_int16 yydefact[] = +static const yytype_uint16 yydefact[] = { 0, 2, 4, 6, 8, 10, 12, 14, 0, 19, 17, 0, 0, 0, 17, 129, 1, 17, 0, 17, @@ -1068,7 +1067,7 @@ static const yytype_uint8 yyr1[] = }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_int8 yyr2[] = +static const yytype_uint8 yyr2[] = { 0, 2, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 4, 0, 7, 0, @@ -1153,6 +1152,6 @@ static const toketypes yy_type_tab[] = }; /* Generated from: - * b4fc8c1d307bdc8f64eba56825513a87509f0ed05acf77fb0e96c7e5a1d41802 perly.y + * d3f87734f869a9179fa48a601c04af8339f2360e854d5e6f2e8107a579d753a1 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl * ex: set ro: */ @@ -749,15 +749,15 @@ sigslurpsigil: /* @, %, @foo, %foo */ sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */ { - I32 sigil = $sigslurpsigil; - OP *var = $sigvarname; - OP *defexpr = $sigdefault; + I32 sigil = $sigslurpsigil; + OP *var = $sigvarname; + OP *defop = $sigdefault; if (parser->sig_slurpy) yyerror("Multiple slurpy parameters not allowed"); parser->sig_slurpy = (char)sigil; - if (defexpr) + if (defop) yyerror("A slurpy parameter may not have " "a default value"); @@ -769,26 +769,35 @@ sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */ sigdefault : empty | ASSIGNOP - { $$ = newOP(OP_NULL, 0); } + { $$ = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); } | ASSIGNOP term - { $$ = $term; } + { + I32 flags = 0; + if ($ASSIGNOP == OP_DORASSIGN) + flags |= OPpARG_IF_UNDEF << 8; + if ($ASSIGNOP == OP_ORASSIGN) + flags |= OPpARG_IF_FALSE << 8; + $$ = newARGDEFELEMOP(flags, $term, parser->sig_elems); + } /* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */ sigscalarelem: PERLY_DOLLAR sigvarname sigdefault { - OP *var = $sigvarname; - OP *defexpr = $sigdefault; + OP *var = $sigvarname; + OP *defop = $sigdefault; if (parser->sig_slurpy) yyerror("Slurpy parameter not last"); parser->sig_elems++; - if (defexpr) { + if (defop) { parser->sig_optelems++; + OP *defexpr = cLOGOPx(defop)->op_first; + if ( defexpr->op_type == OP_NULL && !(defexpr->op_flags & OPf_KIDS)) { @@ -796,17 +805,10 @@ sigscalarelem: if (var) yyerror("Optional parameter " "lacks default expression"); - op_free(defexpr); + op_free(defop); } else { /* a normal '=default' expression */ - OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM, - defexpr, - LINKLIST(defexpr)); - /* re-purpose op_targ to hold @_ index */ - defop->op_targ = - (PADOFFSET)(parser->sig_elems - 1); - if (var) { var->op_flags |= OPf_STACKED; (void)op_sibling_splice(var, diff --git a/pod/perldelta.pod b/pod/perldelta.pod index 58f02cb450..6605efab1c 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -27,6 +27,14 @@ here, but most should go in the L</Performance Enhancements> section. [ List each enhancement as a =head2 entry ] +=head2 Defined-or and logical-or assignment default expressions to signatures + +The default expression for a subroutine signature parameter can now be +assigned using the C<//=> or C<||=> operators, to apply the defaults whenever +the caller provided an undefined or false value (respectively), rather than +simply when the parameter is missing entirely. For more detail see the +documentation in L<perlsub>. + =head1 Security XXX Any security-related notices go here. In particular, any security diff --git a/pod/perlsub.pod b/pod/perlsub.pod index 0a50d9bdd2..db51b45eb5 100644 --- a/pod/perlsub.pod +++ b/pod/perlsub.pod @@ -401,6 +401,24 @@ one parameter vary according to the earlier parameters. For example, print "$first_name $surname is known as \"$nickname\""; } +A default value expression can also be written using the C<//=> operator, +where it will be evaluated and used if the caller omitted a value or the +value provided was C<undef>. + + sub foo ($name //= "world") { + print "Hello, $name"; + } + + foo(undef); # will print "Hello, world" + +Similarly, the C<||=> operator can be used to provide a default +expression to be used whenever the caller provided a false value (and +remember that a missing or C<undef> value are also false). + + sub foo ($x ||= 10) { + return 5 + $x; + } + An optional parameter can be nameless just like a mandatory parameter. For example, @@ -7244,14 +7244,20 @@ PP(pp_argdefelem) assert(ix <= SSize_t_MAX); #endif - if (AvFILL(defav) >= ix) { - dSP; - SV **svp = av_fetch(defav, ix, FALSE); - SV *val = svp ? *svp : &PL_sv_undef; - XPUSHs(val); - RETURN; - } - return cLOGOPo->op_other; + if (AvFILL(defav) < ix) + return cLOGOPo->op_other; + + SV **svp = av_fetch(defav, ix, FALSE); + SV *val = svp ? *svp : &PL_sv_undef; + + if ((PL_op->op_private & OPpARG_IF_UNDEF) && !SvOK(val)) + return cLOGOPo->op_other; + if ((PL_op->op_private & OPpARG_IF_FALSE) && !SvTRUE(val)) + return cLOGOPo->op_other; + + dSP; + XPUSHs(val); + RETURN; } @@ -2591,6 +2591,11 @@ PERL_CALLCONV OP* Perl_newANONLIST(pTHX_ OP* o) PERL_CALLCONV OP* Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block); #define PERL_ARGS_ASSERT_NEWANONSUB +PERL_CALLCONV OP* Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP* expr, I32 argindex) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWARGDEFELEMOP \ + assert(expr) + PERL_CALLCONV OP* Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right) __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWASSIGNOP diff --git a/regen/op_private b/regen/op_private index 7150f20cc8..f4b0a44067 100644 --- a/regen/op_private +++ b/regen/op_private @@ -867,6 +867,11 @@ addbits('emptyavhv', # 4 OPpTARGET_MY ); +addbits('argdefelem', + 7 => qw(OPpARG_IF_UNDEF IF_UNDEF), + 6 => qw(OPpARG_IF_FALSE IF_FALSE), +); + 1; # ex: set ts=8 sts=4 sw=4 et: diff --git a/t/op/signatures.t b/t/op/signatures.t index 04e1003dee..e3204224e9 100644 --- a/t/op/signatures.t +++ b/t/op/signatures.t @@ -598,6 +598,18 @@ Mandatory parameter follows optional parameter at foo line 8, near "\$c," Mandatory parameter follows optional parameter at foo line 8, near "\$d) " EOF +sub t206 ($x, $y //= 3) { return $x + $y } +is eval("t206(5,4)"), 9, '//= present'; +is eval("t206(5)"), 8, '//= absent'; +is eval("t206(4,undef)"), 7, '//= undef'; +is eval("t206(4,0)"), 4, '//= zero'; + +sub t207 ($x, $y ||= 3) { return $x + $y } +is eval("t207(5,4)"), 9, '||= present'; +is eval("t207(5)"), 8, '||= absent'; +is eval("t207(4,undef)"), 7, '||= undef'; +is eval("t207(4,0)"), 7, '||= zero'; + sub t034 (@abc) { join("/", @abc).";".scalar(@abc) } is prototype(\&t034), undef; is eval("t034()"), ";0"; @@ -5090,7 +5090,23 @@ yyl_sigvar(pTHX_ char *s) PL_oldbufptr = s; ++s; - NEXTVAL_NEXTTOKE.ival = 0; + NEXTVAL_NEXTTOKE.ival = OP_SASSIGN; + force_next(ASSIGNOP); + PL_expect = XTERM; + } + else if(*s == '/' && s[1] == '/' && s[2] == '=') { + PL_oldbufptr = s; + + s += 3; + NEXTVAL_NEXTTOKE.ival = OP_DORASSIGN; + force_next(ASSIGNOP); + PL_expect = XTERM; + } + else if(*s == '|' && s[1] == '|' && s[2] == '=') { + PL_oldbufptr = s; + + s += 3; + NEXTVAL_NEXTTOKE.ival = OP_ORASSIGN; force_next(ASSIGNOP); PL_expect = XTERM; } |