about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--example/expression/access_c.py8
-rw-r--r--example/ida/depgraph.py6
-rw-r--r--miasm2/analysis/data_analysis.py4
-rw-r--r--miasm2/analysis/data_flow.py10
-rw-r--r--miasm2/analysis/depgraph.py8
-rw-r--r--miasm2/ir/ir.py14
-rw-r--r--test/analysis/data_flow.py2
-rw-r--r--test/analysis/depgraph.py24
8 files changed, 42 insertions, 34 deletions
diff --git a/example/expression/access_c.py b/example/expression/access_c.py
index 45f911ab..de158730 100644
--- a/example/expression/access_c.py
+++ b/example/expression/access_c.py
@@ -60,15 +60,15 @@ def find_call(ira):
 
     for irb in ira.blocks.values():
         out = set()
-        if len(irb.assignblks) < 2:
+        if len(irb) < 2:
             continue
-        assignblk = irb.assignblks[-2]
+        assignblk = irb[-2]
         for src in assignblk.itervalues():
             if not isinstance(src, ExprOp):
                 continue
             if not src.op.startswith('call_func'):
                 continue
-            out.add((irb, len(irb.assignblks) - 2))
+            out.add((irb, len(irb) - 2))
         if len(out) != 1:
             continue
         irb, index = out.pop()
@@ -98,7 +98,7 @@ def get_funcs_arg0(ctx, ira, lbl_head):
     element = ira.arch.regs.RSI
 
     for irb, index in find_call(ira):
-        instr = irb.assignblks[index].instr
+        instr = irb[index].instr
         print 'Analysing references from:', hex(instr.offset), instr
         g_list = g_dep.get(irb.label, set([element]), index, set([lbl_head]))
         for dep in g_list:
diff --git a/example/ida/depgraph.py b/example/ida/depgraph.py
index a946706c..5342313a 100644
--- a/example/ida/depgraph.py
+++ b/example/ida/depgraph.py
@@ -110,13 +110,13 @@ Method to use:
         elif mode == 1:
             return value + 1
         else:
-            return len(self.ira.blocks[self.label].assignblks)
+            return len(self.ira.blocks[self.label])
 
     @property
     def elements(self):
         value = self.cbReg.value
         if value in self.stk_args:
-            line = self.ira.blocks[self.label].assignblks[self.line_nb].instr
+            line = self.ira.blocks[self.label][self.line_nb].instr
             arg_num = self.stk_args[value]
             stk_high = m2_expr.ExprInt(idc.GetSpd(line.offset), ir_arch.sp.size)
             stk_off = m2_expr.ExprInt(self.ira.sp.size/8 * arg_num, ir_arch.sp.size)
@@ -174,7 +174,7 @@ def treat_element():
 
     for node in graph.relevant_nodes:
         try:
-            offset = ir_arch.blocks[node.label].assignblks[node.line_nb].instr.offset
+            offset = ir_arch.blocks[node.label][node.line_nb].instr.offset
         except IndexError:
             print "Unable to highlight %s" % node
             continue
diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py
index fd50c855..130d45a4 100644
--- a/miasm2/analysis/data_analysis.py
+++ b/miasm2/analysis/data_analysis.py
@@ -85,7 +85,7 @@ def intra_block_flow_symbexec(ir_arch, flow_graph, irb, in_nodes, out_nodes):
             continue
         read_values = v.get_r(cst_read=True)
         # print n_w, v, [str(x) for x in read_values]
-        node_n_w = get_node_name(irb.label, len(irb.assignblks), n_w)
+        node_n_w = get_node_name(irb.label, len(irb), n_w)
 
         for n_r in read_values:
             if n_r in current_nodes:
@@ -171,7 +171,7 @@ def create_implicit_flow(ir_arch, flow_graph, irb_in_nodes, irb_out_ndes):
                 # print "###", irb_son
                 # print "###", 'IN', [str(x) for x in irb_son.in_nodes]
 
-                node_n_w = irb.label, len(irb.assignblks), n_r
+                node_n_w = irb.label, len(irb), n_r
                 irb_out_nodes[irb.label][n_r] = node_n_w
                 if not n_r in irb_in_nodes[irb.label]:
                     irb_in_nodes[irb.label][n_r] = irb.label, 0, n_r
diff --git a/miasm2/analysis/data_flow.py b/miasm2/analysis/data_flow.py
index da79cf75..3a789cc3 100644
--- a/miasm2/analysis/data_flow.py
+++ b/miasm2/analysis/data_flow.py
@@ -59,7 +59,7 @@ class ReachingDefinitions(dict):
         predecessor_state = {}
         for pred_lbl in self.ir_a.graph.predecessors(block.label):
             pred = self.ir_a.blocks[pred_lbl]
