def visit_IF(self, node): expr_ = (yield ToVisit(node.children[0])) then_ = (yield ToVisit(node.children[1])) else_ = (yield ToVisit(node.children[2])) if len(node.children) == 3 else self.NOP if self.O_LEVEL >= 1: if chk.is_null(then_, else_): src.api.errmsg.warning_empty_if(node.lineno) yield self.NOP return block_accessed = chk.is_block_accessed(then_) or chk.is_block_accessed(else_) if not block_accessed and chk.is_number(expr_): # constant condition if expr_.value: # always true (then_) yield then_ else: # always false (else_) yield else_ return if chk.is_null(else_) and len(node.children) == 3: node.children.pop() # remove empty else yield node return for i in range(len(node.children)): node.children[i] = (expr_, then_, else_)[i] yield node
def visit_WHILE(self, node): expr_ = (yield node.children[0]) body_ = (yield node.children[1]) if self.O_LEVEL >= 1: if chk.is_number(expr_) and not expr_.value and not chk.is_block_accessed(body_): yield self.NOP return for i, child in enumerate((expr_, body_)): node.children[i] = child yield node
def visit_FOR(self, node): from_ = (yield node.children[1]) to_ = (yield node.children[2]) step_ = (yield node.children[3]) body_ = (yield node.children[4]) if self.O_LEVEL > 0 and chk.is_number(from_, to_, step_) and not chk.is_block_accessed(body_): if from_ > to_ and step_ > 0: yield self.NOP return if from_ < to_ and step_ < 0: yield self.NOP return for i, child in enumerate((from_, to_, step_, body_), start=1): node.children[i] = child yield node