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
master
Andrzej Kotulski 9 years ago committed by facebook-github-bot-1
parent 84549f691d
commit cd77e41fbb

@ -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

Loading…
Cancel
Save