55 lines
1.4 KiB
Plaintext
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:
|
|
...
|