diff options
Diffstat (limited to 'op.c')
-rw-r--r-- | op.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -879,6 +879,7 @@ Perl_scalarvoid(pTHX_ OP *o) case OP_OR: case OP_AND: + case OP_DOR: case OP_COND_EXPR: for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling) scalarvoid(kid); @@ -1278,6 +1279,7 @@ Perl_mod(pTHX_ OP *o, I32 type) case OP_SASSIGN: case OP_ANDASSIGN: case OP_ORASSIGN: + case OP_DORASSIGN: PL_modcount++; break; @@ -1452,6 +1454,7 @@ S_scalar_mod_type(const OP *o, I32 type) case OP_RECV: case OP_ANDASSIGN: case OP_ORASSIGN: + case OP_DORASSIGN: return TRUE; default: return FALSE; @@ -3412,7 +3415,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right) OP *o; if (optype) { - if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN) { + if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN || optype == OP_DORASSIGN) { return newLOGOP(optype, 0, mod(scalar(left), optype), newUNOP(OP_SASSIGN, 0, scalar(right))); @@ -3759,7 +3762,9 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp) no_bareword_allowed(first); else if ((first->op_private & OPpCONST_BARE) && ckWARN(WARN_BAREWORD)) Perl_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional"); - if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) { + if ((type == OP_AND && SvTRUE(((SVOP*)first)->op_sv)) || + (type == OP_OR && !SvTRUE(((SVOP*)first)->op_sv)) || + (type == OP_DOR && !SvOK(((SVOP*)first)->op_sv))) { op_free(first); *firstp = NULL; if (other->op_type == OP_CONST) @@ -3774,7 +3779,8 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp) return first; } } - else if ((first->op_flags & OPf_KIDS) && ckWARN(WARN_MISC)) { + else if (type != OP_DOR && (first->op_flags & OPf_KIDS) + && ckWARN(WARN_MISC)) { const OP * const k1 = ((UNOP*)first)->op_first; const OP * const k2 = k1->op_sibling; OPCODE warnop = 0; @@ -3815,7 +3821,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp) if (!other) return first; - if (type == OP_ANDASSIGN || type == OP_ORASSIGN) + if (type == OP_ANDASSIGN || type == OP_ORASSIGN || type == OP_DORASSIGN) other->op_private |= OPpASSIGN_BACKWARDS; /* other is an OP_SASSIGN */ NewOp(1101, logop, 1, LOGOP); @@ -6931,8 +6937,10 @@ Perl_peep(pTHX_ register OP *o) case OP_GREPWHILE: case OP_AND: case OP_OR: + case OP_DOR: case OP_ANDASSIGN: case OP_ORASSIGN: + case OP_DORASSIGN: case OP_COND_EXPR: case OP_RANGE: o->op_seq = PL_op_seqmax++; |