Source code for curry.backends.py.graph.infotable

from .... import backends, common
import weakref

[docs] class DataType(object): def __init__(self, name, ctorinfos): self.name = name self._ctorinfos = tuple(ctorinfos) for ctorinfo in ctorinfos: assert ctorinfo.typedef is None ctorinfo.typedef = self @property def constructors(self): return self._ctorinfos
[docs] class InfoTable(object): ''' Runtime info for a node. Every Curry node stores an `InfoTable`` instance, which contains instance-independent data. ''' _fields_ = ['name', 'arity', 'tag', 'flags', 'step', 'typedef', 'pyformat'] def __init__(self, name, arity, tag, flags, step, pyformat): self.name = name self.arity = arity self.tag = tag self.flags = flags self._step = step # The type that this constructor belongs to. This is needed at runtime to # implement =:=, when a free variable must be bound to an HNF. It could be # improved to use just a runtime version of the typeinfo. self._typedef = None # PYTHON-SPECIFIC: # Describes the node format. It must have a ``format`` method, which will # be passed the node name followed by its rendered arguments. self.pyformat = pyformat def __str__(self): return 'Info for %r' % self.name def __repr__(self): show = lambda x: repr(x()) if isinstance(x, weakref.ref) else repr(x) return ''.join([ 'InfoTable(' , ', '.join( '%s=%s' % (field, show(getattr(self, field))) for field in self._fields_ ) , ')' ]) @property def typedef(self): return None if self._typedef is None else self._typedef() @typedef.setter def typedef(self, value): self._typedef = weakref.ref(value) @property def typetag(self): return self.flags & 0xf @property def step(self): if hasattr(self._step, 'materialize'): self._step = self._step.materialize() return self._step @step.setter def step(self, value): self._step = value @property def is_special(self): return self.flags & 0xf @property def is_primitive(self): return self.typetag in \ [common.F_INT_TYPE, common.F_CHAR_TYPE, common.F_FLOAT_TYPE] @property def is_int(self): return self.typetag == common.F_INT_TYPE @property def is_char(self): return self.typetag == common.F_CHAR_TYPE @property def is_float(self): return self.typetag == common.F_FLOAT_TYPE @property def is_bool(self): return self.typetag == common.F_BOOL_TYPE @property def is_list(self): return self.typetag == common.F_LIST_TYPE @property def is_tuple(self): return self.typetag == common.F_TUPLE_TYPE @property def is_io(self): return self.typetag == common.F_IO_TYPE @property def is_partial(self): return self.typetag == common.F_PARTIAL_TYPE @property def is_monadic(self): return self.flags & common.F_MONADIC @property def is_operator(self): return self.flags & common.F_OPERATOR
backends.InfoTable.register(InfoTable)