freebsd-dev/contrib/perl5/ext/B/ramblings/flip-flop
2000-06-25 11:04:01 +00:00

55 lines
1.4 KiB
Plaintext

PP(pp_range)
{
if (GIMME == G_ARRAY)
return NORMAL;
if (SvTRUEx(PAD_SV(PL_op->op_targ)))
return cLOGOP->op_other;
else
return NORMAL;
}
pp_range is a LOGOP.
In array context, it just returns op_next.
In scalar context it checks the truth of targ and returns
op_other if true, op_next if false.
flip is an UNOP.
It "looks after" its child which is always a pp_range LOGOP.
In array context, it just returns the child's op_other.
In scalar context, there are three possible outcomes:
(1) set child's targ to 1, our targ to 1 and return op_next.
(2) set child's targ to 1, our targ to 0, sp-- and return child's op_other.
(3) Blank targ and TOPs and return op_next.
Case 1 happens for a "..." with a matching lineno... or true TOPs.
Case 2 happens for a ".." with a matching lineno... or true TOPs.
Case 3 happens for a non-matching lineno or false TOPs.
$a = lhs..rhs;
,-------> range
^ / \
| true/ \false
| / \
first| lhs rhs
| \ first /
^--- flip <----- flop
\ /
\ /
sassign
/* range */
if (SvTRUE(curpad[op->op_targ]))
goto label(op_other);
/* op_next */
...
/* flip */
/* For "..." returns op_next. For ".." returns op_next or op_first->op_other */
/* end of basic block */
goto out;
label(range op_other):
...
/* flop */
out:
...