def simplify(clause): if isinstance(clause, ast.And): if len(clause.nodes) == 1: result = clause.nodes[0] else: return clause elif isinstance(clause, ast.Or): if len(clause.nodes) == 1: result = ast.Not(clause.nodes[0]) else: return clause else: return clause if getattr(result, 'endpos', 0) < clause.endpos: result.endpos = clause.endpos return result
def conditional_jump_new(decompiler, endpos, if_true): expr = decompiler.stack.pop() if decompiler.pos >= decompiler.conditions_end: clausetype = ast.Or if if_true else ast.And elif decompiler.pos in decompiler.or_jumps: clausetype = ast.Or if not if_true: expr = ast.Not(expr) else: clausetype = ast.And if if_true: expr = ast.Not(expr) decompiler.stack.append(expr) if decompiler.next_pos in decompiler.targets: decompiler.process_target(decompiler.next_pos) expr = decompiler.stack.pop() clause = clausetype([ expr ]) clause.endpos = endpos decompiler.targets.setdefault(endpos, clause) return clause
def UNARY_NOT(decompiler): return ast.Not(decompiler.stack.pop())