12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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 list 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 list 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:
- ...
|