This commit is contained in:
caandt
2025-08-06 12:21:37 -05:00
parent cd72a53400
commit 90b655442e
2 changed files with 8 additions and 6 deletions
@@ -187,6 +187,9 @@ class CFG(DiGraph_CFT):
self.iteration_graphs[-1].append(dot.to_string()) self.iteration_graphs[-1].append(dot.to_string())
def cdg(self) -> CFG: def cdg(self) -> CFG:
self.add_nodes_from([self.start, self.end])
self.add_edges_from((self.start, n, EdgeKind.Meta.prop()) for n in self.nodes if self.in_degree(n) == 0)
self.add_edges_from((n, self.end, EdgeKind.Meta.prop()) for n in self.nodes if all(e["kind"] is EdgeKind.Exception for _, _, e in self.out_edges(n, data=True)))
pdt = nx.create_empty_copy(self) pdt = nx.create_empty_copy(self)
pdt.add_edges_from((B, A) for A, B in nx.immediate_dominators(self.reverse(), self.end).items()) pdt.add_edges_from((B, A) for A, B in nx.immediate_dominators(self.reverse(), self.end).items())
pdt.remove_edge(self.end, self.end) pdt.remove_edge(self.end, self.end)
@@ -33,6 +33,9 @@ class CDG(ControlFlowTemplate):
cfg.clear() cfg.clear()
cfg.add_node(cdg) cfg.add_node(cdg)
for p, n in nx.dfs_edges(cdg.cdg, cfg.start):
cdg.cdg.nodes[n]["indent"] = cdg.cdg.nodes[p].get("indent", -1) + 1
cdg.cdg.remove_node(cfg.start)
return cdg return cdg
@override @override
@@ -41,11 +44,7 @@ class CDG(ControlFlowTemplate):
@override @override
def to_indented_source(self, source): def to_indented_source(self, source):
cdg = self.cdg
for p, n in nx.dfs_edges(cdg, self.start):
cdg.nodes[n]["indent"] = cdg.nodes[p].get("indent", -1) + 1
cdg.remove_node(self.start)
src = [] src = []
for n in sorted(cdg.nodes, key=lambda x: x.offset): for n in sorted(self.cdg.nodes, key=lambda x: x.offset):
src.extend(source[n, cdg.nodes[n].get("indent", 0)]) src.extend(source[n, self.cdg.nodes[n].get("indent", 0)])
return src return src