about summary refs log tree commit diff stats
path: root/miasm2/core/sembuilder.py
diff options
context:
space:
mode:
authorCamille Mougey <camille.mougey@cea.fr>2015-10-27 10:37:49 +0100
committerAjax <commial@gmail.com>2015-10-27 10:39:36 +0100
commit4a38f06141188b2c14ef1defb273e8519f16de8d (patch)
tree0691ca384fcecdc0fb415036ea042ef7a9928f85 /miasm2/core/sembuilder.py
parentfb32efb74e2dc1077586a2214de558db6940b70b (diff)
downloadmiasm-4a38f06141188b2c14ef1defb273e8519f16de8d.tar.gz
miasm-4a38f06141188b2c14ef1defb273e8519f16de8d.zip
SemBuilder: fix recursive visit
Diffstat (limited to 'miasm2/core/sembuilder.py')
-rw-r--r--miasm2/core/sembuilder.py18
1 files changed, 11 insertions, 7 deletions
diff --git a/miasm2/core/sembuilder.py b/miasm2/core/sembuilder.py
index 985a6a65..8be3fb12 100644
--- a/miasm2/core/sembuilder.py
+++ b/miasm2/core/sembuilder.py
@@ -23,10 +23,13 @@ class MiasmTransformer(ast.NodeTransformer):
     parse_mem = re.compile("^mem([0-9]+)$")
 
     # Visitors
-
     def visit_Call(self, node):
         """iX(Y) -> ExprIntX(Y),
         'X'(Y) -> ExprOp('X', Y), ('X' % Y)(Z) -> ExprOp('X' % Y, Z)"""
+
+        # Recursive visit
+        node = self.generic_visit(node)
+
         if isinstance(node.func, ast.Name):
             # iX(Y) -> ExprIntX(Y)
             fc_name = node.func.id
@@ -53,24 +56,21 @@ class MiasmTransformer(ast.NodeTransformer):
             # Do replacement
             node.func = ast.Name(id="ExprOp", ctx=ast.Load())
             node.args[0:0] = [op_name]
-            node.args = map(self.visit, node.args)
-
-        else:
-            # TODO: launch visitor on node
-            pass
 
         return node
 
     def visit_Subscript(self, node):
         """memX[Y] -> ExprMem(Y, X)"""
 
+        # Recursive visit
+        node = self.generic_visit(node)
+
         # Detect the syntax
         if not isinstance(node.value, ast.Name):
             return node
         name = node.value.id
         mem = self.parse_mem.search(name)
         if mem is None:
-            # TODO: launch visitor on node
             return node
 
         # Do replacement
@@ -82,6 +82,10 @@ class MiasmTransformer(ast.NodeTransformer):
 
     def visit_IfExp(self, node):
         """X if Y else Z -> ExprCond(Y, X, Z)"""
+        # Recursive visit
+        node = self.generic_visit(node)
+
+        # Build the new ExprCond
         call = ast.Call(func=ast.Name(id='ExprCond', ctx=ast.Load()),
                         args=[self.visit(node.test),
                               self.visit(node.body),