summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embed.fnc1
-rw-r--r--embed.h1
-rw-r--r--lib/B/Op_private.pm8
-rw-r--r--op.c26
-rw-r--r--opcode.h239
-rw-r--r--perly.act861
-rw-r--r--perly.h11
-rw-r--r--perly.tab67
-rw-r--r--perly.y36
-rw-r--r--pod/perldelta.pod8
-rw-r--r--pod/perlsub.pod18
-rw-r--r--pp.c22
-rw-r--r--proto.h5
-rw-r--r--regen/op_private5
-rw-r--r--t/op/signatures.t12
-rw-r--r--toke.c18
16 files changed, 725 insertions, 613 deletions
diff --git a/embed.fnc b/embed.fnc
index a79194a9ca..70656e6dfe 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -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
diff --git a/embed.h b/embed.h
index fd71b8ece6..af217e424a 100644
--- a/embed.h
+++ b/embed.h
@@ -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};
diff --git a/op.c b/op.c
index eec6da5067..8851dce046 100644
--- a/op.c
+++ b/op.c
@@ -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>
diff --git a/opcode.h b/opcode.h
index f882391085..8a66677edb 100644
--- a/opcode.h
+++ b/opcode.h
@@ -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),
diff --git a/perly.act b/perly.act
index d5cb2da896..35ba7b7dbc 100644
--- a/perly.act
+++ b/perly.act
@@ -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: */
diff --git a/perly.h b/perly.h
index b536dcb705..29826de799 100644
--- a/perly.h
+++ b/perly.h
@@ -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: */
diff --git a/perly.tab b/perly.tab
index bd2fbd3701..d05783e536 100644
--- a/perly.tab
+++ b/perly.tab
@@ -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: */
diff --git a/perly.y b/perly.y
index 1cb83cc9e5..23c8dd6ee8 100644
--- a/perly.y
+++ b/perly.y
@@ -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,
diff --git a/pp.c b/pp.c
index 490649f01f..0bc6b4cbdc 100644
--- a/pp.c
+++ b/pp.c
@@ -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;
}
diff --git a/proto.h b/proto.h
index 0fa3538abb..11fe86c481 100644
--- a/proto.h
+++ b/proto.h
@@ -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";
diff --git a/toke.c b/toke.c
index 8872d3c212..edc2690934 100644
--- a/toke.c
+++ b/toke.c
@@ -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;
}