about summary refs log tree commit diff stats
path: root/miasm2/ir/symbexec.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/ir/symbexec.py')
-rw-r--r--miasm2/ir/symbexec.py23
1 files changed, 18 insertions, 5 deletions
diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py
index 76bb65b6..5bdcac2f 100644
--- a/miasm2/ir/symbexec.py
+++ b/miasm2/ir/symbexec.py
@@ -79,7 +79,7 @@ class symbols():
         return s
 
 
-class symbexec:
+class symbexec(object):
 
     def __init__(self, ir_arch, known_symbols,
                  func_read=None,
@@ -99,6 +99,8 @@ class symbexec:
         return None
 
     def eval_ExprId(self, e, eval_cache=None):
+        if eval_cache is None:
+            eval_cache = {}
         if isinstance(e.name, asmbloc.asm_label) and e.name.offset is not None:
             return ExprInt_from(e, e.name.offset)
         if not e in self.symbols:
@@ -110,6 +112,8 @@ class symbexec:
         return e
 
     def eval_ExprMem(self, e, eval_cache=None):
+        if eval_cache is None:
+            eval_cache = {}
         a_val = self.expr_simp(self.eval_expr(e.arg, eval_cache))
         if a_val != e.arg:
             a = self.expr_simp(ExprMem(a_val, size=e.size))
@@ -198,9 +202,13 @@ class symbexec:
         return tmp
 
     def eval_expr_visit(self, e, eval_cache=None):
+        if eval_cache is None:
+            eval_cache = {}
         # print 'visit', e, e.is_term
         if e.is_term:
             return e
+        if e in eval_cache:
+            return eval_cache[e]
         c = e.__class__
         deal_class = {ExprId: self.eval_ExprId,
                       ExprInt: self.eval_ExprInt,
@@ -215,6 +223,8 @@ class symbexec:
         return e
 
     def eval_expr(self, e, eval_cache=None):
+        if eval_cache is None:
+            eval_cache = {}
         r = e.visit(lambda x: self.eval_expr_visit(x, eval_cache))
         return r
 
@@ -319,6 +329,8 @@ class symbexec:
 
     # give mem stored overlapping requested mem ptr
     def get_mem_overlapping(self, e, eval_cache=None):
+        if eval_cache is None:
+            eval_cache = {}
         if not isinstance(e, ExprMem):
             raise ValueError('mem overlap bad arg')
         ov = []
@@ -346,7 +358,7 @@ class symbexec:
     def eval_ir_expr(self, exprs):
         pool_out = {}
 
-        eval_cache = {}
+        eval_cache = dict(self.symbols.items())
 
         for e in exprs:
             if not isinstance(e, ExprAff):
@@ -377,10 +389,10 @@ class symbexec:
         mem_dst = []
         # src_dst = [(x.src, x.dst) for x in ir]
         src_dst = self.eval_ir_expr(ir)
-
+        eval_cache = dict(self.symbols.items())
         for dst, src in src_dst:
             if isinstance(dst, ExprMem):
-                mem_overlap = self.get_mem_overlapping(dst)
+                mem_overlap = self.get_mem_overlapping(dst, eval_cache)
                 for _, base in mem_overlap:
                     diff_mem = self.substract_mems(base, dst)
                     del(self.symbols[base])
@@ -401,7 +413,8 @@ class symbexec:
             if step:
                 print '_' * 80
                 self.dump_id()
-        return self.eval_expr(self.ir_arch.IRDst)
+        eval_cache = dict(self.symbols.items())
+        return self.eval_expr(self.ir_arch.IRDst, eval_cache)
 
     def emul_ir_bloc(self, myir, ad, step = False):
         b = myir.get_bloc(ad)