injected some part of code to a function

pull/2069/head
Tiko7454 1 year ago
parent 442c1f6ee6
commit 8ef870bd9d
  1. 48
      slither/solc_parsing/declarations/function.py

@ -1453,6 +1453,27 @@ class FunctionSolc(CallerContextExpression):
break break
return begin_loop_node return begin_loop_node
def __inject_condition_expression_from_conditional_node(self, node: Node) -> Node:
temp_var_node, temp_var = self.__make_temporary_variable_declaration_node_from_condition(node)
if node.type == NodeType.IF:
self.__link_node_immediately_before(temp_var_node, node)
elif node.type == NodeType.IFLOOP:
if_loop_node = node
begin_loop_node: Optional[Node] = self.__find_start_loop_in_nodes_fathers(if_loop_node)
if begin_loop_node: # if BEGIN_LOOP is IF_LOOP's father, IF_LOOP represents `while`
temp_var_node_pre_loop = temp_var_node
temp_var_node_during_loop, _ = self.__make_temporary_variable_declaration_node_from_condition(
if_loop_node,
temp_var
)
self.__link_node_immediately_before(temp_var_node_during_loop, if_loop_node, begin_loop_node)
self.__link_node_immediately_before(temp_var_node_pre_loop, begin_loop_node)
else:
self.__link_node_immediately_before(temp_var_node, if_loop_node)
node.add_expression(Identifier(temp_var), bypass_verif_empty=True)
return temp_var_node
def _rewrite_ternary_as_if_else(self) -> bool: def _rewrite_ternary_as_if_else(self) -> bool:
ternary_found = True ternary_found = True
updated = False updated = False
@ -1462,31 +1483,8 @@ class FunctionSolc(CallerContextExpression):
has_cond = HasConditional(node.expression) has_cond = HasConditional(node.expression)
if has_cond.result(): if has_cond.result():
if node.is_conditional(): if node.is_conditional():
temp_var_node, temp_var = self.__make_temporary_variable_declaration_node_from_condition( temp_var_node = self.__inject_condition_expression_from_conditional_node(node)
node node = temp_var_node # goes back by new cfg
)
if node.type == NodeType.IF:
self.__link_node_immediately_before(temp_var_node, node)
elif node.type == NodeType.IFLOOP:
if_loop_node = node
begin_loop_node: Optional[Node] = self.__find_start_loop_in_nodes_fathers(if_loop_node)
if begin_loop_node: # if BEGIN_LOOP is IF_LOOP's father, IF_LOOP represents `while`
temp_var_node_pre_loop = temp_var_node
temp_var_node_during_loop, _ = self.__make_temporary_variable_declaration_node_from_condition(
if_loop_node,
temp_var
)
self.__link_node_immediately_before(temp_var_node_during_loop, if_loop_node, begin_loop_node)
self.__link_node_immediately_before(temp_var_node_pre_loop, begin_loop_node)
else:
self.__link_node_immediately_before(temp_var_node, if_loop_node)
else:
raise TypeError(f'Unknown conditional type {node.type}')
node.add_expression(Identifier(temp_var), bypass_verif_empty=True)
node = temp_var_node # goes back by cfg
st = SplitTernaryExpression(node.expression) st = SplitTernaryExpression(node.expression)
condition = st.condition condition = st.condition
if not condition: if not condition:

Loading…
Cancel
Save