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

Public Member Functions

def __init__
 
def is_var_identifier
 
def find_variables_rec
 
def vars
 
def equation
 
def __str__
 

Public Attributes

 var_indice
 
 var_asked
 
 var_prefix
 

Static Public Attributes

string is_var_ident = "is_var_ident"
 

Private Attributes

 _vars
 
 _equation
 
 _vars_ordered
 

Detailed Description

Identify variables in an expression.
Returns:
- variables with their corresponding values
- original expression with variables translated

Definition at line 206 of file expression_helper.py.

Constructor & Destructor Documentation

def miasm2.expression.expression_helper.Variables_Identifier.__init__ (   self,
  expr,
  var_prefix = "v" 
)
Set the expression @expr to handle and launch variable identification
process
@expr: Expr instance
@var_prefix: (optional) prefix of the variable name, default is 'v'

Definition at line 216 of file expression_helper.py.

217  def __init__(self, expr, var_prefix="v"):
218  """Set the expression @expr to handle and launch variable identification
219  process
220  @expr: Expr instance
221  @var_prefix: (optional) prefix of the variable name, default is 'v'"""
222 
223  # Init
224  self.var_indice = itertools.count()
225  self.var_asked = set()
226  self._vars = {} # VarID -> Expr
227  self.var_prefix = var_prefix
228 
229  # Launch recurrence
230  self.find_variables_rec(expr)
231 
232  # Compute inter-variable dependencies
233  has_change = True
234  while has_change:
235  has_change = False
236  for var_id, var_value in self._vars.iteritems():
237  cur = var_value
238 
239  # Do not replace with itself
240  to_replace = {v_val:v_id
241  for v_id, v_val in self._vars.iteritems()
242  if v_id != var_id}
243  var_value = var_value.replace_expr(to_replace)
244 
245  if cur != var_value:
246  # Force @self._vars update
247  has_change = True
248  self._vars[var_id] = var_value
249  break
250 
251  # Replace in the original equation
252  self._equation = expr.replace_expr({v_val: v_id for v_id, v_val
253  in self._vars.iteritems()})
254 
255  # Compute variables dependencies
256  self._vars_ordered = collections.OrderedDict()
257  todo = set(self._vars.iterkeys())
258  needs = {}
259 
260  ## Build initial needs
261  for var_id, var_expr in self._vars.iteritems():
262  ### Handle corner cases while using Variable Identifier on an
263  ### already computed equation
264  needs[var_id] = [var_name
265  for var_name in var_expr.get_r(mem_read=True)
266  if self.is_var_identifier(var_name) and \
267  var_name in todo and \
268  var_name != var_id]
269 
270  ## Build order list
271  while todo:
272  done = set()
273  for var_id in todo:
274  all_met = True
275  for need in needs[var_id]:
276  if need not in self._vars_ordered:
277  # A dependency is not met
278  all_met = False
279  break
280  if not all_met:
281  continue
282 
283  # All dependencies are already met, add current
284  self._vars_ordered[var_id] = self._vars[var_id]
285  done.add(var_id)
286 
287  # Update the todo list
288  for element_done in done:
289  todo.remove(element_done)

Member Function Documentation

def miasm2.expression.expression_helper.Variables_Identifier.__str__ (   self)

Definition at line 359 of file expression_helper.py.

360  def __str__(self):
361  "Display variables and final equation"
362  out = ""
363  for var_id, var_expr in self.vars.iteritems():
364  out += "%s = %s\n" % (var_id, var_expr)
365  out += "Final: %s" % self.equation
366  return out
367 

+ Here is the call graph for this function:

def miasm2.expression.expression_helper.Variables_Identifier.equation (   self)

Definition at line 356 of file expression_helper.py.

357  def equation(self):
358  return self._equation

+ Here is the caller graph for this function:

def miasm2.expression.expression_helper.Variables_Identifier.find_variables_rec (   self,
  expr 
)
Recursive method called by find_variable to expand @expr.
Set @var_names and @var_values.
This implementation is faster than an expression visitor because
we do not rebuild each expression.

Definition at line 299 of file expression_helper.py.

300  def find_variables_rec(self, expr):
301  """Recursive method called by find_variable to expand @expr.
302  Set @var_names and @var_values.
303  This implementation is faster than an expression visitor because
304  we do not rebuild each expression.
305  """
306 
307  if (expr in self.var_asked):
308  # Expr has already been asked
309 
310  if (expr not in self._vars.values()):
311  # Create var
312  identifier = m2_expr.ExprId("%s%s" % (self.var_prefix,
313  self.var_indice.next()),
314  size = expr.size)
315  setattr(identifier, self.__class__.is_var_ident, True)
316  self._vars[identifier] = expr
317 
318  # Recursion stop case
319  return
320  else:
321  # First time for @expr
322  self.var_asked.add(expr)
323 
324  if isinstance(expr, m2_expr.ExprOp):
325  for a in expr.args:
326  self.find_variables_rec(a)
327 
328  elif isinstance(expr, m2_expr.ExprInt):
329  pass
330 
331  elif isinstance(expr, m2_expr.ExprId):
332  pass
333 
334  elif isinstance(expr, m2_expr.ExprMem):
335  self.find_variables_rec(expr.arg)
336 
337  elif isinstance(expr, m2_expr.ExprCompose):
338  for a in expr.args:
339  self.find_variables_rec(list(a)[0])
340 
341  elif isinstance(expr, m2_expr.ExprSlice):
342  self.find_variables_rec(expr.arg)
343 
344  elif isinstance(expr, m2_expr.ExprCond):
345  self.find_variables_rec(expr.cond)
346  self.find_variables_rec(expr.src1)
347  self.find_variables_rec(expr.src2)
348 
349  else:
350  raise NotImplementedError("Type not handled: %s" % expr)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.expression.expression_helper.Variables_Identifier.is_var_identifier (   cls,
  expr 
)

Definition at line 291 of file expression_helper.py.

292  def is_var_identifier(cls, expr):
293  "Return True iff @expr is a variable identifier"
294  if not isinstance(expr, m2_expr.ExprId):
295  return False
296 
297  return hasattr(expr, cls.is_var_ident) and \
298  getattr(expr, cls.is_var_ident) == True
def miasm2.expression.expression_helper.Variables_Identifier.vars (   self)

Definition at line 352 of file expression_helper.py.

353  def vars(self):
354  return self._vars_ordered

Member Data Documentation

miasm2.expression.expression_helper.Variables_Identifier._equation
private

Definition at line 251 of file expression_helper.py.

miasm2.expression.expression_helper.Variables_Identifier._vars
private

Definition at line 225 of file expression_helper.py.

miasm2.expression.expression_helper.Variables_Identifier._vars_ordered
private

Definition at line 255 of file expression_helper.py.

string miasm2.expression.expression_helper.Variables_Identifier.is_var_ident = "is_var_ident"
static

Definition at line 214 of file expression_helper.py.

miasm2.expression.expression_helper.Variables_Identifier.var_asked

Definition at line 224 of file expression_helper.py.

miasm2.expression.expression_helper.Variables_Identifier.var_indice

Definition at line 223 of file expression_helper.py.

miasm2.expression.expression_helper.Variables_Identifier.var_prefix

Definition at line 226 of file expression_helper.py.


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