-            for lval, definitions in self.get_definitions(pred_lbl, len(pred.assignblks)).iteritems():
+            for lval, definitions in self.get_definitions(pred_lbl, len(pred)).iteritems():
                 predecessor_state.setdefault(lval, set()).update(definitions)
 
         modified = self.get((block.label, 0)) != predecessor_state
@@ -67,7 +67,7 @@ class ReachingDefinitions(dict):
             return False
         self[(block.label, 0)] = predecessor_state
 
-        for index in xrange(len(block.assignblks)):
+        for index in xrange(len(block)):
             modified |= self.process_instruction(block, index)
         return modified
 
@@ -79,7 +79,7 @@ class ReachingDefinitions(dict):
         (@block, @assignblk_index + 1).
         """
 
-        instr = block.assignblks[assignblk_index]
+        instr = block[assignblk_index]
         defs = self.get_definitions(block.label, assignblk_index).copy()
         for lval in instr:
             defs.update({lval: set([(block.label, assignblk_index)])})
@@ -183,7 +183,7 @@ class DiGraphDefUse(DiGraph):
                                       attr={'align': 'center',
                                             'colspan': 2,
                                             'bgcolor': 'grey'})
-        src = self._blocks[lbl].assignblks[index][reg]
+        src = self._blocks[lbl][index][reg]
         line = "%s = %s" % (reg, src)
         yield self.DotCellDescription(text=line, attr={})
         yield self.DotCellDescription(text="", attr={})
@@ -215,7 +215,7 @@ def dead_simp_useful_instrs(defuse, reaching_defs):
         # Block has a nonexistant successor or is a leaf
         if keep_all_definitions or (len(successors) == 0):
             valid_definitions = reaching_defs.get_definitions(block_lbl,
-                                                              len(block.assignblks))
+                                                              len(block))
             for lval, definitions in valid_definitions.iteritems():
                 if (lval in ir_a.get_out_regs(block)
                     or keep_all_definitions):
diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py
index 50eea948..bd4bfa7e 100644
--- a/miasm2/analysis/depgraph.py
+++ b/miasm2/analysis/depgraph.py
@@ -265,9 +265,9 @@ class DependencyResult(DependencyState):
                 break
             assignmnts = {}
             for element in elements:
-                if element in irb.assignblks[line_nb]:
+                if element in irb[line_nb]:
                     # constants, label, ... are not in destination
-                    assignmnts[element] = irb.assignblks[line_nb][element]
+                    assignmnts[element] = irb[line_nb][element]
             assignblks.append(AssignBlock(assignmnts))
 
         return IRBlock(irb.label, assignblks)
@@ -581,9 +581,9 @@ class DependencyGraph(object):
         @state: instance of DependencyState"""
 
         irb = self._ira.blocks[state.label]
-        line_nb = len(irb.assignblks) if state.line_nb is None else state.line_nb
+        line_nb = len(irb) if state.line_nb is None else state.line_nb
 
-        for cur_line_nb, assignblk in reversed(list(enumerate(irb.assignblks[:line_nb]))):
+        for cur_line_nb, assignblk in reversed(list(enumerate(irb[:line_nb]))):
             self._track_exprs(state, assignblk, cur_line_nb)
 
     def get(self, label, elements, line_nb, heads):
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index 8b1a1033..f31db76b 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -288,6 +288,14 @@ class IRBlock(object):
         """Iterate on assignblks"""
         return self._assignblks.__iter__()
 
+    def __getitem__(self, index):
+        """Getitem on assignblks"""
+        return self._assignblks.__getitem__(index)
+
+    def __len__(self):
+        """Length of assignblks"""
+        return self._assignblks.__len__()
+
     def is_dst_set(self):
         return self._dst is not None
 
@@ -636,7 +644,7 @@ class IntermediateRepresentation(object):
             else:
                 dst = m2_expr.ExprId(next_lbl,
                                      self.pc.size)
-            assignblk = AssignBlock({self.IRDst: dst}, irblock.assignblks[-1].instr)
+            assignblk = AssignBlock({self.IRDst: dst}, irblock[-1].instr)
             ir_blocks[index] = IRBlock(irblock.label, list(irblock.assignblks) + [assignblk])
 
     def post_add_block(self, block, ir_blocks):
@@ -790,9 +798,9 @@ class IntermediateRepresentation(object):
         # Find candidates
         jmp_blocks = set()
         for block in self.blocks.itervalues():
-            if len(block.assignblks) != 1:
+            if len(block) != 1:
                 continue
-            assignblk = block.assignblks[0]
+            assignblk = block[0]
             if len(assignblk) > 1:
                 continue
             assert set(assignblk.keys()) == set([self.IRDst])
diff --git a/test/analysis/data_flow.py b/test/analysis/data_flow.py
index 207e13ff..f2e30172 100644
--- a/test/analysis/data_flow.py
+++ b/test/analysis/data_flow.py
@@ -635,7 +635,7 @@ G17_EXP_IRB0 = gen_irblock(LBL0, [[],
                                    ExprAff(b, a),
                                    ExprAff(c, b)],
 
-                                  G17_IRB0.assignblks[14]
+                                  G17_IRB0[14]
                                   # Trick because a+b+c != ((a+b)+c)
                                  ])
 
diff --git a/test/analysis/depgraph.py b/test/analysis/depgraph.py
index 20d558e2..290547fe 100644
--- a/test/analysis/depgraph.py
+++ b/test/analysis/depgraph.py
@@ -510,72 +510,72 @@ G17_IRA.blocks = dict([(irb.label, irb) for irb in [G17_IRB0, G17_IRB1,
 
 # Test graph 1
 G1_TEST1_DN1 = DependencyNode(
-    G1_IRB2.label, A, len(G1_IRB2.assignblks))
+    G1_IRB2.label, A, len(G1_IRB2))
 
 G1_INPUT = (set([G1_TEST1_DN1]), set([G1_IRB0.label]))
 
 # Test graph 2
 
 G2_TEST1_DN1 = DependencyNode(
-    G2_IRB2.label, A, len(G2_IRB2.assignblks))
+    G2_IRB2.label, A, len(G2_IRB2))
 
 G2_INPUT = (set([G2_TEST1_DN1]), set([G2_IRB0.label]))
 
 # Test graph 3
 
 G3_TEST1_0_DN1 = DependencyNode(
-    G3_IRB3.label, A, len(G3_IRB3.assignblks))
+    G3_IRB3.label, A, len(G3_IRB3))
 
 G3_INPUT = (set([G3_TEST1_0_DN1]), set([G3_IRB0.label]))
 
 # Test graph 4
 
 G4_TEST1_DN1 = DependencyNode(
-    G4_IRB2.label, A, len(G2_IRB0.assignblks))
+    G4_IRB2.label, A, len(G2_IRB0))
 
 G4_INPUT = (set([G4_TEST1_DN1]), set([G4_IRB0.label]))
 
 # Test graph 5
 
 G5_TEST1_0_DN1 = DependencyNode(
-    G5_IRB2.label, A, len(G5_IRB2.assignblks))
+    G5_IRB2.label, A, len(G5_IRB2))
 
 G5_INPUT = (set([G5_TEST1_0_DN1]), set([G5_IRB0.label]))
 
 # Test graph 6
 
 G6_TEST1_0_DN1 = DependencyNode(
-    G6_IRB1.label, A, len(G6_IRB1.assignblks))
+    G6_IRB1.label, A, len(G6_IRB1))
 
 G6_INPUT = (set([G6_TEST1_0_DN1]), set([G6_IRB0.label]))
 
 # Test graph 7
 
 G7_TEST1_0_DN1 = DependencyNode(
-    G7_IRB2.label, D, len(G7_IRB2.assignblks))
+    G7_IRB2.label, D, len(G7_IRB2))
 
 G7_INPUT = (set([G7_TEST1_0_DN1]), set([G7_IRB0.label]))
 
 # Test graph 8
 
 G8_TEST1_0_DN1 = DependencyNode(
-    G8_IRB2.label, A, len(G8_IRB2.assignblks))
+    G8_IRB2.label, A, len(G8_IRB2))
 
 G8_INPUT = (set([G8_TEST1_0_DN1]), set([G3_IRB0.label]))
 
 # Test 9: Multi elements
 
 G9_TEST1_0_DN1 = DependencyNode(
-    G8_IRB2.label, A, len(G8_IRB2.assignblks))
+    G8_IRB2.label, A, len(G8_IRB2))
 G9_TEST1_0_DN5 = DependencyNode(
-    G8_IRB2.label, C, len(G8_IRB2.assignblks))
+    G8_IRB2.label, C, len(G8_IRB2))
 
 G9_INPUT = (set([G9_TEST1_0_DN1, G9_TEST1_0_DN5]), set([G8_IRB0.label]))
 
 # Test 10: loop at beginning
 
 G10_TEST1_0_DN1 = DependencyNode(
-    G10_IRB2.label, A, len(G10_IRB2.assignblks))
+    G10_IRB2.label, A, len(G10_IRB2))
 
 G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label]))
 
@@ -583,7 +583,7 @@ G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label]))
 # Test 11: no dual bloc emulation
 
 G11_TEST1_DN1 = DependencyNode(
-    G11_IRB2.label, A, len(G11_IRB2.assignblks))
+    G11_IRB2.label, A, len(G11_IRB2))
 
 G11_INPUT = (set([G11_TEST1_DN1]), set([G11_IRB0.label]))