about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2015-10-27 21:05:43 +0100
committerserpilliere <serpilliere@users.noreply.github.com>2015-10-27 21:05:43 +0100
commit6e0eb4f5eb8c53fc6002b955b96a5c06213d220f (patch)
treee3ce105169c00692f94e6570375c844b6e6f8771
parentd45b6bb1aea32dade164279d8557e6b794be0249 (diff)
parent4a38f06141188b2c14ef1defb273e8519f16de8d (diff)
downloadmiasm-6e0eb4f5eb8c53fc6002b955b96a5c06213d220f.tar.gz
miasm-6e0eb4f5eb8c53fc6002b955b96a5c06213d220f.zip
Merge pull request #241 from commial/fix-sembuiler
SemBuilder: fix recursive visit
-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),