diff options
| author | Camille Mougey <camille.mougey@cea.fr> | 2015-10-27 10:37:49 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2015-10-27 10:39:36 +0100 |
| commit | 4a38f06141188b2c14ef1defb273e8519f16de8d (patch) | |
| tree | 0691ca384fcecdc0fb415036ea042ef7a9928f85 /miasm2/core/sembuilder.py | |
| parent | fb32efb74e2dc1077586a2214de558db6940b70b (diff) | |
| download | miasm-4a38f06141188b2c14ef1defb273e8519f16de8d.tar.gz miasm-4a38f06141188b2c14ef1defb273e8519f16de8d.zip | |
SemBuilder: fix recursive visit
Diffstat (limited to 'miasm2/core/sembuilder.py')
| -rw-r--r-- | miasm2/core/sembuilder.py | 18 |
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), |