diff options
| author | Camille Mougey <commial@gmail.com> | 2015-01-09 15:40:28 +0100 |
|---|---|---|
| committer | Camille Mougey <commial@gmail.com> | 2015-01-09 15:40:28 +0100 |
| commit | ae9004eec4ef264013208e1ce50f6e884a4da23f (patch) | |
| tree | e09503cc60f0ce9576a830a2bdc78b7f303961f2 /miasm2/core/graph.py | |
| parent | 0d6454f6b507c3c05c45507ffb56ac9f12eca536 (diff) | |
| parent | 48581006f578d7de1a5944c31952faa5a4e947b4 (diff) | |
| download | miasm-ae9004eec4ef264013208e1ce50f6e884a4da23f.tar.gz miasm-ae9004eec4ef264013208e1ce50f6e884a4da23f.zip | |
Merge pull request #32 from serpilliere/improve_liveness_analysis
Improve liveness analysis
Diffstat (limited to 'miasm2/core/graph.py')
| -rw-r--r-- | miasm2/core/graph.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/miasm2/core/graph.py b/miasm2/core/graph.py index 47047269..d29517cc 100644 --- a/miasm2/core/graph.py +++ b/miasm2/core/graph.py @@ -27,6 +27,17 @@ class DiGraph: self._nodes_to[n] = [] self._nodes_from[n] = [] + def del_node(self, node): + """Delete the @node of the graph; Also delete every edge to/from this + @node""" + + if node in self._nodes: + self._nodes.remove(node) + for pred in self.predecessors(node): + self.del_edge(pred, node) + for succ in self.successors(node): + self.del_edge(node, succ) + def add_edge(self, a, b): if not a in self._nodes: self.add_node(a) @@ -97,6 +108,20 @@ class DiGraph: out.append(path + [b]) return out + def get_all_parents(self, node): + """Return every parents nodes for a given @node""" + + todo = set([node]) + done = set() + while todo: + node = todo.pop() + if node in done: + continue + done.add(node) + for parent in self.predecessors(node): + todo.add(parent) + return done + def node2str(self, n): return str(n) |