about summary refs log tree commit diff stats
path: root/miasm2/jitter/jitload.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter/jitload.py')
-rw-r--r--miasm2/jitter/jitload.py43
1 files changed, 40 insertions, 3 deletions
diff --git a/miasm2/jitter/jitload.py b/miasm2/jitter/jitload.py
index 525cda09..ccd0a35f 100644
--- a/miasm2/jitter/jitload.py
+++ b/miasm2/jitter/jitload.py
@@ -1,17 +1,22 @@
 #!/usr/bin/env python
 
+import logging
+from functools import wraps
+from collections import Sequence, namedtuple
+
 from miasm2.jitter.csts import *
 from miasm2.core.utils import *
 from miasm2.core.bin_stream import bin_stream_vm
 from miasm2.ir.ir2C import init_arch_C
 
-import logging
-
-log = logging.getLogger('jitload.py')
 hnd = logging.StreamHandler()
 hnd.setFormatter(logging.Formatter("[%(levelname)s]: %(message)s"))
+log = logging.getLogger('jitload.py')
 log.addHandler(hnd)
 log.setLevel(logging.CRITICAL)
+log_func = logging.getLogger('jit function call')
+log_func.addHandler(hnd)
+log_func.setLevel(logging.CRITICAL)
 
 try:
     from miasm2.jitter.jitcore_tcc import JitCore_Tcc
@@ -28,6 +33,38 @@ try:
 except ImportError:
     log.error('cannot import jit python')
 
+def named_arguments(func):
+    """Function decorator to allow the use of .func_args_*() methods
+    with either the number of arguments or the list of the argument
+    names.
+
+    The wrapper is also used to log the argument values.
+
+    @func: function
+
+    """
+    @wraps(func)
+    def newfunc(self, args):
+        if isinstance(args, Sequence):
+            ret_ad, arg_vals = func(self, len(args))
+            arg_vals = namedtuple("args", args)(*arg_vals)
+            # func_name(arguments) return address
+            log_func.info('%s(%s) ret addr: %s' % (
+                whoami(),
+                ', '.join("%s=0x%x" % (field, value)
+                          for field, value in arg_vals._asdict().iteritems()),
+                hex(ret_ad)))
+            return ret_ad, namedtuple("args", args)(*arg_vals)
+        else:
+            ret_ad, arg_vals = func(self, args)
+            # func_name(arguments) return address
+            log_func.info('%s(%s) ret addr: %s' % (
+                whoami(),
+                ', '.join(hex(arg) for arg in arg_vals),
+                hex(ret_ad)))
+            return ret_ad, arg_vals
+    return newfunc
+
 
 class CallbackHandler(object):