| 24 | |
| 25 | |
| 26 | class VarNode(NetworkNode, Tensor): |
| 27 | _users = None |
| 28 | _owner = None |
| 29 | _name = None |
| 30 | _id = None |
| 31 | |
| 32 | def __new__(cls, var, *, owner_opr=None, name=None): |
| 33 | obj = Tensor.__new__(cls, var) |
| 34 | return obj |
| 35 | |
| 36 | def __init__(self, var, *, owner_opr=None, name=None): |
| 37 | self._owner = owner_opr |
| 38 | self.name = name |
| 39 | |
| 40 | @classmethod |
| 41 | def load(cls, sym_var, owner_opr): |
| 42 | obj = cls(sym_var) |
| 43 | obj.var = sym_var # mgb varnode |
| 44 | obj.name = sym_var.name |
| 45 | obj.owner = owner_opr |
| 46 | return obj |
| 47 | |
| 48 | @property |
| 49 | def users(self): |
| 50 | if self._users is None: |
| 51 | self._users = [] |
| 52 | return self._users |
| 53 | |
| 54 | @property |
| 55 | def owner(self): |
| 56 | return self._owner |
| 57 | |
| 58 | @owner.setter |
| 59 | def owner(self, owner): |
| 60 | self._owner = owner |
| 61 | |
| 62 | @property |
| 63 | def id(self): |
| 64 | if self._id is None: |
| 65 | self._id = id(self) |
| 66 | return self._id |
| 67 | |
| 68 | @property |
| 69 | def var(self): |
| 70 | return super().var() |
| 71 | |
| 72 | @var.setter |
| 73 | def var(self, var): |
| 74 | self._reset(var) |
| 75 | |
| 76 | def _reset(self, other): |
| 77 | if not isinstance(other, Tensor): |
| 78 | other = VarNode(other) |
| 79 | super()._reset(other) |
| 80 | self.owner = None |
| 81 | |
| 82 | def _reset_var(self, var): |
| 83 | origin_owner = self.owner |
no outgoing calls
no test coverage detected