about summary refs log tree commit diff stats
path: root/miasm2/core/graph.py
diff options
context:
space:
mode:
authorCamille Mougey <commial@gmail.com>2018-08-06 22:26:36 +0200
committerGitHub <noreply@github.com>2018-08-06 22:26:36 +0200
commite38b5dd91d10ad66d537675e4592f68eda9fcce2 (patch)
tree912333c96758461e9c226d8da037c0084d3c10a0 /miasm2/core/graph.py
parente4a255d9c6175b5d9f2ab15471d848705fe1cc4e (diff)
parentefc5ec2e8c394475e3a2be68bc29821e4d980b1b (diff)
downloadmiasm-e38b5dd91d10ad66d537675e4592f68eda9fcce2.tar.gz
miasm-e38b5dd91d10ad66d537675e4592f68eda9fcce2.zip
Merge pull request #816 from serpilliere/operator_high_level
Operator high level
Diffstat (limited to 'miasm2/core/graph.py')
-rw-r--r--miasm2/core/graph.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/miasm2/core/graph.py b/miasm2/core/graph.py
index d35148b1..a817c024 100644
--- a/miasm2/core/graph.py
+++ b/miasm2/core/graph.py
@@ -267,6 +267,12 @@ class DiGraph(object):
             for next_node in next_cb(node):
                 todo.add(next_node)
 
+    def predecessors_stop_node_iter(self, node, head):
+        if node == head:
+            raise StopIteration
+        for next_node in self.predecessors_iter(node):
+            yield next_node
+
     def reachable_sons(self, head):
         """Compute all nodes reachable from node @head. Each son is an
         immediate successor of an arbitrary, already yielded son of @head"""
@@ -277,6 +283,18 @@ class DiGraph(object):
         predecessor of an arbitrary, already yielded parent of @leaf"""
         return self._reachable_nodes(leaf, self.predecessors_iter)
 
+    def reachable_parents_stop_node(self, leaf, head):
+        """Compute all parents of node @leaf. Each parent is an immediate
+        predecessor of an arbitrary, already yielded parent of @leaf.
+        Do not compute reachables past @head node"""
+        return self._reachable_nodes(
+            leaf,
+            lambda node_cur: self.predecessors_stop_node_iter(
+                node_cur, head
+            )
+        )
+
+
     @staticmethod
     def _compute_generic_dominators(head, reachable_cb, prev_cb, next_cb):
         """Generic algorithm to compute either the dominators or postdominators