S_check_for_bool_cxt(OP*o, bool safe_and, U8 bool_flag, U8 maybe_flag)
{
OP *lop;
+ U8 flag = 0;
assert((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR);
+ /* OPpTARGET_MY and boolean context probably don't mix well.
+ * If someone finds a valid use case, maybe add an extra flag to this
+ * function which indicates its safe to do so for this op? */
+ assert(!( (PL_opargs[o->op_type] & OA_TARGLEX)
+ && (o->op_private & OPpTARGET_MY)));
+
lop = o->op_next;
while (lop) {
case OP_XOR:
case OP_COND_EXPR:
case OP_GREPWHILE:
- o->op_private |= bool_flag;
+ flag = bool_flag;
lop = NULL;
break;
*/
case OP_AND:
if (safe_and) {
- o->op_private |= bool_flag;
+ flag = bool_flag;
lop = NULL;
break;
}
case OP_OR:
case OP_DOR:
if ((lop->op_flags & OPf_WANT) == OPf_WANT_VOID) {
- o->op_private |= bool_flag;
+ flag = bool_flag;
lop = NULL;
}
else if (!(lop->op_flags & OPf_WANT)) {
/* unknown context - decide at runtime */
- o->op_private |= maybe_flag;
+ flag = maybe_flag;
lop = NULL;
}
break;
if (lop)
lop = lop->op_next;
}
+
+ o->op_private |= flag;
}