flip-flop

来自「UNIX下perl实现代码」· 代码 · 共 55 行

TXT
55
字号
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 returnsop_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:...

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?