Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
Public Member Functions | Static Public Attributes | List of all members
miasm2.core.sembuilder.MiasmTransformer Class Reference
+ Inheritance diagram for miasm2.core.sembuilder.MiasmTransformer:
+ Collaboration diagram for miasm2.core.sembuilder.MiasmTransformer:

Public Member Functions

def visit_Call
 
def visit_Subscript
 
def visit_IfExp
 

Static Public Attributes

tuple parse_integer = re.compile("^i([0-9]+)$")
 
tuple parse_mem = re.compile("^mem([0-9]+)$")
 

Detailed Description

AST visitor translating DSL to Miasm expression

memX[Y]       -> ExprMem(Y, X)
iX(Y)         -> ExprIntX(Y)
X if Y else Z -> ExprCond(Y, X, Z)
'X'(Y)        -> ExprOp('X', Y)
('X' % Y)(Z)  -> ExprOp('X' % Y, Z)

Definition at line 11 of file sembuilder.py.

Member Function Documentation

def miasm2.core.sembuilder.MiasmTransformer.visit_Call (   self,
  node 
)
iX(Y) -> ExprIntX(Y),
'X'(Y) -> ExprOp('X', Y), ('X' % Y)(Z) -> ExprOp('X' % Y, Z)

Definition at line 26 of file sembuilder.py.

26 
27  def visit_Call(self, node):
28  """iX(Y) -> ExprIntX(Y),
29  'X'(Y) -> ExprOp('X', Y), ('X' % Y)(Z) -> ExprOp('X' % Y, Z)"""
30 
31  # Recursive visit
32  node = self.generic_visit(node)
33 
34  if isinstance(node.func, ast.Name):
35  # iX(Y) -> ExprIntX(Y)
36  fc_name = node.func.id
37 
38  # Match the function name
39  new_name = fc_name
40  integer = self.parse_integer.search(fc_name)
41 
42  # Do replacement
43  if integer is not None:
44  new_name = "ExprInt%s" % integer.groups()[0]
45 
46  # Replace in the node
47  node.func.id = new_name
48 
49  elif (isinstance(node.func, ast.Str) or
50  (isinstance(node.func, ast.BinOp) and
51  isinstance(node.func.op, ast.Mod) and
52  isinstance(node.func.left, ast.Str))):
53  # 'op'(args...) -> ExprOp('op', args...)
54  # ('op' % (fmt))(args...) -> ExprOp('op' % (fmt), args...)
55  op_name = node.func
56 
57  # Do replacement
58  node.func = ast.Name(id="ExprOp", ctx=ast.Load())
59  node.args[0:0] = [op_name]
60 
61  return node
def miasm2.core.sembuilder.MiasmTransformer.visit_IfExp (   self,
  node 
)
X if Y else Z -> ExprCond(Y, X, Z)

Definition at line 83 of file sembuilder.py.

83 
84  def visit_IfExp(self, node):
85  """X if Y else Z -> ExprCond(Y, X, Z)"""
86  # Recursive visit
87  node = self.generic_visit(node)
88 
89  # Build the new ExprCond
90  call = ast.Call(func=ast.Name(id='ExprCond', ctx=ast.Load()),
91  args=[self.visit(node.test),
92  self.visit(node.body),
93  self.visit(node.orelse)],
94  keywords=[], starargs=None, kwargs=None)
95  return call
96 

+ Here is the call graph for this function:

def miasm2.core.sembuilder.MiasmTransformer.visit_Subscript (   self,
  node 
)
memX[Y] -> ExprMem(Y, X)

Definition at line 62 of file sembuilder.py.

62 
63  def visit_Subscript(self, node):
64  """memX[Y] -> ExprMem(Y, X)"""
65 
66  # Recursive visit
67  node = self.generic_visit(node)
68 
69  # Detect the syntax
70  if not isinstance(node.value, ast.Name):
71  return node
72  name = node.value.id
73  mem = self.parse_mem.search(name)
74  if mem is None:
75  return node
76 
77  # Do replacement
78  addr = self.visit(node.slice.value)
79  call = ast.Call(func=ast.Name(id='ExprMem', ctx=ast.Load()),
80  args=[addr, ast.Num(n=int(mem.groups()[0]))],
81  keywords=[], starargs=None, kwargs=None)
82  return call

+ Here is the call graph for this function:

Member Data Documentation

tuple miasm2.core.sembuilder.MiasmTransformer.parse_integer = re.compile("^i([0-9]+)$")
static

Definition at line 22 of file sembuilder.py.

tuple miasm2.core.sembuilder.MiasmTransformer.parse_mem = re.compile("^mem([0-9]+)$")
static

Definition at line 23 of file sembuilder.py.


The documentation for this class was generated from the following file: