From cd77e41fbbab2bbecf9477fd67b5055b62a02d81 Mon Sep 17 00:00:00 2001 From: Andrzej Kotulski Date: Wed, 9 Dec 2015 04:01:34 -0800 Subject: [PATCH] Simplify PriorityNode.compute_results_to_parent Summary: public some of the code was repeated. Make the function shorter by merging some cases Reviewed By: dulmarod Differential Revision: D2734056 fb-gh-sync-id: c84f04c --- infer/src/clang/cTrans_utils.ml | 48 +++++++++++++-------------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/infer/src/clang/cTrans_utils.ml b/infer/src/clang/cTrans_utils.ml index 549609034..31c427927 100644 --- a/infer/src/clang/cTrans_utils.ml +++ b/infer/src/clang/cTrans_utils.ml @@ -219,37 +219,27 @@ struct (* deals with creating or not a cfg node depending of owning the *) (* priority_node. It returns nodes, ids, instrs that should be passed to parent *) let compute_results_to_parent trans_state loc nd_name stmt_info res_states_children = - let mk_node res_state = + let res_state = collect_res_trans res_states_children in + let create_node = own_priority_node trans_state.priority stmt_info && res_state.instrs <> [] in + if create_node then + (* We need to create a node *) let ids_node = ids_to_node trans_state.continuation res_state.ids in + let ids_parent = ids_to_parent trans_state.continuation res_state.ids in let node_kind = Cfg.Node.Stmt_node (nd_name) in - Nodes.create_node node_kind ids_node res_state.instrs loc trans_state.context in - (* Invariant: if leaf_nodes is empty then the params have not created a node.*) - let res_state_param = collect_res_trans res_states_children in - let create_node = own_priority_node trans_state.priority stmt_info && res_state_param.instrs <> [] in - match res_state_param.root_nodes, create_node with - | _, false -> (* The node is created by the parent. We just pass back nodes/leafs params *) - { res_state_param with exps = []} - | [], true -> (* We need to create a node and params did not create a node.*) - let node' = mk_node res_state_param in - let ids_parent = ids_to_parent trans_state.continuation res_state_param.ids in - Cfg.Node.set_succs_exn node' trans_state.succ_nodes []; - { root_nodes =[node']; - leaf_nodes =[node']; - ids = ids_parent; - instrs =[]; - exps = []} - | _, true -> - (* We need to create a node but params also created some,*) - (* so we need to pass back the nodes/leafs params*) - let node' = mk_node res_state_param in - Cfg.Node.set_succs_exn node' trans_state.succ_nodes []; - let ids_parent = ids_to_parent trans_state.continuation res_state_param.ids in - IList.iter (fun n' -> Cfg.Node.set_succs_exn n' [node'] []) res_state_param.leaf_nodes; - { root_nodes = res_state_param.root_nodes; - leaf_nodes = [node']; - ids = ids_parent; - instrs =[]; - exps =[]} + let node = Nodes.create_node node_kind ids_node res_state.instrs loc trans_state.context in + Cfg.Node.set_succs_exn node trans_state.succ_nodes []; + IList.iter (fun leaf -> Cfg.Node.set_succs_exn leaf [node] []) res_state.leaf_nodes; + (* Invariant: if root_nodes is empty then the params have not created a node.*) + let root_nodes = (if res_state.root_nodes <> [] then res_state.root_nodes + else [node]) in + { root_nodes = root_nodes; + leaf_nodes = [node]; + ids = ids_parent; + instrs = []; + exps = []} + else + (* The node is created by the parent. We just pass back nodes/leafs params *) + { res_state with exps = []} end