diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2016-12-16 15:03:53 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-12-16 15:03:53 +0100 |
| commit | 5f8ba4cb1b84d3af4ebed46c6a9b3120eb50233e (patch) | |
| tree | f5aaffbe8d92b38fa9260599c1bb5d3180356164 | |
| parent | 50661f59da48540a6d87ab5f42c41e761a9c11d8 (diff) | |
| parent | 40fefe35dd4cae1cecd63e3877cb0a91deb26bcc (diff) | |
| download | miasm-5f8ba4cb1b84d3af4ebed46c6a9b3120eb50233e.tar.gz miasm-5f8ba4cb1b84d3af4ebed46c6a9b3120eb50233e.zip | |
Merge pull request #456 from commial/feature/anyint
Feature/anyint
| -rw-r--r-- | miasm2/expression/expression.py | 2 | ||||
| -rw-r--r-- | miasm2/expression/modint.py | 35 | ||||
| -rw-r--r-- | test/expression/expression.py | 6 |
3 files changed, 31 insertions, 12 deletions
diff --git a/miasm2/expression/expression.py b/miasm2/expression/expression.py index 581dc8dc..f8af52d9 100644 --- a/miasm2/expression/expression.py +++ b/miasm2/expression/expression.py @@ -380,6 +380,8 @@ class ExprInt(Expr): if size is not None and num.size != size: raise RuntimeError("size must match modint size") elif size is not None: + if size not in mod_size2uint: + define_uint(size) self.__arg = mod_size2uint[size](num) self.__size = self.arg.size else: diff --git a/miasm2/expression/modint.py b/miasm2/expression/modint.py index 76896eb9..a801c948 100644 --- a/miasm2/expression/modint.py +++ b/miasm2/expression/modint.py @@ -198,25 +198,36 @@ mod_size2int = {} mod_uint2size = {} mod_int2size = {} +def define_int(size): + """Build the 'modint' instance corresponding to size @size""" + global mod_size2int, mod_int2size + + name = 'int%d' % size + cls = type(name, (modint,), {"size": size, "limit": 1 << size}) + globals()[name] = cls + mod_size2int[size] = cls + mod_int2size[cls] = size + return cls + +def define_uint(size): + """Build the 'moduint' instance corresponding to size @size""" + global mod_size2uint, mod_uint2size + + name = 'uint%d' % size + cls = type(name, (moduint,), {"size": size, "limit": 1 << size}) + globals()[name] = cls + mod_size2uint[size] = cls + mod_uint2size[cls] = size + return cls def define_common_int(): "Define common int: ExprInt1, ExprInt2, .." - global mod_size2int, mod_int2size, mod_size2uint, mod_uint2size - common_int = xrange(1, 257) for i in common_int: - name = 'uint%d' % i - c = type(name, (moduint,), {"size": i, "limit": 1 << i}) - globals()[name] = c - mod_size2uint[i] = c - mod_uint2size[c] = i + define_int(i) for i in common_int: - name = 'int%d' % i - c = type(name, (modint,), {"size": i, "limit": 1 << i}) - globals()[name] = c - mod_size2int[i] = c - mod_int2size[c] = i + define_uint(i) define_common_int() diff --git a/test/expression/expression.py b/test/expression/expression.py index 847ba7eb..58c0ca37 100644 --- a/test/expression/expression.py +++ b/test/expression/expression.py @@ -5,7 +5,13 @@ from pdb import pm from miasm2.expression.expression import * from miasm2.expression.expression_helper import * +# Expression comparison assert(ExprInt64(-1) != ExprInt64(-2)) +assert(ExprInt64(1) != ExprInt32(1)) + +# Expression size +big_cst = ExprInt(1, size=0x1000) +assert big_cst.size == 0x1000 # Possible values #- Common constants |