about summary refs log tree commit diff stats
path: root/miasm2/analysis/depgraph.py
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2019-02-25 11:09:54 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2019-03-05 16:52:49 +0100
commit02bbb30efea4980c9d133947cbbf69fb599071ad (patch)
tree3fea6826fcc5354840a27cb1dc99ff31eef81896 /miasm2/analysis/depgraph.py
parenteab809932871f91d6f4aa770fc321af9e156e0f5 (diff)
downloadmiasm-02bbb30efea4980c9d133947cbbf69fb599071ad.tar.gz
miasm-02bbb30efea4980c9d133947cbbf69fb599071ad.zip
Support python2/python3
Diffstat (limited to 'miasm2/analysis/depgraph.py')
-rw-r--r--miasm2/analysis/depgraph.py43
1 files changed, 26 insertions, 17 deletions
diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py
index 4e5f0433..4bfae67f 100644
--- a/miasm2/analysis/depgraph.py
+++ b/miasm2/analysis/depgraph.py
@@ -1,5 +1,9 @@
 """Provide dependency graph"""
 
+from functools import total_ordering
+
+from future.utils import viewitems
+
 from miasm2.expression.expression import ExprInt, ExprLoc, ExprAssign
 from miasm2.core.graph import DiGraph
 from miasm2.core.locationdb import LocationDB
@@ -14,7 +18,7 @@ try:
 except ImportError:
     pass
 
-
+@total_ordering
 class DependencyNode(object):
 
     """Node elements of a DependencyGraph
@@ -50,16 +54,17 @@ class DependencyNode(object):
                 self.element == depnode.element and
                 self.line_nb == depnode.line_nb)
 
-    def __ne__(self, other):
-        return not self.__eq__(other)
+    def __ne__(self, depnode):
+        # required Python 2.7.14
+        return not self == depnode
 
-    def __cmp__(self, node):
+    def __lt__(self, node):
         """Compares @self with @node."""
         if not isinstance(node, self.__class__):
-            return cmp(self.__class__, node.__class__)
+            return NotImplemented
 
-        return cmp((self.loc_key, self.element, self.line_nb),
-                   (node.loc_key, node.element, node.line_nb))
+        return ((self.loc_key, self.element, self.line_nb) <
+                (node.loc_key, node.element, node.line_nb))
 
     def __str__(self):
         """Returns a string representation of DependencyNode"""
@@ -96,7 +101,7 @@ class DependencyState(object):
     def __init__(self, loc_key, pending, line_nb=None):
         self.loc_key = loc_key
         self.history = [loc_key]
-        self.pending = {k: set(v) for k, v in pending.iteritems()}
+        self.pending = {k: set(v) for k, v in viewitems(pending)}
         self.line_nb = line_nb
         self.links = set()
 
@@ -104,9 +109,11 @@ class DependencyState(object):
         self._graph = None
 
     def __repr__(self):
-        return "<State: %r (%r) (%r)>" % (self.loc_key,
-                                          self.pending,
-                                          self.links)
+        return "<State: %r (%r) (%r)>" % (
+            self.loc_key,
+            self.pending,
+            self.links
+        )
 
     def extend(self, loc_key):
         """Return a copy of itself, with itself in history
@@ -129,7 +136,7 @@ class DependencyState(object):
                 graph.add_node(node_a)
             else:
                 graph.add_edge(node_a, node_b)
-        for parent, sons in self.pending.iteritems():
+        for parent, sons in viewitems(self.pending):
             for son in sons:
                 graph.add_edge(parent, son)
         return graph
@@ -148,7 +155,7 @@ class DependencyState(object):
 
     def add_pendings(self, future_pending):
         """Add @future_pending to the state"""
-        for node, depnodes in future_pending.iteritems():
+        for node, depnodes in viewitems(future_pending):
             if node not in self.pending:
                 self.pending[node] = depnodes
             else:
@@ -263,7 +270,7 @@ class DependencyResult(DependencyState):
             line2elements.setdefault(depnode.line_nb,
                                      set()).add(depnode.element)
 
-        for line_nb, elements in sorted(line2elements.iteritems()):
+        for line_nb, elements in sorted(viewitems(line2elements)):
             if max_line is not None and line_nb >= max_line:
                 break
             assignmnts = {}
@@ -385,8 +392,10 @@ class DependencyResultImplicit(DependencyResult):
         self._solver = solver
 
         # Return only inputs values (others could be wrongs)
-        return {element: symb_exec.eval_expr(element)
-                for element in self.inputs}
+        return {
+            element: symb_exec.eval_expr(element)
+            for element in self.inputs
+        }
 
     @property
     def is_satisfiable(self):
@@ -562,7 +571,7 @@ class DependencyGraph(object):
         """Track pending expression in an assignblock"""
         future_pending = {}
         node_resolved = set()
-        for dst, src in assignblk.iteritems():
+        for dst, src in viewitems(assignblk):
             # Only track pending
             if dst not in state.pending:
                 continue