summaryrefslogtreecommitdiff
path: root/python/mediumlevelil.py
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2021-06-23 09:31:22 -0400
committerPeter LaFosse <peter@vector35.com>2021-09-05 10:08:09 -0400
commit6de4900db74a341fddfda46f7cb4342fdc31f8e0 (patch)
tree790a990b2b9ccd8229a31754d28a74a2db839851 /python/mediumlevelil.py
parentea052d32732f62000164f243a1aad0bb7425199e (diff)
Refactor Variable class
The Variable class is now broken into 3 separate classes with helper methods to convert between them. CoreVariable is implemented as a frozen dataclass and is analogous to BNVariable VariableNameAndType is analogous to BNVariableNameAndType Bothe the above are passive objects and can not be changed directly The new and improved Variable object is now an active object which can be operated on directly and changes will take effect immediately
Diffstat (limited to 'python/mediumlevelil.py')
-rw-r--r--python/mediumlevelil.py51
1 files changed, 12 insertions, 39 deletions
diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py
index 167930b6..53b5619e 100644
--- a/python/mediumlevelil.py
+++ b/python/mediumlevelil.py
@@ -629,10 +629,7 @@ class MediumLevelILInstruction(object):
return result
def get_ssa_var_possible_values(self, ssa_var:SSAVariable, options:List[DataFlowQueryOption]=[]):
- var_data = core.BNVariable()
- var_data.type = ssa_var.var.source_type
- var_data.index = ssa_var.var.index
- var_data.storage = ssa_var.var.storage
+ var_data = ssa_var.var.to_BNVariable()
option_array = (ctypes.c_int * len(options))()
idx = 0
for option in options:
@@ -645,25 +642,22 @@ class MediumLevelILInstruction(object):
return result
def get_ssa_var_version(self, var:variable.Variable) -> int:
- var_data = core.BNVariable()
- var_data.type = var.source_type
- var_data.index = var.index
- var_data.storage = var.storage
+ var_data = var.to_BNVariable()
return core.BNGetMediumLevelILSSAVarVersionAtILInstruction(self._function.handle, var_data, self._instr_index)
def get_var_for_reg(self, reg:'architecture.RegisterType') -> variable.Variable:
reg = self._function.arch.get_reg_index(reg)
result = core.BNGetMediumLevelILVariableForRegisterAtInstruction(self._function.handle, reg, self._instr_index)
- return variable.Variable(self._function.source_function, result.type, result.index, result.storage)
+ return variable.Variable.from_BNVariable(self._function.source_function, result)
def get_var_for_flag(self, flag:'architecture.FlagType') -> variable.Variable:
flag = self._function.arch.get_flag_index(flag)
result = core.BNGetMediumLevelILVariableForFlagAtInstruction(self._function.handle, flag, self._instr_index)
- return variable.Variable(self._function.source_function, result.type, result.index, result.storage)
+ return variable.Variable.from_BNVariable(self._function.source_function, result)
def get_var_for_stack_location(self, offset:int) -> variable.Variable:
result = core.BNGetMediumLevelILVariableForStackLocationAtInstruction(self._function.handle, offset, self._instr_index)
- return variable.Variable(self._function.source_function, result.type, result.index, result.storage)
+ return variable.Variable.from_BNVariable(self._function.source_function, result)
def get_reg_value(self, reg:'architecture.RegisterType') -> 'variable.RegisterValue':
reg = self._function.arch.get_reg_index(reg)
@@ -1113,10 +1107,7 @@ class MediumLevelILFunction(object):
return core.BNGetMediumLevelILNonSSAInstructionIndex(self.handle, instr)
def get_ssa_var_definition(self, ssa_var:SSAVariable) -> Optional[MediumLevelILInstruction]:
- var_data = core.BNVariable()
- var_data.type = ssa_var.var.source_type
- var_data.index = ssa_var.var.index
- var_data.storage = ssa_var.var.storage
+ var_data = ssa_var.var.to_BNVariable()
result = core.BNGetMediumLevelILSSAVarDefinition(self.handle, var_data, ssa_var.version)
if result >= core.BNGetMediumLevelILInstructionCount(self.handle):
return None
@@ -1130,10 +1121,7 @@ class MediumLevelILFunction(object):
def get_ssa_var_uses(self, ssa_var:SSAVariable) -> List[MediumLevelILInstruction]:
count = ctypes.c_ulonglong()
- var_data = core.BNVariable()
- var_data.type = ssa_var.var.source_type
- var_data.index = ssa_var.var.index
- var_data.storage = ssa_var.var.storage
+ var_data = ssa_var.var.to_BNVariable()
instrs = core.BNGetMediumLevelILSSAVarUses(self.handle, var_data, ssa_var.version, count)
assert instrs is not None, "core.BNGetMediumLevelILSSAVarUses returned None"
result = []
@@ -1160,18 +1148,12 @@ class MediumLevelILFunction(object):
:return: whether the variable is live at any point in the function
:rtype: bool
"""
- var_data = core.BNVariable()
- var_data.type = ssa_var.var.source_type
- var_data.index = ssa_var.var.index
- var_data.storage = ssa_var.var.storage
+ var_data = ssa_var.var.to_BNVariable()
return core.BNIsMediumLevelILSSAVarLive(self.handle, var_data, ssa_var.version)
def get_var_definitions(self, var:'variable.Variable') -> List[MediumLevelILInstruction]:
count = ctypes.c_ulonglong()
- var_data = core.BNVariable()
- var_data.type = var.source_type
- var_data.index = var.index
- var_data.storage = var.storage
+ var_data = var.to_BNVariable()
instrs = core.BNGetMediumLevelILVariableDefinitions(self.handle, var_data, count)
assert instrs is not None, "core.BNGetMediumLevelILVariableDefinitions returned None"
result = []
@@ -1182,10 +1164,7 @@ class MediumLevelILFunction(object):
def get_var_uses(self, var:'variable.Variable') -> List[MediumLevelILInstruction]:
count = ctypes.c_ulonglong()
- var_data = core.BNVariable()
- var_data.type = var.source_type
- var_data.index = var.index
- var_data.storage = var.storage
+ var_data = var.to_BNVariable()
instrs = core.BNGetMediumLevelILVariableDefinitions(self.handle, var_data, count)
assert instrs is not None, "core.BNGetMediumLevelILVariableDefinitions returned None"
result = []
@@ -1195,10 +1174,7 @@ class MediumLevelILFunction(object):
return result
count = ctypes.c_ulonglong()
- var_data = core.BNVariable()
- var_data.type = var.source_type
- var_data.index = var.index
- var_data.storage = var.storage
+ var_data = var.to_BNVariable()
instrs = core.BNGetMediumLevelILVariableUses(self.handle, var_data, count)
result = []
for i in range(0, count.value):
@@ -1207,10 +1183,7 @@ class MediumLevelILFunction(object):
return result
def get_ssa_var_value(self, ssa_var:SSAVariable) -> 'variable.RegisterValue':
- var_data = core.BNVariable()
- var_data.type = ssa_var.var.source_type
- var_data.index = ssa_var.var.index
- var_data.storage = ssa_var.var.storage
+ var_data = ssa_var.var.to_BNVariable()
value = core.BNGetMediumLevelILSSAVarValue(self.handle, var_data, ssa_var.version)
result = variable.RegisterValue(self._arch, value)
return result