diff options
| author | J08nY | 2019-01-05 17:12:22 +0100 |
|---|---|---|
| committer | J08nY | 2019-03-21 11:00:14 +0100 |
| commit | 7b7ec1729030ededfb400967df082fa86ce3239f (patch) | |
| tree | 074c177b3776f21217d54624ac8f26ffe7b4e338 /pyecsca/ec/op.py | |
| parent | e016716968700950f9a92f14389d20f643365c5e (diff) | |
| download | pyecsca-7b7ec1729030ededfb400967df082fa86ce3239f.tar.gz pyecsca-7b7ec1729030ededfb400967df082fa86ce3239f.tar.zst pyecsca-7b7ec1729030ededfb400967df082fa86ce3239f.zip | |
Add Op class.
Diffstat (limited to 'pyecsca/ec/op.py')
| -rw-r--r-- | pyecsca/ec/op.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/pyecsca/ec/op.py b/pyecsca/ec/op.py new file mode 100644 index 0000000..b366617 --- /dev/null +++ b/pyecsca/ec/op.py @@ -0,0 +1,38 @@ +from ast import Module, walk, Name +from typing import FrozenSet + +from .mod import Mod + + +class Op(object): + result: str + parameters: FrozenSet[str] + variables: FrozenSet[str] + + def __call__(self, *args, **kwargs) -> Mod: + raise NotImplementedError + + +class CodeOp(Op): + code: Module + + def __init__(self, code: Module): + self.code = code + assign = code.body[0] + self.result = assign.targets[0].id + params = set() + variables = set() + for node in walk(assign.value): + if isinstance(node, Name): + name = node.id + if name.isupper(): + variables.add(name) + else: + params.add(name) + self.parameters = frozenset(params) + self.variables = frozenset(variables) + + def __call__(self, *args, **kwargs) -> Mod: + loc = dict(kwargs) + exec(compile(self.code, "", mode="exec"), {}, loc) + return loc[self.result] |
