diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-07-26 15:02:02 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-08-07 10:48:29 +0200 |
| commit | 26e36e96a7fa2c0b8178be53cf923111ca04f7d4 (patch) | |
| tree | e21e383681aecc0dc08f0c3e1a84dab543c8b91c /miasm2/core/objc.py | |
| parent | b2540d10b5e040cb959cc4637fc24ee48a0deb1b (diff) | |
| download | miasm-26e36e96a7fa2c0b8178be53cf923111ca04f7d4.tar.gz miasm-26e36e96a7fa2c0b8178be53cf923111ca04f7d4.zip | |
Objc: any Expr can be typed
Diffstat (limited to 'miasm2/core/objc.py')
| -rw-r--r-- | miasm2/core/objc.py | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/miasm2/core/objc.py b/miasm2/core/objc.py index de98993b..cd53c20f 100644 --- a/miasm2/core/objc.py +++ b/miasm2/core/objc.py @@ -721,11 +721,11 @@ class CTypeAnalyzer(ExprReducer): raise NotImplementedError("deref type %r" % base_type) return new_type - def reduce_id(self, node, _): - """Get type of ExprId""" - if not(isinstance(node.expr, ExprId) and node.expr.name in self.expr_types): - return None - return [self.expr_types[node.expr.name]] + def reduce_known_expr(self, node, _): + """Get type of a known expr""" + if node.expr in self.expr_types: + return [self.expr_types[node.expr]] + return None def reduce_int(self, node, _): """Get type of ExprInt""" @@ -808,7 +808,7 @@ class CTypeAnalyzer(ExprReducer): found.append(r_target) return found - reduction_rules = [reduce_id, reduce_int, + reduction_rules = [reduce_known_expr, reduce_int, reduce_ptr_plus_cst, reduce_cst_op_cst, reduce_deref, ] @@ -1001,16 +1001,12 @@ class ExprToAccessC(ExprReducer): raise NotImplementedError("deref type %r" % base_type) return new_type - def reduce_id(self, node, _): - """Generate access for ExprId""" - - if not (isinstance(node.expr, ExprId) and - node.expr.name in self.expr_types): - return None - - objcs = self.expr_types[node.expr.name] - out = [CGenId(objc, node.expr.name) for objc in objcs] - return out + def reduce_known_expr(self, node, _): + """Generate access for known expr""" + if node.expr in self.expr_types: + objcs = self.expr_types[node.expr] + return [CGenId(objc, str(node.expr)) for objc in objcs] + return None def reduce_int(self, node, _): """Generate access for ExprInt""" @@ -1059,11 +1055,6 @@ class ExprToAccessC(ExprReducer): if not isinstance(node.expr, ExprMem): return None - if node.expr in self.expr_types: - objcs = self.expr_types[node.expr] - out = [CGenId(objc, str(node.expr)) for objc in objcs] - return out - if node.arg.info is None: return None assert isinstance(node.arg.info, list) @@ -1093,7 +1084,7 @@ class ExprToAccessC(ExprReducer): return None return found - reduction_rules = [reduce_id, + reduction_rules = [reduce_known_expr, reduce_int, reduce_op, reduce_mem, @@ -1167,12 +1158,10 @@ class ExprCToExpr(ExprReducer): CST = "CST" - def reduce_id(self, node, _): - """Reduce ExprId""" - if not isinstance(node.expr, ExprId): - return None - if node.expr.name in self.expr_types: - objc = self.expr_types[node.expr.name] + def reduce_known_expr(self, node, _): + """Reduce known expressions""" + if str(node.expr) in self.expr_types: + objc = self.expr_types[str(node.expr)] out = (node.expr, objc) else: out = (node.expr, None) @@ -1343,7 +1332,7 @@ class ExprCToExpr(ExprReducer): out = (ExprMem(src, size), (src_type.objtype)) return out - reduction_rules = [reduce_id, + reduction_rules = [reduce_known_expr, reduce_int, reduce_op_memberof, reduce_op_field, |