eurg start putting namespace-injection (GPR, MEM) in place
[soc.git] / src / soc / decoder / isa / caller.py
1 from functools import wraps
2
3 class ISACaller:
4 def __init__(self):
5 self.gpr = {} # TODO
6 self.mem = {} # TODO
7 self.namespace = {'GPR': self.gpr, 'MEM': self.mem}
8
9 def inject(context):
10 """ Decorator factory. """
11 def variable_injector(func):
12 @wraps(func)
13 def decorator(*args, **kwargs):
14 try:
15 func_globals = func.__globals__ # Python 2.6+
16 except AttributeError:
17 func_globals = func.func_globals # Earlier versions.
18
19 saved_values = func_globals.copy() # Shallow copy of dict.
20 func_globals.update(context)
21
22 result = func(*args, **kwargs)
23 #exec (func.__code__, func_globals)
24
25 #finally:
26 # func_globals = saved_values # Undo changes.
27
28 return result
29
30 return decorator
31
32 return variable_injector
33
34 if __name__ == '__main__':
35 d = {'1': 1}
36 namespace = {'a': 5, 'b': 3, 'd': d}
37
38 @inject(namespace)
39 def test():
40 print (globals())
41 print('a:', a)
42 print('b:', b)
43 print('d1:', d['1'])
44 d[2] = 5
45
46 return locals()
47
48 test()
49
50 print (namespace)