def __init__(self, expression, node): from slither.core.cfg.node import NodeType self._expression = expression self._node = node self._result = [] self._visit_expression(self.expression) if node.type == NodeType.RETURN: r = Return(get(self.expression)) r.set_expression(expression) self._result.append(r) for ir in self._result: ir.set_node(node)
def __init__(self, expression, node): # pylint: disable=super-init-not-called from slither.core.cfg.node import NodeType # pylint: disable=import-outside-toplevel self._expression = expression self._node = node self._result = [] self._visit_expression(self.expression) if node.type == NodeType.RETURN: r = Return(get(self.expression)) r.set_expression(expression) self._result.append(r) for ir in self._result: ir.set_node(node)
def convert_expression(expression, node): # handle standlone expression # such as return true; from slither.core.cfg.node import NodeType if isinstance(expression, Literal) and node.type in [NodeType.IF, NodeType.IFLOOP]: cst = Constant(expression.value, expression.type) cond = Condition(cst) cond.set_expression(expression) cond.set_node(node) result = [cond] return result if isinstance(expression, Identifier) and node.type in [NodeType.IF, NodeType.IFLOOP]: cond = Condition(expression.value) cond.set_expression(expression) cond.set_node(node) result = [cond] return result visitor = ExpressionToSlithIR(expression, node) result = visitor.result() result = apply_ir_heuristics(result, node) if result: if node.type in [NodeType.IF, NodeType.IFLOOP]: assert isinstance(result[-1], (OperationWithLValue)) cond = Condition(result[-1].lvalue) cond.set_expression(expression) cond.set_node(node) result.append(cond) elif node.type == NodeType.RETURN: # May return None if isinstance(result[-1], (OperationWithLValue)): r = Return(result[-1].lvalue) r.set_expression(expression) r.set_node(node) result.append(r) return result